我在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验证?
答案 0 :(得分:5)
如果您定义了一个扩展CValidator
的自定义验证器,您可以通过AJAX 和在一个包中通过AJAX 和实现验证客户端(使用JS)。
对于“普通”验证,使用正确的属性名称和参数设置验证器并覆盖validateAttribute
方法。
对于客户端验证,另外覆盖clientValidateAttribute
方法。如果为表单启用了客户端验证,则会导致自动调用自定义JS以验证输入。在覆盖中,您将输出runs in this context:
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); }); }