Бывает, что иногда требуется обработать данные, вводимые пользователем, в пакетном режиме. Иначе говоря, случаются ситуации, когда пользователь вводит данные для множества экземпляров модели и отправляет их на сервер все разом. Будем называть это табличным вводом (tabular input), поскольку поля ввода, как правило, организованы в виде таблицы.
Для работы с табличным вводом нам в первую очередь понадобится создать или заполнить массив, состоящий
из экземпляров модели данных, в зависимости от того, добавляем мы данные или обновляем. Затем мы извлекаем
данные из переменной $_POST
и присваиваем их каждой модели. В отличие от ввода данных для одной модели,
здесь используется $_POST['ModelClass'][$i]
вместо $_POST['ModelClass']
.
public function actionBatchUpdate()
{
// извлекаем элементы, которые будем обновлять в пакетном режиме,
// предполагая, что каждый элемент является экземпляром класса модели 'Item'
$items=$this->getItemsToUpdate();
if(isset($_POST['Item']))
{
$valid=true;
foreach($items as $i=>$item)
{
if(isset($_POST['Item'][$i]))
$item->attributes=$_POST['Item'][$i];
$valid=$valid && $item->validate();
}
if($valid) // все элементы корректны
// ...некоторая обработка
}
// отображаем представление с формой для ввода табличных данных
$this->render('batchUpdate',array('items'=>$items));
}
Когда действие готово, необходимо написать представление batchUpdate
таким образом, чтобы
отобразить все необходимые поля ввода в HTML таблице.
<div class="yiiForm"> echo CHtml::beginForm(); <table> <tr><th>Имя</th><th>Стоимость</th><th>Количество</th><th>Описание</th></tr> foreach($items as $i=>$item): <tr> <td> echo CHtml::activeTextField($item,"name[$i]"); </td> <td> echo CHtml::activeTextField($item,"price[$i]"); </td> <td> echo CHtml::activeTextField($item,"count[$i]"); </td> <td> echo CHtml::activeTextArea($item,"description[$i]"); </td> </tr> endforeach; </table> echo CHtml::submitButton('Сохранить'); echo CHtml::endForm(); </div><!-- yiiForm -->
Обратите внимание, что выше мы используем "name[$i]"
вместо "name"
в
качестве второго параметра при вызове метода CHtml::activeTextField.
В случае, если возникнет ошибка проверки данных, соответствующие поля ввода будут подсвечены автоматически, как и в случае работы с одной моделью, рассмотренном ранее.
Signup or Login in order to comment.