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

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

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

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

CodeIgniter

CodeIgniterは、PHP向けオープンソースのWebアプリケーションフレームワークです。CodeIgniterは覚える構文が少なく、自由度も高いため、PHPを理解していれば構築が簡単です。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

Q&A

解決済

1回答

5415閲覧

PHP コンボボックスを動的に変更

ta_ku0419

総合スコア13

PHP

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

CodeIgniter

CodeIgniterは、PHP向けオープンソースのWebアプリケーションフレームワークです。CodeIgniterは覚える構文が少なく、自由度も高いため、PHPを理解していれば構築が簡単です。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

0グッド

0クリップ

投稿2018/07/04 03:12

編集2018/07/04 05:12

当方、開発初心者なので、説明が未熟かもしれません。。。
PHPでWeb上で申請データを入力して承認依頼を出すシステムを作っています。
MVCモデルでjavascriptも併用しています。
フレームワークにはCodeIgniterを使っています。
あるコンボボックス(hoge)の値を他のコンボボックス(piyo)の値によって動的に変更させたいのですが、なかなかうまくいきません。

データはOracleから取得していますがModelは問題なく動きデータの取得を確認しています。

発生している問題・エラーメッセージ

コンボボックスpiyoの値が変更されてもコンボボックスhogeの値が変更されない。

該当のソースコード

view
piyoコンボボックス

PHP

1<dt class="l-np-form-cell-label-nowidth np-width-10per"> 2<label class="np-is-label-require" for="piyo">piyo</label> 3</dt> 4<dd class="l-np-form-cell-item np-width-15per"> 5<?php 6if (isset($msg['piyo'])) { 7echo form_dropdown('piyo', $piyoOptions, $piyo, 'class="np-select np-width-80per np-err-input-item" id="piyo" onchange="changepiyo();" tabindex="21"'); 8} else { 9echo form_dropdown('piyo', $piyoOptions, $piyo, 'class="np-select np-width-80per" id="piyo" onchange="changepiyo();" tabindex="21"'); 10} 11?> 12<?php if (isset($msg['piyo'])): ?> 13<span class="l-np-form-cell-item np-err-input-icon" style="display:inline;" onclick="showErrToolTip_INS('piyo','<?= $msg['piyo'] ?>')" ></span> 14<?php endif; ?> 15</dd>

hogeコンボボックス

PHP

1<dt class="l-np-form-cell-label-nowidth np-width-10per"> 2<label class="np-is-label-require" for="hoge">hoge</label> 3</dt> 4<dd class="l-np-form-cell-item np-width-20per"> 5<?php 6if (isset($msg['hoge'])) { 7echo form_dropdown('hoge', $hogeOptions, $hoge, 'class="np-select np-width-80per np-err-input-item" id="hoge" tabindex="20"'); 8} else { 9echo form_dropdown('hoge', $hogeOptions, $hoge, 'class="np-select np-width-80per" id="hoge" tabindex="20"'); 10} 11?> 12<?php if (isset($msg['hoge'])): ?> 13<span class="l-np-form-cell-item np-err-input-icon" style="display:inline;" onclick="showErrToolTip_INS('hoge','<?= $msg['hoge'] ?>')" ></span> 14<?php endif; ?> 15</dd> 16<dd class="l-np-form-cell-item"> 17</dd>

隠し項目

PHP

1<input type="hidden" id="URL_Piyo" name="URL_Piyo" value="/changepiyo">

javascript

