質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
HTML5

HTML5 (Hyper Text Markup Language、バージョン 5)は、マークアップ言語であるHTMLの第5版です。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

Laravel 5

Laravel 5は、PHPフレームワークLaravelの最新バージョンで、2014年11月に発表予定です。ディレクトリ構造がが現行版より大幅に変更されるほか、メソッドインジェクションやFormRequestの利用が可能になります。

Q&A

解決済

1回答

5889閲覧

「laravel」html5でのセレクトボックス連動がうまくいかずデータが取れません。

退会済みユーザー

退会済みユーザー

総合スコア0

HTML5

HTML5 (Hyper Text Markup Language、バージョン 5)は、マークアップ言語であるHTMLの第5版です。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

Laravel 5

Laravel 5は、PHPフレームワークLaravelの最新バージョンで、2014年11月に発表予定です。ディレクトリ構造がが現行版より大幅に変更されるほか、メソッドインジェクションやFormRequestの利用が可能になります。

0グッド

0クリップ

投稿2017/12/22 09:28

編集2017/12/23 01:38

###わからないこと
いつもお世話になっております。
この度html5特有のセレクトボックスでのデータの受け渡しについて処理がうまくいかないため、質問をさせていただきます。
下記のコードで職種を選択したら、詳細職種のセレクトボックスの中身が出力されるようにしたいのですが、うまくいきません。

<select name="jtype0" class="form-control input-sm inner-shadow js-parent-select" tabindex="1" data-target="#mobile-jtypeDetail" data-children="{{json_encode($item['jtype'], JSON_UNESCAPED_UNICODE)}}"> <option value="">職種</option> @foreach ($item['jtype'] as $jtype) <option value="{{$jtype['id']}}"{{isset($item['value']['jtype0']) && $item['value']['jtype0'] === $jtype['id'] ? ' selected' : ''}}>{{$jtype['name']}}</option> @endforeach </select> <select class="form-control input-sm inner-shadow" tabindex="1" id="mobile-jtypeDetail" name="jtype1" title="詳細職種"> <option value="">詳細職種</option> @if (isset($item['value']['jtype0']) && isset($item['jtype'][$item['value']['jtype0']])) @foreach ($item['jtype'][$jtype['id']]['children'] as $jDetail) <option value="{{$jDetail['id']}}"{{isset($item['value']['jtype']) && $item['value']['jtype'] === $jDetail['id'] ? ' selected' : ''}}>{{$jDetail['name']}}</option> @endforeach @endif </select>

js

1$(".js-parent-select").change(function(){ 2 var $select = $($(this).attr("data-target")).empty(); 3 $select.append('<option value="">'+$select.attr("title")+'</option>'); 4 var children = JSON.parse($(this).attr("data-children"))[$(this).val()]; 5 if (children) { 6 for (var i = 0; i < children.length; i++) { 7 $select.append($('<option value="'+children[i].id+'">').text(children[i].name)); 8 } 9 } 10});

下に変数の中身を書きます。

jsonエンコードした$item['jtype']の中身

