Как создать форму для вставки и обновления действия для связанной модели в Yii2? - PullRequest
0 голосов
/ 02 сентября 2018

У меня есть две модели: S, Sp. В модели Sp существует отношение hasOne() с S.

В SpController у меня есть два действия, insert и update, а именно:

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

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

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

и

public function actionUpdate($id)
{
    $model = $this->findModel($id);

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

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

В sp/views/_form.php у меня есть поле, связанное с S, например:

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

Он отлично работает в действии обновления из-за отношения, но выдает ошибку, которой не существует s на <?= $form->field($model->s, 'name')->textInput(['maxlength' => true]) ?> в действии создания.

Как связать name поле в действии создания?

Ответы [ 2 ]

0 голосов
/ 02 сентября 2018

Я думаю, что правильным способом достижения вашей цели является создание FormModel, имеющего все необходимые вам атрибуты (в данном случае «имя» объекта S), и использовать его в представлении, что-то вроде:

$form->field($formModel, 'sName')->textInput(['maxlength' => true]) ?>

0 голосов
/ 02 сентября 2018

Если вы хотите использовать модель из отношения таким образом, вам нужно создать ее вручную. Не забудьте сохранить данные из модели S.

public function actionCreate() {
    $model = new Sp();
    $model->populateRelation('s', new S());

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

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

Но вам стоит подумать о создании выделенной модели формы, а не использовать Active Record напрямую. Это сделает просмотр и управление намного проще.

...