0 follower

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

Буває, що іноді потрібно обробити дані, що вводяться користувачем, у пакетному режимі. Інакше кажучи, трапляються ситуації, коли користувач вводить дані для множини екземплярів моделі та відправляє їх на сервер всі разом. Будемо називати це табличним вводом (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>
<?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.

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

Found a typo or you think this page needs improvement?
Edit it on github !