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验证?
如果定义自定义验证器扩展,则可以在一个包中实现验证客户端(使用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.
我创建了以下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);
});
}