{"48": {"id":48, "name":"介護", "children": [{"id":439,"name":"ヘルパー","checked":false}, {"id":440,"name":"介護士","checked":false}, {"id":441,"name":"マネジャー","checked":false}, {"id":442,"name":"生活相談","checked":false}, "49": {"id":49, "name":"会計事務", "children": [{"id":448,"name":"スタッフ","checked":false}, {"id":449,"name":"内勤のみ","checked":false}, {"id":450,"name":"巡回有り","checked":false}, {"id":451,"name":"税理士","checked":false}, "51": {"id":51, "name":"調理", "children": [{"id":459,"name":"調理師","checked":false}, {"id":460,"name":"栄養士","checked":false}, {"id":461,"name":"調理補助","checked":false}]}, "52": {"id":52, "name":"その他", "children": [{"id":2120,"name":"管理","checked":false}, {"id":527,"name":"一般事務","checked":false}, {"id":530,"name":"営業","checked":false}, {"id":463,"name":"技術者","checked":false}, ]}}

$item['jtype']の中身

48 => array ( 'id' => 48, 'name' => '介護', 'children' => array ( 0 => array ( 'id' => 439, 'name' => 'ヘルパー', 'checked' => false, ), 1 => array ( 'id' => 440, 'name' => '介護士', 'checked' => false, ), 2 => array ( 'id' => 441, 'name' => 'マネジャー', 'checked' => false, ), 3 => array ( 'id' => 442, 'name' => '生活相談', 'checked' => false, ), ), ), 49 => array ( 'id' => 49, 'name' => '会計事務', 'children' => array ( 0 => array ( 'id' => 448, 'name' => 'スタッフ', 'checked' => false, ), 1 => array ( 'id' => 449, 'name' => '内勤のみ', 'checked' => false, ), 2 => array ( 'id' => 450, 'name' => '巡回有り', 'checked' => false, ), 3 => array ( 'id' => 451, 'name' => '税理士', 'checked' => false, ), ), ), 51 => array ( 'id' => 51, 'name' => '調理', 'children' => array ( 0 => array ( 'id' => 459, 'name' => '調理師', 'checked' => false, ), 1 => array ( 'id' => 460, 'name' => '栄養士', 'checked' => false, ), 2 => array ( 'id' => 461, 'name' => '調理補助', 'checked' => false, ), ), ), 52 => array ( 'id' => 52, 'name' => 'その他', 'children' => array ( 0 => array ( 'id' => 2120, 'name' => '管理', 'checked' => false, ), 1 => array ( 'id' => 527, 'name' => '一般事務', 'checked' => false, ), 2 => array ( 'id' => 530, 'name' => '営業', 'checked' => false, ), 3 => array ( 'id' => 463, 'name' => '技術者', 'checked' => false, ), ), ), )

以上のようになっております。
職種にあたるセレクトボックスのいずれかを選択したら、それと連動して詳細職種のセレクトボックスが表示されるようにしたいです。

ご教授いただければ幸いです。

何卒よろしくお願いいたします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

aro10

2017/12/23 00:46

データが取れないのか、意図するJavascriptが反応しないのか、良い回答を得るにはもう少し問題範囲を局所化した方が良いかと思います
退会済みユーザー

退会済みユーザー

2017/12/23 01:37

ご指摘ありがとうございます。問題となっているのは、データがとれないことです。javascripについては、alertを入れて確認しました。
guest

回答1

0

ベストアンサー

質問文のJSONフォーマットが不正なので、データーは取れないと思うのですが、まずは、確認ポイントとしては、下記になるかと思います。

  1. JSON文字列のフォーマットは正しい?(JSONLintで確認しましょう)
  2. $item['jtype']の中にちゃんと連想配列が入っているか?(dd($item['jtype'])などで簡単に確認できます)
  3. JavaScriptは正しい?(console.log()で変数を確認します)

バグで困っている人によくあるのはソースが非常に見づらいです。私はソースが汚いと直ぐにわけわからなくなってしまいますので、できるだけいつもソースは綺麗にするようにしています。

下記、手元のLaravelで動かしてみたのでサンプルを載せておきます。
手元の環境ではBladeビューファイルにJSON文字列を直書きして試しました。

php

1@php 2$jtype = <<<EOS 3{ 4 "48": { 5 "id": 48, 6 "name": "介護", 7 "children": [{ 8 "id": 439, 9 "name": "ヘルパー", 10 "checked": false 11 }, 12 { 13 "id": 440, 14 "name": "介護士", 15 "checked": false 16 }, 17 { 18 "id": 441, 19 "name": "マネジャー", 20 "checked": false 21 }, 22 { 23 "id": 442, 24 "name": "生活相談", 25 "checked": false 26 } 27 ] 28 }, 29 "49": { 30 "id": 49, 31 "name": "会計事務", 32 "children": [{ 33 "id": 448, 34 "name": "スタッフ", 35 "checked": false 36 }, 37 { 38 "id": 449, 39 "name": "内勤のみ", 40 "checked": false 41 }, 42 { 43 "id": 450, 44 "name": "巡回有り", 45 "checked": false 46 }, 47 { 48 "id": 451, 49 "name": "税理士", 50 "checked": false 51 } 52 ] 53 }, 54 "51": { 55 "id": 51, 56 "name": "調理", 57 "children": [{ 58 "id": 459, 59 "name": "調理師", 60 "checked": false 61 }, 62 { 63 "id": 460, 64 "name": "栄養士", 65 "checked": false 66 }, 67 { 68 "id": 461, 69 "name": "調理補助", 70 "checked": false 71 } 72 ] 73 }, 74 "52": { 75 "id": 52, 76 "name": "その他", 77 "children": [{ 78 "id": 2120, 79 "name": "管理", 80 "checked": false 81 }, 82 { 83 "id": 527, 84 "name": "一般事務", 85 "checked": false 86 }, 87 { 88 "id": 530, 89 "name": "営業", 90 "checked": false 91 }, 92 { 93 "id": 463, 94 "name": "技術者", 95 "checked": false 96 } 97 ] 98 } 99} 100 101EOS; 102 103//JSON文字列から連想配列に変換 104$item['jtype'] = json_decode($jtype, true); 105@endphp

JavaScriptは、JSONをパースしたchildren変数にはさらにchildrenプロパティがあり、children.childrenとなっています。
console.log()で確認してみましょう。

js

1$(".js-parent-select").change(function(){ 2 var $select = $($(this).attr("data-target")).empty(); 3 $select.append('<option value="">'+$select.attr("title")+'</option>'); 4 5 var children = JSON.parse($(this).attr("data-children"))[$(this).val()]; 6 //console.log(children); 7 8 if (children) { 9 //↓↓追加↓↓ 10 children = children.children; 11 12 for (var i = 0; i < children.length; i++) { 13 $select.append($('<option value="'+children[i].id+'">').text(children[i].name)); 14 } 15 } 16});

セレクトボックスのHTML部分はそのままで大丈夫なようです。

php

1<select name="jtype0" class="form-control input-sm inner-shadow js-parent-select" tabindex="1" data-target="#mobile-jtypeDetail" data-children="{{json_encode($item['jtype'], JSON_UNESCAPED_UNICODE)}}"> 2 <option value="">職種</option> 3 <option value="48">介護</option> 4 <option value="49">会計事務</option> 5 <option value="51">調理</option> 6</select> 7<select class="form-control input-sm inner-shadow" tabindex="1" id="mobile-jtypeDetail" name="jtype1" title="詳細職種"> 8<option value="">詳細職種</option> 9</select>

実際のHTMLのdata-children属性は下記のようになります。

json

1{"48":{"id":48,"name":"介護","children":[{"id":439,"name":"ヘルパー","checked":false},{"id":440,"name":"介護士","checked":false},{"id":441,"name":"マネジャー","checked":false},{"id":442,"name":"生活相談","checked":false}]},"49":{"id":49,"name":"会計事務","children":[{"id":448,"name":"スタッフ","checked":false},{"id":449,"name":"内勤のみ","checked":false},{"id":450,"name":"巡回有り","checked":false},{"id":451,"name":"税理士","checked":false}]},"51":{"id":51,"name":"調理","children":[{"id":459,"name":"調理師","checked":false},{"id":460,"name":"栄養士","checked":false},{"id":461,"name":"調理補助","checked":false}]},"52":{"id":52,"name":"その他","children":[{"id":2120,"name":"管理","checked":false},{"id":527,"name":"一般事務","checked":false},{"id":530,"name":"営業","checked":false},{"id":463,"name":"技術者","checked":false}]}}

投稿2017/12/23 04:04

編集2017/12/23 04:07
Tomak

総合スコア1652

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2017/12/23 06:36

まさにchildrenが問題でした。 今後は確認ポイントを参考にしてやっていきます。 ありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問