yii2 - 多行从一种形式加载到相同的 table

yii2 - multiple rows load into same table from one form

我正在尝试一次在 table 多行上保存工作日的时间表... 我做错了,仍然给我错误。 我已经看到其他人的表格输入,但无法正确处理。 我真的需要一些其他的眼睛。

我遇到了与 https://phppedia.com/en/knowledge-base/32481399/yii2-insert-multiple-records-of-a-same-table

类似的问题

型号:

public
    function rules()
    {
        return [
            ['store_id', 'string'],
            ['day', 'string'],
            ['start_hour', 'string'],
            ['end_hour', 'string'],
            ['holiday','boolean'],
        ];
    }

控制器:

public function actionCreate()
    {
        $count = count(Yii::$app->request->post('Openhour', []));
        $model = [new Openhours()];
        for ($i = 1; $i < $count; $i++) {
            $model[] = new Openhours();
        }

        if ($model->loadMultiple($model, Yii::$app->request->post())) {
            foreach ($model as $model) {
               $model->save(false);
            }
        }

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

_表格

<?php $stores = Stores::getAll() ?>
<?php foreach ($stores as $store): ?>
    <?php if ($store->id !== 0): ?>
        <?php $listData[$store->id] = [$store->id => $store->title]; ?>
    <?php endif; ?>
<?php endforeach; ?>




<?php $form = ActiveForm::begin(['enableAjaxValidation' => true, 'options' => ['class' => 'model-form'],]); ?>
<?php foreach ($model as $index => $model): ?>


    <div class="row row-cols-3">
        <div class="col">
            <h5>
                <?php if ($store->title === Yii::$app->user->identity->username) : ?>
                    <?= $form->field($model, '[$index]store_id')->hiddenInput(['value' => $store->title])->label($store->title) ?>
                <?php else: ?>
                    <?= $form->field($model, '[$index]store_id')->dropDownList($listData, ['prompt' => 'Select...']); ?>
                <?php endif; ?>
            </h5>
        </div>
        <div class="col">Opening</div>
        <div class="col">Close</div>
    </div>


    <?php $days = Storedays::getAll() ?>
    <?php foreach ($days as $day): ?>

        <div class="row row-cols-3">
            <div class="col">
                <div class="row justify-content-between">
                    <div class="col">
                        <h6><?= $day->name ?></h6>
                        <?= $form->field($model, '[$index]day')->hiddenInput(['value' => $day->name, 'id' => 'day' . $day->id])->label(false) ?>
                    </div>
                    <div class="col">
                        <?= $form->field($model, '[$index]holiday')->checkbox(['selected' => $model->holiday, 'id' => 'holiday' . $day->id])->label(false) ?>
                    </div>
                </div>
            </div>
            <div class="col">
                <?= $form->field($model, '[$index]start_hour')->Input('text')->widget(TimePicker::class, ['options' => ['id' => 'start_hour' . $day->id], 'pluginOptions' => ['maxHours' => '8', 'template' => 'dropdown', 'showSeconds' => false, 'showMeridian' => false, 'minuteStep' => 15,]])->label(false) ?>
            </div>
            <div class="col">
                <?= $form->field($model, '[$index]end_hour')->Input('text')->widget(TimePicker::class, ['options' => ['id' => 'end_hour' . $day->id], 'pluginOptions' => ['maxHours' => '8', 'template' => 'dropdown', 'showSeconds' => false, 'showMeridian' => false, 'minuteStep' => 15,]])->label(false) ?>
            </div>
        </div>

    <?php endforeach; ?>

    <?php if (IS_ROOT) : ?><?= $form->field($model, '[$index]slug') ?><?php endif; ?>

    <?= Html::submitButton('save', ['class' => 'btn btn-primary']) ?>

    <hr class="mb-3">

<?php endforeach; ?>
<?php ActiveForm::end(); ?>

首先你有一个对象数组,你必须使用复数名称。

所以model变成了models

其次,您必须使用函数从请求 Model::loadMultiple($models) 加载多个模型并验证多个模型 Model::validateMultiple($models)

现在在您的控制器中:

public function actionCreate()
{
    $count = count(Yii::$app->request->post('Openhour', []));
    $models = [new Openhours()];
    for ($i = 1; $i < $count; $i++) {
        $models[] = new Openhours();
    }

    if (Model::loadMultiple($models, Yii::$app->request->post()) && Model::validateMultiple($models)) {
        foreach ($models as $model) {
            $model->save(false);
        }
    }

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

现在在您的 _form.php 中更改行:

<?php foreach ($model as $index => $model): ?>

收件人:

<?php foreach ($models as $index => $model): ?>