Проверка формы Yii2 - сравнение пароля повторяется только при заполнении поля пароля - PullRequest
0 голосов
/ 17 мая 2018

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

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

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

1 Ответ

0 голосов
/ 17 мая 2018

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

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 !== '';
            },
        ],
    ];
}
...