Оглавление

Начало Основы Работа с формами Работа с БД Кэширование Расширение Yii Тестирование Специальные темы
Зачем реклама?

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

Иногда нам может потребоваться обрабатывать данные, вводимые пользователем, в пакетном режиме. Иначе говоря, случаются ситуации, когда пользователь вводит данные для множества экземпляров модели и отправляет их на сервер все разом. Будем называть это табличным вводом (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=$item->validate() && $valid;
        }
        if(
$valid)  // все элементы корректны
            // …некоторая обработка
    
}
    
// отображаем представление с формой для ввода табличных данных
    
$this->render('batchUpdate',array('items'=>$items));
}

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

<div class="form">
<?
php 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,"[$i]name"); ?></td>
<td> echo CHtml::activeTextField($item,"[$i]price"); ?></td>
<td> echo CHtml::activeTextField($item,"[$i]count"); ?></td>
<td> echo CHtml::activeTextArea($item,"[$i]description"); ?></td>
</tr>
 endforeach; ?>
</table>

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

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

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


Зачем реклама?