Изменение атрибута имени выпадающего списка CForm в Yii
Я использую Yii, и у меня небольшая проблема с выпадающими списками. В основном я использую CForm для отображения некоторых выпадающих меню курсов. Студент может выбрать до двух курсов, и для каждого выбора курса студент может выбрать 1-й вариант и второй. Требуется, чтобы каждый выбранный курс вводился отдельно в базу данных. Например, если студент хочет изучать 2 курса и хочет иметь 1-й и 2-й приоритетные курсы, они выбирают так:
- Первый курс - 1-й приоритет
- Первый курс - второй приоритет
- Курс второй - 1-й приоритет
- Курс второй - 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'),
)