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


Trigger Yii field validation onchange of another field

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

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

items_period是该时段中的秒数(下拉列表中的选项标记为秒、分钟、小时)。将items_per乘以items_period,即为"每秒项目数"。

我设置了一个自定义验证规则,以限制每秒的项目数超过一定数量。这一切都很好,当您更改items_per字段中的值(在blur上)时,使用ajax验证会给出一条合理的错误消息。

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

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

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

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

对于"普通"验证,请使用正确的属性名称和参数设置验证器,并覆盖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
}

您可以通过一个示例了解内置验证器在该框架中的工作方式。另请参见CActiveForm.clientOptions

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

通过这种方式,您可以轻松地编写控制器代码,这些代码始终进行验证,但仅在需要时保存。在CActiveForm的Yii引用中也有一个例子(搜索"为了响应AJAX验证请求,我们需要以下类代码:")。

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

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

/***@作者marcovtout*强制对给定的表单执行完整的ajax验证。*@param Object$form jQuery表单对象*/performFullAjaxValidation=函数($form){var settings=$form.data("settings");$.each(settings.attributes,function(){this.status=2;//强制ajax验证});$form.data("设置",设置);//触发ajax验证$.fn.yiiativeform.validate($form,函数(数据){$.each(settings.attributes,function(){$.fn.yiiativeform.updateInput(this,data,$form);});$.fn.yiiativeform.updateSummary($form,data);});}