Compare Validator проверяет только один yii2

Я использую compareValidator в форме yii2.

Вот код

[['passwordConfirm'], 'compare', 'compareAttribute' => 'password'],

Он должен работать нормально, потому что его код также есть в документации.

Но происходит то, что он проверяет пароль только один раз.

Например, если я введу пароль и Подтвердить пароль один раз, он будет проверен нормально, но если я вернусь в поле пароль и изменю пароль, чем не сравнивает ввод подтвердить пароль с новым вводом пароль

У кого-нибудь еще такая же проблема??? или я тоже что-то не так сделал

Вот код model

 public function rules()
{
    return [
        ['username', 'filter', 'filter' => 'trim'],
        ['username', 'required'],  
        ['username', 'unique', 'targetClass' => '\common\models\User', 'message' => 'This username has already been taken.'],
        ['username', 'string', 'min' => 2, 'max' => 255],

        ['email', 'filter', 'filter' => 'trim'],
        ['email', 'required'],
        ['email', 'email'],
        ['email', 'string', 'max' => 255],
        ['email', 'unique', 'targetClass' => '\common\models\User', 'message' => 'This email address has already been taken.'],

        ['password', 'required'],
        ['password', 'string', 'min' => 6],

        [['passwordConfirm'], 'compare', 'compareAttribute' => 'password'],

    ];
}

public function attributeLabels()
{
    return [
        'passwordConfirm' => 'Confirm Password',
        'username' => 'Username',
        'email' => 'Email',
    ];
}

А вот код view

    <?php $form = ActiveForm::begin(['options'=>['enctype'=>'multipart/form-data']]); ?>

        <?= $form->field($model, 'username')->textInput( ['data-toggle' => 'tooltip',
            'data-placement' =>
                'right',
            'title' => 'Username should contain at least 6 characters'
        ]) ?>

        <?= $form->field($model, 'password')->passwordInput(['data-toggle' => 'tooltip',
            'data-placement' =>
                'right',
            'title' => 'Password should contain at least 6 characters',

        ]) ?>

        <?= $form->field($model, 'passwordConfirm')->passwordInput() ?>

        <?= $form->field($model, 'email') ?>

    <?php ActiveForm::end(); ?>

Спасибо


person Mike Ross    schedule 18.09.2015    source источник
comment
Вы можете опубликовать свою модель, форму и код действия контроллера?   -  person GAMITG    schedule 18.09.2015
comment
У меня такая же проблема. и именно поэтому я хочу попробовать пользовательскую проверку, но она не работает на внешнем интерфейсе. Я пытался использовать проверку when вместе с compare, но ничего не работает.   -  person BlackSkull    schedule 29.09.2015


Ответы (1)


Это ожидаемое поведение. Валидатор привязан к атрибуту passwordConfirm и поэтому срабатывает при изменении этого атрибута. Конкретное действие зависит от того, как установлены свойства validateOnChange, validateOnBlur и validateOnType элемента ActiveField.

Однако вся форма должна пройти повторную проверку перед отправкой, поэтому вы увидите ошибку, если вернетесь и измените поле password.

Если вам абсолютно необходимо включить проверку в описанном вами сценарии, вы можете либо добавить еще один валидатор compare к атрибуту password в бэкэнде, либо добавить вызов для проверки атрибута passwordCompare при изменении вашего поля password во внешнем интерфейсе.

Однако я предлагаю вам придерживаться исходной реализации, потому что в конечном итоге форма будет проверена, если не на внешнем интерфейсе, то на бэкэнде.

person Beowulfenator    schedule 18.09.2015