Yii2: Табличный ввод

Зачастую перед разработчиками встает задача реализации пакетного ввода данных для пользователя. Нужно предоставить пользователю возможность создания нескольких сущностей одной модели и сохранения их разом. Чаще всего для реализации подобной задачи используется html-таблица, отсюда и название: табличный ввод.

Вариант 1

Использовать готовые решения, например TabularForm widget.

Вариант 2

Запилить собственную реализацию табличного ввода в Yii 2.0.

Для организации табличного ввода, сначала мы должны создать или получить массив сущностей модели. Затем мы получаем введенные данные из переменной $_POST и сохраняем их отдельными сущностями в модель. Единственное отличие от работы с одной сущностью в том, что мы получаем данные из $_POST[‘КлассМодели’][$i] а не из $_POST[‘КлассМодели’], и используем  loadMultiple() и validateMultiple() для получения и валидации сущностей.

Контроллер пакетного обновления

use yii\base\Model;
public function actionBatchUpdate()
{
    // retrieve items to be updated in a batch mode
    // assuming each item is of model class 'Item'
    $items=$this->getItemsToUpdate();
    if (Model::loadMultiple($items, Yii::$app->request->post()) &&
        Model::validateMultiple($items)) {
        $count = 0;
        foreach ($items as $item) {
           // populate and save records for each model
            if ($item->save()) {
                // do something here after saving
                $count++;
            }
        }
        Yii::$app->session->setFlash('success', "Processed {$count} records successfully.");
        return $this->redirect(['index']); // redirect to your next desired page
    } else {
        return $this->render('update', [
            'items' => $items,
        ]);
    }
}

Пример представления

<div class="form">
    <?php $form = ActiveForm::begin(); ?>
    <table>
        <tr><th>Имя</th><th>Цена</th><th>Количество</th><th>Описание</th></tr>
        <?php foreach($items as $i=>$item): ?>
            <tr>
                <td><?= $form->field($item,"[$i]name"); ?></td>
                <td><?= $form->field($item,"[$i]price"); ?></td>
                <td><?= $form->field($item,"[$i]count"); ?></td>
                <td><?= $form->field($item,"[$i]description"); ?></td>
            </tr>
        <?php endforeach; ?>
    </table>
    <?= Html::submitButton('Сохранить'); ?>
    <?php ActiveForm::end(); ?>
</div><!-- form -->

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *