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

Hip*_*jim 5 javascript php yii

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

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

items_period是该时间段内的秒数(带有标记为秒,分钟,小时的选项的下拉列表).将items_per乘以items_period,您就拥有"每秒项目数".

我有一个自定义验证规则设置,以限制每秒的项目超过一定数量.当你更改items_per字段中的值(模糊)时,一切正常并使用ajax验证提供合理的错误消息.

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

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

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

Jon*_*Jon 5

如果定义自定义验证器扩展,则可以在一个包中实现验证客户端(使用JS),通过AJAX 普通请求CValidator.

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

对于客户端验证,另外覆盖该clientValidateAttribute方法.如果为表单启用了客户端验证,则会导致自动调用自定义JS以验证输入.在覆盖内,您将输出在此上下文运行的 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
}
Run Code Online (Sandbox Code Playgroud)

您可以通过示例了解内置验证器如何在此框架中工作.另见CActiveForm.clientOptions.

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

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

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


mar*_*out 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);
    });
}