Yii2在错误ajax-validation上运行JS脚本

时间:2016-11-07 15:39:23

标签: php jquery ajax validation yii2

有我的表格:

    $form = ActiveForm::begin([
      'id' => 'user-create-form',
      'enableAjaxValidation' => true,
      'enableClientValidation' => false,
      'validationUrl' => Url::toRoute(Yii::$app->controller->id . '/validation'),
      'validateOnType' => true,
    ]);

JS-script在此表单上注册,并根据.keyup()事件的一些规则执行俄语到英语的音译。音译结果已添加到samname字段。

UserCreateForm模型中有验证规则:

    public function rules()
    {
      return [
        [['samname'], 'validateUserExist'],
      ];
    }

    public function validateUserExist()
    {
        $check = Yii::$app->CustomComponents->checkUserExist($this->samname);
        if ($check) {
           $errorMessage = 'User exists: ' . $check;
           $this->addError('samname', $errorMessage);
        }
    }

函数checkUserExist()检查已创建名称的存在,并在匹配大小写时返回错误。

控制器上有动作:

    public function actionValidation()
    {
        $model = new UserCreateForm();

        if (\Yii::$app->request->isAjax && $model->load(\Yii::$app->request->post())) {
            \Yii::$app->response->format = Response::FORMAT_JSON;
            echo json_encode(ActiveForm::validate($model));
            \Yii::$app->end();
        }
    }

效果很好,执行验证,匹配大小写返回错误......

但是!

需要再次运行JS脚本并在出错时将下一个字母添加到名称(JS-script提供此功能)。如何在验证器返回错误后再次运行JS脚本?

1 个答案:

答案 0 :(得分:0)

@yafater感谢您的帮助!我找到了解决方案。

    $('form').on('afterValidateAttribute', function (event, attribute, message) {
        if (attribute.name === 'samname')
        {
            $.ajax({
                url: "url-to-action",
                type: "POST",
                dataType: "json",
                data: $(this).serialize(),
                success: function(response) {
                    if ( typeof(response["form-samname"]) != "undefined" && response["form-samname"] !== null ) {
                        // code here
                    }
                },
            });
            return false;
        }
    });