Yii';s CActiveForm错误消息获胜';Don’别走开


Yii's CActiveForm error message won't go away

我正在为我的表单编写几个(自定义)验证器,除了一个小问题,一切都一如既往地顺利。

我有两个字段:一个是html选择输入(又名dropDownList),另一个是简单的textField

我已经设置了ajax验证器,这样,当在dropDownList上选择X选项时,textField中的文本不能为空。

因此,当用户在dropDownList中选择选项X时,会出现一条错误消息(对于dropDownList,请注意):文本字段Y不能为空

到目前为止还不错。然后,当我点击textField时,键入一些内容并点击屏幕上的其他地方,可以肯定的是,ajax验证器已经启动,HTTP响应为空,这意味着表单上没有错误。但错误消息并没有消失

我猜这与我使用一个字段的验证器在另一个字段上clearErrors()有关,但这不应该起作用吗?我已经给出了正确的字段作为clearErrors()方法的参数。。

有人知道我可能出了什么问题吗?

提前感谢

编辑这是我的表单模型链接:单击

当我更改target_constantsource_constant时,会向服务器启动一个验证器。它正在工作,我的意思是服务器确实会将AJAX响应发送到我的验证器。此外,响应主体没有错误消息,但target_regsource_reg的错误消息(取决于哪些受到影响)不会在同一时刻消失。只有在下一个请求/响应中,错误消息才会消失。

我刚刚看了一下,但没有发现您的代码有什么问题。看起来实际的验证是有效的(您可以得到正确的数据),但Javascript(yiiativeform.js)只更新上次编辑的字段的数据。这与服务器端验证相反,后者检查所有字段。从用户的角度来看,只显示当前编辑的字段的错误是有意义的,但当您有复杂的交互时,这当然有点缺乏。我在这里拖延得很厉害,所以我想出了一个"解决方案"。您可以对任何属性使用afterValidateAttribute回调来强制呈现带有$.fn.yiiativeform.updateInput:的错误消息

    <div class="row">
    <?php echo $form->labelEx($model,'text'); ?>
    <?php echo $form->textField($model,'text'); ?>
    <?php echo $form->error($model,'text', array('afterValidateAttribute' => 'js:function(form, attribute, data, hasError)
    { 
        mSettings = $.fn.yiiactiveform.getSettings(form);
        $.fn.yiiactiveform.updateInput(mSettings.attributes[0], data, form)
    }')); ?>
</div>

它做什么?在回调中,我开始处理一些数据。这里最有趣的是数据——这是AJAX JSON响应,所有属性都有错误。在函数中,我得到了currentform的设置。这很重要,因为我必须找到要操作的属性对象。然后,我手动调用updateInput,并传递要修改的属性对象,以及回调中的数据和表单。这里的问题是,您必须找出attributes对象中哪个从零开始的索引是您的对象。我是通过console.log完成的。瞧,你的属性会更新。我只是希望没有更简单的方法来做到这一点,我在这上面花了这么多时间是徒劳的p

不要用类似的$formhtml字段添加自定义"ID"

$form->textField($model, 'test_field', array('id' => 'custom_id');

如果有必要添加自定义ID,那么你必须像这个一样将型号名称放在自定义ID之前

$form->textField($model, 'test_field', array('id' => 'youModelName_custom_id');

自定义ID的另一个解决方法是使用自定义类名。