mirror of
https://github.com/yiisoft/yii.git
synced 2026-03-06 08:14:21 +01:00
68 lines
3.6 KiB
Plaintext
68 lines
3.6 KiB
Plaintext
Обработка табличного ввода
|
||
==========================
|
||
|
||
Бывает, что иногда требуется обработать данные, вводимые пользователем, в пакетном режиме. Иначе говоря,
|
||
случаются ситуации, когда пользователь вводит данные для множества экземпляров модели и отправляет их
|
||
на сервер все разом. Будем называть это табличным вводом (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].
|
||
|
||
В случае, если возникают ошибки валидации, соответствующие поля ввода будут подсвечены автоматически,
|
||
как и в случае работы с одной моделью, рассмотренной ранее.
|
||
|
||
<div class="revision">$Id: form.table.txt 2783 2010-12-28 16:20:41Z qiang.xue $</div> |