1public function changepiyo{ 2 // URLの取得 3 var url = document.getElementById('URL_Piyo').value; 4 5 // リクエストデータの取得 6 var piyoKbn = document.getElementById('piyo'); 7 var piyo = piyoKbn.options[piyoKbn.selectedIndex].value; 8 9 // 連想配列にデータ格納→JSON形式に編集 10 var arry = {}; 11 arry.piyo = piyo; 12 var json = JSON.stringify(arry); 13 14 $.ajax({ 15 type: 'post', 16 url: url, 17 contentType: "Content-Type: application/json; charset=UTF-8", 18 data: json, 19 dataType: 'json', 20 async: false, 21 }) 22 23 .done( function( data, textStatus, jqXHR ) { 24 25 // 結果値取得 26 var cmb = data.cmb; 27 28 var elmCmb = document.getElementById('hoge'); 29 while (0 < elmCmb.childNodes.length) { 30 // コンボ設定値全件を削除 31 elmCmb.removeChild(elmCmb.childNodes[0]); 32 } 33 34 for (var i = 0; i < cmb.length; i++) { 35 // オプション要素を生成 36 var elmOpt = document.createElement('option'); 37 var key = cmb[i][0]; 38 var elmTxt = cmb[i][1]; 39 elmOpt.setAttribute('value', key); 40 elmOpt.innerHTML = elmTxt; 41 42 // オプション要素をコンボに設定 43 elmCmb.appendChild(elmOpt); 44 } 45 46 // コンボ選択値を初期位置に変更 47 elmCmb.selectedIndex = 0; 48 }) 49 .fail( function( jqXHR, textStatus, errorThrown ) { 50 if (document.getElementById('ENV_MODE').value == 'production') { 51 alert('再度操作をしてください。\nこのメッセージの表示が続く場合はログインし直してください。'); 52 } else { 53 alert('非同期通信に失敗しました。status=[' + textStatus + '|' + jqXHR.status + '], error=[' + errorThrown + ']'); 54 } 55 }) 56 ; 57 return false;

javascript

134行目 for (var i = 0; i < cmb.length; i++) { 2においてSCRIPT5007: 未定義または NULL 参照のプロパティ 'length' は取得できませんのエラー 3 4console.log(data);結果 5[object Object]{1: "グロス"}

controller

PHP

1 public function changepiyo() 2 { 3 // モデルロード 4 $this->load->model('Model'); 5 6 // リクエストデータの受信 7 $request = $this->recieveAjax(); 8 9 //hogeの値を取得 10 $response['cmb'] = $this->Model->getHoge($request['piyo']); 11 12 // レスポンスデータの送信 13 $this->sendAjax($response); 14 }

試したこと

データの流れは
onchangeによりjsのchangepiyo呼び出し、urlをAjaxで呼び出してcontrollerのchangepiyo呼び出し
という認識であっているでしょうか?

ここで約1週間ぐらいつまづいており、ほとんど手は出し尽くした感じです。
解答よろしくお願い致します。```ここに言語を入力
コード

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

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

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

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

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

yambejp

2018/07/04 03:28

コンボボックス自体のソースがありませんが、どうやってコンボボックスを実現しているのでしょうか?
m.ts10806

2018/07/04 03:55

プログラムコード(およびエラーメッセージ)は質問内容としては最も重要な部分であるため、見やすくしていただけると助かります。<code>ボタン押下→「コード」部分にコードを貼り付け→「ここに言語を入力」に対象言語名記入(エラーメッセージの場合は不要)の手順で「コードハイライト化」してください。(質問編集画面ではリアルタイムでプレビューが表示されるので見ながら調整してください)
m.ts10806

2018/07/04 04:34

#cmbNaiyo_Kbn というエレメントはどこにあるのでしょうか。 .done()で得られるdataは想定通りの内容なんですよね?
ta_ku0419

2018/07/04 04:39

mts10806さん cmbNaiyo_Kbn → hoge と置き換えてください .done()で得られるdataの値はまだ得られておらず想定通りのものかわかりません。
m.ts10806

2018/07/04 04:43

そもそも.done()側に入っているのでしょうか? 入っているならconsole.log(data);でないよう確認できるはずです。
ta_ku0419

2018/07/04 04:53

javascript 34行目 for (var i = 0; i < cmb.length; i++) { において 未定義または NULL 参照のプロパティ 'length' は取得できません エラーが出ました。
m.ts10806

2018/07/04 04:54

レスポンスにcmdと名前がついたデータがないからじゃないですか? console.log(data);で内容確認してください。その結果も質問に追記してください
ta_ku0419

2018/07/04 05:21

レスポンスにcmbを追加しました。追加したところdataが[object Object]{cmb: Object {...}} と表示されました。
m.ts10806

2018/07/04 05:28

$this->sendAjax() はJSON形式になるような処理をしているのでしょうか? dataType: 'json',としたからには返却する情報もjsonでなければなりません。
ta_ku0419

2018/07/04 05:39

mts10806さんの質問から自分なりに考えやってみた結果無事解決することができました。ぜひ、ベストアンサーに選ばせていただきたいので、適当でいいので回答していただけませんか?
m.ts10806

2018/07/04 05:42 編集

いえ、私は回答のために不足している情報を突っ込んでいるだけなので解決策までは頭に浮かんでいないのでは書けません。なぜならベストアンサーは特に同じ問題を抱えた人が後で見る最初の解決策だからです。teratailでは質問者自身で回答を書き「ベストアンサー」とすることで「自己解決」ができるようになっています。 https://teratail.com/help#resolve-myself 私が突っ込んだところは問題解決のための考え方として使える部分と思うので、今後の参考にしてください。
guest

回答1

0

自己解決

そもそもPHPでの連想配列が$array['rensou']に対しjavascriptの配列がarray.rensouであることを理解していませんでした。
そのため、javascript側でdata.cmbで受け取っているならばcontroller側では$response['cmb']で渡してあげる必要がありました。

投稿2018/07/04 05:46

ta_ku0419

総合スコア13

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.47%

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

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

質問する

関連した質問