Зачастую перед разработчиками встает задача реализации пакетного ввода данных для пользователя. Нужно предоставить пользователю возможность создания нескольких сущностей одной модели и сохранения их разом. Чаще всего для реализации подобной задачи используется 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 -->