0

我正在使用 Yii,但我在一些下拉菜单中遇到了一些问题。基本上我使用 CForm 来显示一些课程的下拉菜单。学生最多可以选择两门课程,对于每个课程选择,学生可以选择第一选择和第二选择。要求将每个课程选择单独插入数据库。例如,如果学生想要学习 2 门课程并想要拥有第一和第二优先课程,他们会这样选择:

  1. 课程一 - 第一优先
  2. 课程一 - 第二优先
  3. 课程二 - 第一优先
  4. 课程二 - 第二优先级

这会将 4 个新行放入数据库中。课程管理员希望将其显示为包含课程的 4 个下拉菜单。

目前,我只使用第一和第二优先级进行测试,但问题是课程一 - 优先级一始终为空,除非为优先级二选择了一个值。然后,即使选择了两个不同的课程,优先级 1 也会获得与优先级 2 相同的值。我一直在关注本教程表单生成器,因为我正在使用使用 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'
       )
   )
  );

所以假设我选择了两门课程,一门 id 为 15,另一门 id 为 86,当我 print_r() 两个下拉菜单时,我得到以下信息:

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>

所以第二个菜单覆盖了第一个。但是我该如何改变呢?如果我在 CForm 中为任一子表单更改 'course'=>array(....

4

2 回答 2

0

只是为了回答我自己的问题并关闭它,因为它现在已经很老了,CForm 不支持表格输入,需要扩展才能实现这一点。可能不是什么大工作,但最后我说服了管理层,四个下拉菜单的设计很糟糕。:-) 我采用了更灵活的设计,在弹出窗口中显示课程的网格视图来选择课程,而不是效果很好并且对用户来说不太混乱。

任何对此问题感兴趣的人都可以在此处查看未解决的问题。那里有一个链接可以查看扩展 CForm 的可能实现,尽管这是在 2009 年底发布的。

于 2014-04-09T00:38:25.780 回答
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'),
)
于 2013-10-23T14:22:04.563 回答