Изменение атрибута имени выпадающего списка CForm в Yii

Я использую Yii, и у меня небольшая проблема с выпадающими списками. В основном я использую CForm для отображения некоторых выпадающих меню курсов. Студент может выбрать до двух курсов, и для каждого выбора курса студент может выбрать 1-й вариант и второй. Требуется, чтобы каждый выбранный курс вводился отдельно в базу данных. Например, если студент хочет изучать 2 курса и хочет иметь 1-й и 2-й приоритетные курсы, они выбирают так:

  1. Первый курс - 1-й приоритет
  2. Первый курс - второй приоритет
  3. Курс второй - 1-й приоритет
  4. Курс второй - 2-й приоритет

Это поместит 4 новые строки в базу данных. Администраторы курсов хотят, чтобы это отображалось в виде 4 выпадающих меню, содержащих курсы.

В данный момент я тестирую только первый и второй приоритеты первого курса, но проблема в том, что первый курс - первый всегда пуст, если не выбрано значение для второго приоритета. Тогда приоритет один получает то же значение, что и приоритет два, даже если выбраны два разных курса. Я следовал этому уроку Form Builder, поскольку использую Wizard Behavior, который использует 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'
       )
   )
  );

Допустим, я выбрал 2 курса, один с идентификатором 15, а другой с идентификатором 86, когда я печатаю оба выпадающих меню, я получаю следующее:

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>

Таким образом, второе меню перезаписывает первое. Но как я могу это изменить? Если я изменяю 'course'=>array(.... в CForm для любой подчиненной формы, применимый раскрывающийся список не отображается. Я уже пытался добавить 'name'=>'course1' в форму, но это не имеет значения.

2 ответа

Просто чтобы ответить на мой собственный вопрос и закрыть его, так как он довольно старый, CForm не поддерживает табличный ввод и должен был бы быть расширен для достижения этого. Возможно, это не большая работа, но в конце я убедил руководство, что дизайн четырех выпадающих списков был ужасным.:-) Я выбрал более гибкий дизайн, показывающий сетку курсов во всплывающем окне, чтобы выбрать курсы, которые работают хорошо и менее запутаны для пользователя.

Любой, кто интересуется этим вопросом, может увидеть открытый номер здесь. Там есть ссылка для просмотра возможной реализации расширения CForm, хотя это было опубликовано в конце 2009 года.

Не могли бы вы просто установить имя элемента ввода второго приоритета?

'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'),
)
Другие вопросы по тегам