触发Yii字段验证另一个字段的更改

时间:2012-07-13 11:02:11

标签: php javascript yii

我在Yii模型中有两个相关的字段。它们是items_per和items_period。

items_per 是一个整数,反映了在给定时间段内要处理的项目数。

items_period 是该时段内的秒数(带有标记为秒,分钟,小时的选项的下拉列表)。通过items_period将items_per相乘,您就拥有“每秒项目数”。

我已经设置了自定义验证规则,以限制每秒的项目超过一定数量。当你更改items_per字段中的值(模糊)时,一切正常并使用ajax验证给出一个明智的错误消息。

每当items_period字段被更改时,我都需要触发items_per字段的验证(可能不允许100 /秒,但是100 /分钟)。

我尝试在items_per下拉列表中添加onchange函数以触发items_per字段上的“模糊”或“更改”,但它似乎没有提出ajax验证请求。提交表单只是为了触发验证不是一个选项,因为它可能没有任何错误,只需在用户准备好之前保存记录。

有什么建议我如何强制一个字段在另一个字段中触发ajax验证?

2 个答案:

答案 0 :(得分:5)

如果您定义了一个扩展CValidator的自定义验证器,您可以通过AJAX 在一个包中通过AJAX 实现验证客户端(使用JS)。

对于“普通”验证,使用正确的属性名称和参数设置验证器并覆盖validateAttribute方法。

对于客户端验证,另外覆盖clientValidateAttribute方法。如果为表单启用了客户端验证,则会导致自动调用自定义JS以验证输入。在覆盖中,您将输出runs in this context

的JS代码
function(value, messages, attribute) {
    // your code goes here
    // value: current value of attribute
    // messages: array of strings (validation errors) you should append to
    // attribute: name of the attribute
}

您可以使用an example查看内置验证程序在此框架中的工作方式。另请参阅CActiveForm.clientOptions

对于AJAX验证,您可以提交表单以进行验证。我们的想法是您将验证配置为包含特殊参数(例如ajax=something)或排除一个(例如,不包括提交按钮的值)。 事实上,Yii已经通过在所有AJAX验证请求中自动包含ajax=formId参数来实现此目的!

通过这种方式,您可以轻松编写始终有效但始终保存的控制器代码。在CActiveForm的Yii参考中也有一个例子(搜索“要响应AJAX验证请求,我们需要以下类代码:”)。

最后,您可以通过调用$.fn.yiiactiveform.updateInput以编程方式使用Javascript设置任何属性的验证状态。如果你这样做,那么通过调用$.fn.yiiactiveform.updateSummary继续模仿Yii是个好主意。

答案 1 :(得分:5)

我创建了以下javascript函数,我在更改特定字段时手动调用。它对所有表单元素执行ajax验证。

/**
 * @author marcovtwout
 * Force performing full ajax validation on given form.
 * @param Object $form jQuery form object
 */
performFullAjaxValidation = function($form){
    var settings = $form.data("settings");
    $.each(settings.attributes, function () {
        this.status = 2; // force ajax validation
    });
    $form.data("settings", settings);

    // trigger ajax validation
    $.fn.yiiactiveform.validate($form, function (data) {
        $.each(settings.attributes, function () {
            $.fn.yiiactiveform.updateInput(this, data, $form);
        });
        $.fn.yiiactiveform.updateSummary($form, data);
    });
}