5

我在 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 验证吗?

4

2 回答 2

5

如果您定义自定义验证器扩展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
}

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

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

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

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

于 2012-07-13T11:25:05.597 回答
5

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

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

    // 触发ajax验证
    $.fn.yiiactiveform.validate($form, function (data) {
        $.each(settings.attributes, function () {
            $.fn.yiiactiveform.updateInput(this, data, $form);
        });
        $.fn.yiiactiveform.updateSummary($form, data);
    });
}
于 2013-02-27T11:34:58.613 回答