Как валидировать поля в зависимости от выбора check box Yii2?

Вопрос, как можно валидировать разные поля в зависимости от выбранного checkbox
$model = Payment::find()->where(['user_id' => $id])->one();
            $model->pre_auth_payment = "$28.25";
            $model->scenario = "credit_card_form";

            if ($model->load(Yii::$app->request->post()) && $model->validate()) {

                if($model->pre_auth_payment == 0)
                    $model->scenario = "credit_card_form";
                else
                    $model->scenario = "bank_account_form";
                $model->save();

               return $this->redirect(['update', 'id' => $model->user_id, 'step'=> 3]);
            } else {
                return $this->render('update', [
                    'model' => $model,
                    'step'=>$step
                ]);
            }

Я делаю так, но так как $model->scenario = "credit_card_form"; стоит сразу, оно вторую форму уже не хочет валидировать с $model->scenario = "bank_account_form";

Так тоже не работает
[['user_id', 'payment_method', 'credit_card_number', 'credit_card_expr', 'credit_card_cvv', 'credit_card_info','type_pay'], 'required', 'when' => function($model) {
                return $model->type_pay == 0;
            }],
            [[ 'pre_auth_payment', 'day_month', 'transit_number', 'institution_id', 'account_num'], 'required',  'when' => function($model) {
                return $model->type_pay == 1;
            }],
<code>
  • Вопрос задан
  • 1964 просмотра
Решения вопроса 1
xr0m3oz
@xr0m3oz Автор вопроса
Общими усилиями в чате Yii получилось такое решение.

public function rules()
    {
        return [
            [['user_id', 'payment_method', 'credit_card_number', 'credit_card_expr', 'credit_card_cvv', 'credit_card_info','type_pay'], 'required', 'when' => function($model) {
                return $model->type_pay == 0;
            },'whenClient' => "function (attribute, value) {
                return $('input[name=\"Payment[type_pay]\"]:checked').val() == 0;
            }"],
            [[ 'pre_auth_payment', 'day_month', 'transit_number', 'institution_id', 'account_num'], 'required',  'when' => function($model) {
                return $model->type_pay == 1;
            },'whenClient' => "function (attribute, value) {
                return $('input[name=\"Payment[type_pay]\"]:checked').val() == 1;
            }"],

            [['user_id'], 'integer'],
            [['type_pay'], 'required'],
            [['payment_method', 'credit_card_number', 'credit_card_expr', 'credit_card_cvv', 'credit_card_info', 'pre_auth_payment', 'day_month', 'transit_number', 'institution_id', 'account_num'], 'string', 'max' => 255]
        ];
    }
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 2
SamDark
@SamDark
Yii2 core team
$model = Payment::find()->where(['user_id' => $id])->one();
$model->pre_auth_payment = "$28.25";

if ($model->load(Yii::$app->request->post()) {
    $model->scenario = empty($model->type_pay) ? 'credit_card_form' : 'bank_account_form';
    if ($model->validate()) {
        // valid
    }
}
Ответ написан
kdes70
@kdes70
Web developer
Можно сделать две отдельные модели с нужными набором полей
Ответ написан
Комментировать
Ваш ответ на вопрос

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

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