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