我正在使用Yii而且我有一些下拉菜单问题。 基本上我正在使用CForm来显示课程的一些下拉菜单。学生可以选择最多两门课程,每个课程选择学生可以选择第一选择和第二选择。要求每个课程选择单独插入数据库。例如,学生想要学习2门课程并希望获得第1和第2优先课程,他们会选择这样的:
这将在数据库中放入4个新行。课程管理员希望将其显示为包含课程的4个下拉菜单。
目前,我正在测试当然只有第一和第二优先级,但问题是课程一 - 优先级一直是空的,除非为优先级二选择了一个值。然后优先级1获得与优先级2相同的值,即使选择了两个不同的课程。我一直在关注本教程Form Builder,因为我正在使用使用CForm构建表单的向导行为。
到目前为止,这是我的代码,仅涉及“课程一”:
这是来自控制器的相关代码的片段:
// 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'
)
)
);
所以我想说我选择了两门课程,一门编号为15,另一门编号为86,当我打印__()两个下拉列表时,我得到以下内容:
Array // Dropdown 1
(
[course] => 86
.... // other irrelevant attributes
)
Array // Dropdown 2
(
[course] => 86
.... // other irrelevant attributes
)
的更新 的
我一直在深入研究这个问题,当我看到萤火虫时,我发现两个下拉列表都有相同的名称:
<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>
所以第二个菜单会覆盖第一个菜单。但是我怎么能改变这个呢?如果我更改'course'=&gt;数组(在两个子表单的CForm中....,适用的下拉列表不会呈现。我已经尝试在表单中添加'name'=&gt;'course1'但它没有差。
答案 0 :(得分:0)
你能不能只设置第二优先级输入元素的名称?
'course' => array(
'label' => '2nd Priority',
'name' => 'course2',
'type' => 'dropdownlist',
'id' => 'c1p2',
'prompt' => 'Select 2nd Priority Course',
'items' => CHtml::listData(CoursePeriod::model()->with('course')->findAll("year = 2014"), 'id', 'course.course_name'),
)
答案 1 :(得分:0)
只是回答我自己的问题并关闭它,因为它现在很老了,CForm不支持表格输入,需要扩展才能实现这一点。可能不是一个大工作,但最后我说服管理层,四个下拉设计是可怕的。 :-)我选择了一个更加灵活的设计,在弹出窗口中显示一个网格视图,以便选择适合的课程,而且不会让用户感到困惑。
任何对此问题感兴趣的人都可以看到未解决的问题here.其中有一个链接可以查看扩展CForm的可能实现,尽管这是在2009年底发布的。