Проверка формы Yii2 - сравнивать повтор пароля только после заполнения поля пароля

Моя форма проверки использует следующие правила:

[['password', 'password_repeat'], 'required'],
['password_repeat', 'compare', 'compareAttribute' => 'password', 'message' => "Passwords don't match"],

Как написать правила для password_repeat сравнить это с password только если пользователь заполнит password поле. Если пользователь пропустит password, подтверждение для password_repeat следует также пропустить.

1 ответ

Решение

Вы можете использовать сценарии для этого:

public function rules() {
    return [
        [['username', 'password'], 'required', 'on' => self::SCENARIO_LOGIN],
        [['username', 'password', 'password_repeat'], 'required', 'on' => self::SCENARIO_REGISTER],
        [
            'password_repeat', 'compare', 'compareAttribute' => 'password',
            'message' => "Passwords don't match", 'on' => self::SCENARIO_REGISTER,
        ],
    ];
}

Это позволяет устанавливать разные правила для разных форм (разные поля, необходимые для входа и регистрации).

Вы также можете рассмотреть возможность создания разных моделей для разных форм с собственными rules(), лайк LoginForm а также RegisterForm, Это на самом деле более чистое решение и дает больше контроля.


РЕДАКТИРОВАТЬ

Для условных правил вы должны использовать when имущество:

public function rules() {
    return [
        [['password', 'password_repeat'], 'string'],
        [
            'password_repeat', 'compare', 'compareAttribute' => 'password',
            'message' => "Passwords don't match", 'skipOnEmpty' => false,
            'when' => function ($model) {
                return $model->password !== null && $model->password !== '';
            },
        ],
    ];
}
Другие вопросы по тегам