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);});}