Зміст

Початок Основи Робота з формами Робота з БД Кешування Розширення 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.

У випадку, якщо виникають помилки валідації, відповідні поля вводу будуть підсвічені автоматично, як і у випадку роботи з однією моделлю, розглянутою раніше.


Для чого реклама?