@hollanditkzn

Как реализовать валидация одной формы для двух моделей?

В форме у меня находится 2 модели связанных, первая модель нормально валидирует, а вторая вообще не валидирует и можно сохранить пустое поле, что недопустимо.
Вот код models/client
class Client extends \yii\db\ActiveRecord
{
    const SCENARIO_DEFAULT = 'default';
    const SCENARIO_CREATE = 'create';
public static function tableName()
    {
        return 'client';
    }

    public function scenarios()
    {
        return [
            self::SCENARIO_DEFAULT => ['id', 'fio', 'phone', 'emaail', 'home','street', 'apartment'],
            self::SCENARIO_CREATE => ['id'],
        ];
    }
public function rules()
    {
        return [
            [['id'], 'required', 'on' => self::SCENARIO_CREATE],
            [['fio', 'phone'], 'required', 'on' => self::SCENARIO_DEFAULT],
            ...
        ];
    }

В моделе models/zakaz
public function getIdClient()
    {
        return $this->hasOne(Client::className(), ['id' => 'id_client']);
    }

В контроллере controllers/ZakazController
public function actionUpdate($id)
    {
        $model = $this->findModel($id);
        $client = new Client();
        $client->scenario = Client::SCENARIO_CREATE;

        if ($model->load(Yii::$app->request->post())) {
            $model->id_client = ArrayHelper::getValue(Yii::$app->request->post('Client'), 'id');
            }
            $model->validate();
            if (!$model->save()) {
                Yii::$app->session->addFlash('errors', 'Произошла ошибка');
                print_r($model->getErrors());
            } else {
                $model->save();
                Yii::$app->session->addFlash('update', 'Успешно отредактирован заказ');
            }
        }

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

И во вьюшке views/update
<div class="col-xs-12">
<?= $form->field($model, 'name')->textInput(['placeholder' => 'Имя клиента', 'class' => 'inputForm'])->label(false) ?>
            <?php !$model->isNewRecord ? $client->id = $model->id_client : null ?>
            <?php if (Yii::$app->request->get('phone')) {
                echo $form->field($client, 'id')->widget(Select2::className(), [
                    'data' => [Yii::$app->request->get('phone')],
                    'disabled' => true,
                ])->label(false);
            } else {
                echo $form->field($client, 'id')->widget(Select2::className(), [
                    'data' => ArrayHelper::map(Client::find()->all(), 'id', 'phone', 'fio'),
                    'options' => ['placeholder' => 'Введите номер телефона'],
                ])->label(false);
            }?>
        </div>
  • Вопрос задан
  • 72 просмотра
Решения вопроса 1
webinar
@webinar Куратор тега Yii
Учим yii: https://youtu.be/-WRMlGHLgRg
В Вашем контролере вообще нет сохранения $client. Нет сохранения - нет валидации.
Вот документация по работе с несколькими моделями:
www.yiiframework.com/doc-2.0/guide-input-multiple-...
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы