私は Yii を使用していますが、いくつかのドロップダウンに少し問題があります。基本的に、コースのドロップダウン メニューを表示するために CForm を使用しています。学生は最大 2 つのコースを選択でき、各コースの選択について、学生は第 1 希望と第 2 希望を選択できます。各コースの選択肢をデータベースに個別に挿入する必要があります。たとえば、学生が 2 つのコースを勉強したいと考えており、1 番目と 2 番目の優先コースを希望する場合、次のように選択します。
- コース 1 - 第 1 優先
- コース 1 - 第 2 優先
- コース 2 - 第 1 優先
- コース 2 - 第 2 優先
これにより、データベースに 4 つの新しい行が追加されます。コースの管理者は、これをコースを含む 4 つのドロップダウン メニューとして表示することを望んでいます。
現時点では、コース 1 の 1 番目と 2 番目の優先度だけでテストしていますが、問題はコース 1 です。優先度 2 の値が選択されていない限り、優先度 1 は常に空です。次に、2 つの異なるコースが選択されていても、優先度 1 は優先度 2 と同じ値を取得します。CForm を使用してフォームを作成する Wizard Behavior を使用しているため、このチュートリアルForm Builderに従っています。
これまでのところ、「コース1」のみを扱っているコードは次のとおりです。
これは、コントローラーからの関連コードのスニペットです。
// inside controller
$model = new CourseChoice();
$form = new CForm('application.views.wizard.ccForm', $model);
$form['courseOneP1']->model = new CourseChoice();
$form['courseOneP2']->model = new CourseChoice();
$c1p1 = $form['courseOneP1']->model;
$c1p2 = $form['courseOneP2']->model;
// Here I am just reading the attributes and exiting for testing
if ($form->submitted()&& $form->validate()) {
echo '<pre>';
print_r($c1p1->attributes);
print_r($c1p2->attributes);
echo '</pre>';
exit;
..........
そして、ここにccFormのフォームのコードがあります
return array(
'showErrorSummary' => true,
'title' => 'Course Choice 1',
'elements' => array(
// Course 1 - 1st Priority
'courseOneP1' => array(
'type' => 'form',
'elements' => array(
'course' => array(
'label' => '1st Priority',
'type' => 'dropdownlist',
'id' => 'c1p1',
'prompt' => 'Select 1st Priority Course',
'items' => CHtml::listData(CoursePeriod::model()->with('course')->findAll("year = 2014"), 'id', 'course.course_name'),
)
),
),
// Course 1 - 2nd Priority
'courseOneP2' => array(
'type' => 'form',
'elements' => array(
'course' => array(
'label' => '2nd Priority',
'type' => 'dropdownlist',
'id' => 'c1p2',
'prompt' => 'Select 2nd Priority Course',
'items' => CHtml::listData(CoursePeriod::model()->with('course')->findAll("year = 2014"), 'id', 'course.course_name'),
)
),
),
),
'buttons' => array(
'previous' => array(
'type' => 'submit',
'label' => 'Previous'
),
'submit' => array(
'type' => 'submit',
'label' => 'Next'
)
)
);
したがって、ID が 15 のコースと ID が 86 のコースの 2 つのコースを選択するとします。両方のドロップダウンを print_r() すると、次のようになります。
Array // Dropdown 1
(
[course] => 86
.... // other irrelevant attributes
)
Array // Dropdown 2
(
[course] => 86
.... // other irrelevant attributes
)
アップデート
これについてさらに調べてみたところ、firebug を見ると、両方のドロップダウンが同じ名前であることがわかりました。
<div class="row field_course">
<label for="c1p1">1st Priority</label>
<select id="c1p1" name="CourseChoice[course]">
</div>
<div class="row field_course">
<label for="c1p2">2nd Priority</label>
<select id="c1p2" name="CourseChoice[course]">
</div>
したがって、2 番目のメニューは最初のメニューを上書きしています。しかし、どうすればこれを変更できますか?いずれかのサブフォームの CForm で 'course'=>array(.... を変更すると、該当するドロップダウンがレンダリングされません。フォームに 'name'=>'course1' を追加しようとしましたが、違いはありません。