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

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

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

CakePHPは、PHPで書かれたWebアプリケーション開発用のフレームワークです。 Ruby on Railsの考え方を多く取り入れており、Railsの高速性とPHPの機動性を兼ね備えています。 MVCやORMなどを「規約優先の考え方」で利用するため、コードを書く手間を省くことができます。 外部のライブラリに依存しないので、単体での利用が可能です。

jQuery

jQueryは、JavaScriptライブラリのひとつです。 簡単な記述で、JavaScriptコードを実行できるように設計されています。 2006年1月に、ジョン・レシグが発表しました。 jQueryは独特の記述法を用いており、機能のほとんどは「$関数」や「jQueryオブジェクト」のメソッドとして定義されています。

Q&A

解決済

1回答

4994閲覧

cakephp3 動的セレクトボックスが正しく表示されません。

lovelydai

総合スコア38

CakePHP

CakePHPは、PHPで書かれたWebアプリケーション開発用のフレームワークです。 Ruby on Railsの考え方を多く取り入れており、Railsの高速性とPHPの機動性を兼ね備えています。 MVCやORMなどを「規約優先の考え方」で利用するため、コードを書く手間を省くことができます。 外部のライブラリに依存しないので、単体での利用が可能です。

jQuery

jQueryは、JavaScriptライブラリのひとつです。 簡単な記述で、JavaScriptコードを実行できるように設計されています。 2006年1月に、ジョン・レシグが発表しました。 jQueryは独特の記述法を用いており、機能のほとんどは「$関数」や「jQueryオブジェクト」のメソッドとして定義されています。

0グッド

2クリップ

投稿2017/10/31 05:09

編集2017/11/01 08:45

こんにちは、時間割システムを作っている初心者です。

やりたいのは、学部セレクトボックスを選択するとその学部に属している学科をDBから読み取り、セレクトボックスに表示したいです。

以下のページを参照して試してみました。
https://qiita.com/katsuakikon/items/7a8fcaf85b342cb61bcc

ソースコードは以下のようです。

PHP

1 2//ParticipantController.phpの中に次のようなFunctionを定義しました。 3 4 public function getOptions($id = null) 5 { 6 $this->autoRender = false; 7 $this->viewBuilder()->setLayout(false); 8 9 $courses = $this->Participant->Course->getOptions($id); // アソシエーションされてます。 10 $this->set('courses',$courses); 11 }

PHP

