Проверка формы 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 !== '';
},
],
];
}