やりたいこと
動的にoptionの内容が変化するセレクトボックスを用意し、POST送信されても選択された値を保持したいです。開発環境はFuelPHP(1.8.2)です。
試したこと
次の動画で具体例を示します。選択した「種類」によって「食品」に表示する項目が動的に変化するようにしています。
確認ボタンでPOST送信したあと、PHPで項目を設定した「種類」フィールドの値は保持できました。一方、javaScriptで項目を設定した「食品」フィールドは値が保持できません(バナナを保持したいのに、にんじんに初期化されてしまいます)。
現在の方針と懸念事項
「種類」フィールドの内容は固定するためPHP処理で内容を設定しています。一方、「食品」フィールドは「種類」が変更されたことを検知して内容を変えたいため、javaScriptで制御しようと考えました。
しかし、「食品」の値をjavaScriptで定義し、POST送信された時にフォームをrepopulate()
するという流れでは、「食品」の値を保持するのが難しいのかもしれないと感じています。
質問(相談)
POST送信された後も選択された値を保持するためには、どのように実装すれば良いでしょうか?
具体的な方法ではなくとも、大まかな流れについてのご意見や、上述の方針に対するご指摘をいただけると助かります。
コード
コントローラ
php
1<?php 2 3class Controller_Home extends Controller 4{ 5 public function action_index() 6 { 7 // 条件入力フォームを作成 8 $form = Fieldset::forge('sample'); 9 10 // 種類を選択するセレクトボックス 11 $opts = array('1' => '1:野菜', '2' => '2:果物'); 12 $form->add('type', '種類', array('type' => 'select')) 13 ->set_options($opts); 14 15 // 種類によって内容が変わるセレクトボックス 16 $form->add('food', '食品', array('type' => 'select')); 17 18 $form->add('submit', '', array('type' => 'submit', 'value' => '確認')); 19 20 if (Input::method() === 'POST') 21 { 22 $form->repopulate(); 23 } 24 25 // ビューを生成 26 $view = View::forge('home'); 27 $view->set_global('form', $form->build(''), false); 28 return $view; 29 } 30}
ビュー
php
1<?php echo $form; ?> 2 3<?php echo Asset::js('jquery.min.js'); ?> 4<?php echo Asset::js('main.js'); ?>
javaScript
javascript
1$(function(){ 2 // 初期処理 3 if($('#form_food').val() === null){ 4 set_options('1'); // 空の場合は野菜のoptionを設定 5 } 6 7 // 種類フィールドが変更された時の処理 8 $('#form_type').change(function(){ 9 var type = $(this).val(); // 1:野菜、2:果物 10 11 // 食品フィールド(セレクトボックス)のoptionをクリア 12 $('#form_food').children().remove(); 13 14 // 選択された種類によって、食品フィールドのoptionを設定 15 set_options(type); 16 }); 17}); 18 19function set_options(type) 20{ 21 if(type === '1'){ // 野菜が選択された場合 22 $('#form_food').append($('<option>').val('1').text('1:にんじん')); 23 $('#form_food').append($('<option>').val('2').text('2:玉ねぎ')); 24 $('#form_food').append($('<option>').val('3').text('3:じゃがいも')); 25 }else{ // 果物が選択された場合 26 $('#form_food').append($('<option>').val('4').text('4:りんご')); 27 $('#form_food').append($('<option>').val('5').text('5:バナナ')); 28 $('#form_food').append($('<option>').val('6').text('6:オレンジ')); 29 } 30}
質問
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2019/12/21 02:33