我正在使用Yii内置的比较验证器来比较两个表单属性:
<div class="row ">
<?php echo $form->labelEx($model, 'newPassword', array('class'=>'control-label'));?>
<?php echo $form->passwordField($model, 'newPassword',array('class'=>'span5','maxlength'=>100)); ?>
<?php echo $form->error($model, 'newPassword'); ?>
</div>
<div class="row">
<?php echo $form->labelEx($model, 'confirmPassword', array('class'=>'control-label'));?>
<?php echo $form->passwordField($model, 'confirmPassword',array('class'=>'span5','maxlength'=>100)); ?>
<?php echo $form->error($model, 'confirmPassword'); ?>
</div>
遵守规则:
array('newPassword', 'length', 'max'=>100,'min'=>6),
array('newPassword', 'compare', 'compareAttribute'=>'username','operator'=>'!=', 'message'=>'Password must not be the same as username'),
array('newPassword', 'compare', 'compareAttribute'=>'confirmPassword','message'=>'Please enter the same password twice'),
array('confirmPassword', 'safe'),
当我第一次输入newPassword时,验证将触发并显示“输入相同”错误消息。如果我然后正确输入confirmPassword,它不会隐藏。如果我然后更改confirmPassword,然后更改newPassword以匹配。,则会隐藏错误。它只在我更改newPassword字段时才起作用 - 所以我必须向后填写表单才能正确隐藏错误。
我错过了什么吗?
[edit]我可以强制验证在具有compareAttribute规则的字段上触发,方法是使用JavaScript暂时清空字段的值,触发验证,然后重新应用之前的值并再次触发验证。虽然看起来有些疯狂。
答案 0 :(得分:2)
我猜你正在使用客户端验证?
我认为这不符合您的要求的原因是当您更改newPassword字段以外的字段时,不会触发newPassword的规则。
不幸的是,当你改变另一个字段时,我不确定如何在一个字段上触发验证,尽管看起来你问that question before。 Jon的答案似乎建议你可以在javascript的onchange中使用$.fn.yiiactiveform.updateInput
来触发验证?
答案 1 :(得分:-2)
设置运算符
array('newPassword', 'compare', 'compareAttribute'=>'confirmPassword','operator'=>'==' ,'message'=>'Please enter the same password twice'),**strong text**