调用form.yiiActiveForm时,ActiveRecord自定义验证器不执行("验证")

时间:2017-11-06 10:43:14

标签: javascript php yii2 active-form

我想在不提交表单的情况下验证ActiveForm的内容 我目前正在使用以下代码

在javascript中执行此操作
var form = $(this).closest('tr').find('form');
var data = form.serialize();

d = form.data("yiiActiveForm");
$.each(d.attributes, function() {
  this.status = 3;
});

form.yiiActiveForm("validate");
if (form.find(".has-error").length) {
    return false;
}

此工作正常,错误显示在屏幕上 验证在ActiveRecord的rules()函数中定义的预定义活动表单验证器时。

array_push($r, ['tel_no', 'required', 'message' => 'input telephone no.']);
array_push($r, ['mail_address', 'email', 'message' => 'input correct email']);

但不适用于自定义验证器,如下所示

array_push($r, ['card_no', 'validateCardNo']);


public function validateCardNo($attribute, $params) {
    if (!preg_match('/^[A-Za-z0-9-\/]+$/D', $this->$attribute)) {
        $this->addError('card_no', 'input correct card no');
    }
}

我是否需要在javascript上使用某些内容才能触发自定义验证器?任何帮助,将不胜感激。 提前致谢

2 个答案:

答案 0 :(得分:1)

要创建支持客户端验证的验证器,您应该实现yii \ validators \ Validator :: clientValidateAttribute()方法,该方法返回一段在客户端执行验证的JavaScript代码。

请参阅文档:http://www.yiiframework.com/doc-2.0/guide-input-validation.html#implementing-client-side-validation

答案 1 :(得分:0)

作为参考,我可以通过调用validateAttribute来调用自定义验证器。

form.yiiActiveForm("validate");
form.yiiActiveForm("validateAttribute", "user-card_no");
if (form.find(".has-error").length) {
    return false;
}

并在视图端将enableAjaxValidation设置为true。

<?php $form = ActiveForm::begin(['id' => 'owner_form', 'enableAjaxValidation' => true]); ?>