Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/273.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/kubernetes/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php Yii比较密码仅适用于一个字段_Php_Validation_Yii - Fatal编程技术网

Php Yii比较密码仅适用于一个字段

Php Yii比较密码仅适用于一个字段,php,validation,yii,Php,Validation,Yii,我使用Yii的内置比较验证器来比较两个表单属性: <div class="row "> <?php echo $form->labelEx($model, 'newPassword', array('class'=>'control-label'));?> <?php echo $form->passwordField($model, 'newPassword',array('class'=>'span5','maxlength'=>1

我使用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>
当我第一次键入新密码时,将触发验证并显示“输入相同”错误消息。如果我随后正确输入confirmPassword,它不会隐藏。如果我随后更改confirmPassword,然后将newPassword更改为match.,则错误将隐藏。它似乎只有在我更改newPassword字段时才起作用,因此我必须向后填写表单,以便正确隐藏错误

我错过什么了吗


[编辑]我可以使用JavaScript临时清空字段值,触发验证,然后重新应用以前的值并再次触发验证,从而强制在具有compareAttribute规则的字段上触发验证。不过似乎有点疯狂。

我猜您使用的是客户端验证

我认为,之所以不能像您所希望的那样工作,是因为在更改newPassword字段之外的字段时,不会触发newPassword规则

不幸的是,当您更改了另一个字段时,我不知道如何在一个字段上触发验证,尽管看起来像是您要求的。Jon的回答似乎建议您可以在javascript中使用onchange来触发验证?

设置运算符

array('newPassword', 'compare', 'compareAttribute'=>'confirmPassword','operator'=>'==' ,'message'=>'Please enter the same password twice'),**strong text**

谢谢-我真的不想在已经存在自定义验证器的情况下编写自定义验证器来完成这项工作。在上一个问题中,我已经解决了(并接受了答案),同时还提到了updateInput。我看不到如何找到属性对象,因此我没有进一步研究它。在afterValidateAttribute方法中,给定的属性对象是被触发的对象,因此另一个表单字段仍然没有属性对象(没有对所有参数进行无声的硬编码,也不希望在模型中发生任何更改),因此在这种情况下仍然不起作用。似乎详细说明了如何做到这一点。似乎确实需要使用数字索引而不是命名索引来访问属性,因此如果模型发生更改,可能会出现问题。如果只有少数字段进行了验证,可能会盲目地检查所有字段?谢谢Ernie-我不太确定这与我的问题有什么关系-我想在任何字段更改时都触发客户端验证。“看起来我丑陋的黑客攻击才是正确的选择——我希望我误解了什么,而不是比较验证器需要黑客攻击才能正常工作。”Hippyjim在这个问题的公认答案中,有一个代码块用如果您希望在用户更改下拉列表时得到即时的ajax反馈,您可能希望在视图中看到这样的内容:“该代码块显示如何在第二个字段上触发验证(在这种情况下,更改下拉列表会触发文本);在你的回答中,你希望password1触发password2,反之亦然,谢谢-我在回答中完全忽略了这一点。这正是我所需要的。
array('newPassword', 'compare', 'compareAttribute'=>'confirmPassword','operator'=>'==' ,'message'=>'Please enter the same password twice'),**strong text**