比较Validator只验证一个yii2
Compare Validator validates only one yii2
我在 yii2 表单中使用 compareValidator。
这是代码
[['passwordConfirm'], 'compare', 'compareAttribute' => 'password'],
它应该可以正常工作,因为它也是文档中的代码
但是发生的事情是它只验证密码一次。
例如,如果我输入 密码 和 确认密码 一旦它验证正常但如果我回到 password 字段并更改密码而不是比较 confirm password input 与新 password input
还有其他人遇到同样的问题吗???
或者我这里也做错了
这是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(); ?>
谢谢
这是预期的行为。验证器附加到 passwordConfirm
属性,因此在该属性更改时触发。具体操作取决于如何设置 ActiveField
的 validateOnChange
、validateOnBlur
和 validateOnType
属性。
但是,整个表单在提交之前应该重新验证,因此如果您返回并更改 password
字段,您将看到错误。
如果您确实需要在您描述的场景中启用验证,您可以将另一个 compare
验证器添加到后端的 password
属性,或者添加一个调用来验证 passwordCompare
当您的 password
字段在前端更改时的属性。
不过我建议您坚持原来的实现方式,因为表单最终会得到验证,如果不是在前端,那么在后端。
我在 yii2 表单中使用 compareValidator。
这是代码
[['passwordConfirm'], 'compare', 'compareAttribute' => 'password'],
它应该可以正常工作,因为它也是文档中的代码
但是发生的事情是它只验证密码一次。
例如,如果我输入 密码 和 确认密码 一旦它验证正常但如果我回到 password 字段并更改密码而不是比较 confirm password input 与新 password input
还有其他人遇到同样的问题吗??? 或者我这里也做错了
这是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(); ?>
谢谢
这是预期的行为。验证器附加到 passwordConfirm
属性,因此在该属性更改时触发。具体操作取决于如何设置 ActiveField
的 validateOnChange
、validateOnBlur
和 validateOnType
属性。
但是,整个表单在提交之前应该重新验证,因此如果您返回并更改 password
字段,您将看到错误。
如果您确实需要在您描述的场景中启用验证,您可以将另一个 compare
验证器添加到后端的 password
属性,或者添加一个调用来验证 passwordCompare
当您的 password
字段在前端更改时的属性。
不过我建议您坚持原来的实现方式,因为表单最终会得到验证,如果不是在前端,那么在后端。