Обработка табличного ввода
==========================

Иногда нам может потребоваться обрабатывать данные, вводимые пользователем, в пакетном режиме. Иначе говоря,
случаются ситуации, когда пользователь вводит данные для множества экземпляров модели и отправляет их
на сервер все разом. Будем называть это табличным вводом (tabular input), поскольку поля ввода, как
правило, организованы в виде таблицы.

Для работы с табличным вводом нам, в первую очередь, понадобится создать или заполнить массив, состоящий
из экземпляров модели данных, в зависимости от того, добавляем мы данные или обновляем. Затем мы извлекаем
данные из переменной `$_POST` и присваиваем их каждой модели. В отличие от ввода данных для одной модели,
здесь для присваивания значений атрибутам мы будем использовать `$_POST['ModelClass'][$i]` вместо `$_POST['ModelClass']`.

~~~
[php]
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=$item->validate() && $valid;
		}
		if($valid)  // все элементы корректны
			// …некоторая обработка
	}
	// отображаем представление с формой для ввода табличных данных
	$this->render('batchUpdate',array('items'=>$items));
}
~~~

Когда действие готово, необходимо создать представление `batchUpdate` таким образом, чтобы
отобразить все необходимые поля ввода в HTML таблице:

~~~
[php]
<div class="form">
<?php echo CHtml::beginForm(); ?>
<table>
<tr><th>Имя</th><th>Стоимость</th><th>Количество</th><th>Описание</th></tr>
<?php foreach($items as $i=>$item): ?>
<tr>
<td><?php echo CHtml::activeTextField($item,"[$i]name"); ?></td>
<td><?php echo CHtml::activeTextField($item,"[$i]price"); ?></td>
<td><?php echo CHtml::activeTextField($item,"[$i]count"); ?></td>
<td><?php echo CHtml::activeTextArea($item,"[$i]description"); ?></td>
</tr>
<?php endforeach; ?>
</table>

<?php echo CHtml::submitButton('Сохранить'); ?>
<?php echo CHtml::endForm(); ?>
</div><!-- form -->
~~~

Обратите внимание, что выше мы используем `"[$i]name"` вместо `"name"` в
качестве второго параметра при вызове метода [CHtml::activeTextField].

В случае если возникают ошибки валидации, соответствующие поля ввода будут подсвечены автоматически,
как и в случае работы с одной моделью, рассмотренной ранее.