Yii2 Вставить несколько записей одной таблицы

У меня есть модель с двумя полями Product.php:

[['ID_PRODUCT'], 'integer'],
[['NAME_PRODUCT'], 'string'],

мой контроллер ProductController.php:

public function actionCreate()
{
    $model = new Product();

    if ($model->load(Yii::$app->request->post()) && $model->save()) {
        return $this->redirect(['view', 'id' => $model->ID_PRODUCT]);
    } else {
        return $this->render('create', [
            'model' => $model,
        ]);
    }
}

И я хочу вставить много раз одну и ту же таблицу с ActiveForm:

<?php $form = ActiveForm::begin(); ?>

    <?= $form->field($model, 'ID_PRODUCT')->textInput(['maxlength' => true]) ?>

    <?= $form->field($model, 'NAME_PRODUCT')->textInput(['maxlength' => true]) ?>

    <?= $form->field($model, 'ID_PRODUCT')->textInput(['maxlength' => true]) ?>

    <?= $form->field($model, 'NAME_PRODUCT')->textInput(['maxlength' => true]) ?>

    <div class="form-group">
            <?= Html::submitButton($model->isNewRecord ? 'Create' : 'Update', ['class' => $model->isNewRecord ? 'btn btn-success' : 'btn btn-primary']) ?>
     </div>
<?php ActiveForm::end(); ?>

Но когда я сохраняю информацию, поля перезаписываются и вставляется только последняя запись


person mhplur    schedule 09.09.2015    source источник


Ответы (1)


То, что вы пытаетесь сделать, это собрать, проверить и сохранить табличные данные. Причина, по которой это не работает, заключается в том, что в форме Yii генерирует тег имени на основе имени поля и модели, например. name="[Product]["ID_PRODUCT"]. При отправке формы на сервер первые поля перезаписываются последними, так как они имеют одинаковое имя. Правильный способ сбора табличного ввода в форме — добавить скобки в конце имени, вот так; name="[1][Product]["ID_PRODUCT"].Используя этот метод, Yii предоставляет способы загрузки и проверки нескольких моделей.

Измените код вашего контроллера, чтобы использовать несколько моделей;

<?php

namespace app\controllers;

use Yii;
use yii\base\Model;
use yii\web\Controller;
use app\models\Product;

class ProductController extends Controller
{
    public function actionCreate(){

        //Find out how many products have been submitted by the form
        $count = count(Yii::$app->request->post('Product', []));

        //Send at least one model to the form
        $products = [new Product()];

        //Create an array of the products submitted
        for($i = 1; $i < $count; $i++) {
            $products[] = new Product();
        }

        //Load and validate the multiple models
        if (Model::loadMultiple($products, Yii::$app->request->post()) && Model::validateMultiple($products)) {

            foreach ($products as $product) {

                //Try to save the models. Validation is not needed as it's already been done.
                $product->save(false);

            }
            return $this->redirect('view');
        }

    return $this->render('create', ['products' => $products]);
    }
}

Теперь у вас есть все данные, необходимые для заполнения формы, включая любые сообщения об ошибках, сгенерированные для отдельных экземпляров вашей product модели. Файл представления для формы необходимо изменить таким образом, чтобы использовать несколько моделей;

foreach ($products as $index => $product) {
    echo $form->field($product, "[$index]ID_PRODUCT")->label($product->ID_PRODUCT);
    echo $form->field($product, "[$index]NAME_PRODUCT")->label($product->NAME_PRODUCT);
}

Все это описано в документации Yii2.

person Joe Miller    schedule 23.12.2015