1 public function getOptions($id = null) 2 { 3 // デフォルト値 4 $result = ["" => "選択してください"]; 5 6 if(!empty($id)) 7 { 8 $result = $this->find('list', ['keyField' => 'course_idx', 'valueField' => 'course_name']) 9 ->where(['section_idx' => $id]) 10 ->andWhere(['is_used' => 1]) 11 //->toArray(); 12 } 13 return $result; 14 }

HTML

1 <div class="form-group"> 2  <div class="col-lg-12"> 3 <?= $this->Form->label('学部'); ?> 4 <?php 5 echo $this->Form->select('section_idx', 6 ['options' => $sections], 7 ['empty' => '(学部を選択してください。)','class'=>'form-group','id' => "section_idx"]); 8 ?> 9 </div> 10 </div> 11 12 <div class="form-group"> 13 <div class="col-lg-12"> 14 <?= $this->Form->label('学科'); ?> 15 <?php 16 if(isset($courses)) 17 { 18 echo $this->Form->select('course_idx', 19 ['options' => $courses], 20 ['empty' => '(学科を選択してください。)','class'=>'form-group','id' => "course_idx"] 21 ); 22 } 23 else 24 { 25  echo $this->Form->select('course_idx', 26 ['options' => ''], 27 ['empty' => '(学科を選択してください。)','class'=>'form-group','id' => "course_idx"] 28 ); 29 } 30 ?> 31 </div> 32 </div> 33 34<script> 35$("#section_idx").bind("change keyup", function() { 36 var id = $("#section_idx").val(); 37 $("#course_idx").load( "./getOptions/"+id); 38}); 39</script> 40

すると、学部セレクトボックスが変わると学科セレクトボックスには動きはありますが、データが何も表示されません。セレクトボックスを押してみるとスクリーンショットのように開かれます。(下に何かありそうですが下が切れてしまいます。)
イメージ説明
DebugToolBarのHistory(XHRのGet)で確認すると、成功的にSQLも実行され、$coursesの値も問題なく入っていますが、実行後のページには$coursesもなく、何も表示されません。
何が問題なのかぜんぜん気が付かないし、データは問題なく値に入ったので表示させたいのですが上手くできませんでした。
何かアドバイスいただければと思います。
よろしくお願いいたします。

「追加」Logに残っているWarningメッセージがありました。以下のようです。
2017-11-01 11:47:21 Notice: Notice (8): Object of class Cake\ORM\Query could not be converted to int in [D:\Bitnami\wampstack-7.1.7-0\apache2\htdocs\djks\trunk\src\Model\Table\CourseTable.php, line 166]
Request URL: /participant/getOptions/4
Referer URL: http://localhost:8765/participant/add

017-11-01 11:47:21 Error: [Error] Unsupported operand types in D:\Bitnami\wampstack-7.1.7-0\apache2\htdocs\djks\trunk\src\Model\Table\CourseTable.php on line 166
Request URL: /participant/getOptions/4
Referer URL: http://localhost:8765/participant/add

「追加」上の2つのエラーを解決しましたが、まだ表示されません。

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

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

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

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

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

guest

回答1

0

自己解決

また自己解決しました。

Controller側で<option>~</option>タグの形でそのまま($this->set()無しで)ビューに投げてビューではJQueryのLoadで表示するという形で何とかなりました。

PHP

1// ParticipantController.phpの中 2public function getOptions($id = null) 3 { 4 $this->autoRender = false; 5 $this->viewBuilder()->setLayout(false); 6 7 8 $courses = $this->Participant->Course->getOptions($id); 9 10 if($courses) 11 { 12 echo "<option>(学科を選択してください。)</option>"; 13 foreach($courses as $key => $value) 14 { 15 $key = '"'. $key .'"'; 16 echo "<option value=$key>$value</option>"; 17 } 18 } 19 else { 20 echo "<option>(学科を選択してください。)</option>"; 21 } 22 23 }

HTML

1// add.ctpやedit.ctpの中、結局に空っぽのチェックボックスを作るだけになる。 2<?php 3 if(isset($courses)) 4 { 5 echo $this->Form->input('course_idx', 6 ['empty' => '(学科を選択してください。)','class'=>'form-group','id' => 'course_idx', 'label' => false] 7 ); 8 } 9 else 10 { 11 echo $this->Form->select('course_idx', 12 ['options' => ''], 13 ['empty' => '(学科を選択してください。)','class'=>'form-group','id' => 'course_idx', 'label' => false] 14 ); 15 } 16?>

Javascript

1// add.ctpやedit.ctpの中 2<script> 3// 修正の時にページがローディングされたら、学科セレクトボックスをDBの値で初期化しチェック状態にする。 4$(function(){ 5 $('#section_idx').ready(function() { 6 var id = $('#section_idx').val(); 7 $('#course_idx').load('../getOptions/'+id,(function(){ 8 var idx = <?php echo json_encode(h($participant->course_idx), JSON_HEX_TAG | JSON_HEX_AMP | JSON_HEX_APOS | JSON_HEX_QUOT); ?>; 9 $('#course_idx').val(idx); 10 })); 11 }); 12}); 13// 学部セレクトボックスを変更すると学科セレクトボックスを更新する。 14$(function(){ 15 $('#section_idx').bind('change keyup', function() { 16 var id = $('#section_idx').val(); 17 $('#course_idx').load('../getOptions/'+id); 18 }); 19}); 20</script>

投稿2017/11/02 08:03

lovelydai

総合スコア38

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問