Yii2 ActiveForm Ajax验证并提交

时间:2018-06-12 04:41:17

标签: ajax yii2

我制作了一个带有验证和ajax提交的活动表单。

表单在视图中创建:

 <?php $form = ActiveForm::begin([
        'id' => 'login-form',
        'layout' => 'horizontal',
        'method' => 'post',
        'enableClientValidation' => false,
        'enableAjaxValidation' => true,
        'validationUrl' => 'panel/validate',
        'fieldConfig' => [
            'options' => [
                'tag' => false,
            ],
             'template' =>'{input}<p class="help-block help-block-error ">{error}</p>'
        ],
    ]); ?>

验证操作:

 public function actionValidate()
    {
        $model = new LoginForm();
        $request = \Yii::$app->getRequest();

        if ($request->isAjax && $request->isPost && $model->load(Yii::$app->request->post())) {
            \Yii::$app->response->format = Response::FORMAT_JSON;
            return ActiveForm::validate($model);
        }
        return $this->renderAjax('login', [
            'model' => $model,
        ]);
    }

当我将这些字段留空时,或者不指定验证码时,我可以看到ajax响应:

{"loginform-username":["Username cannot be blank."],"loginform-password":["Password cannot be blank."],"loginform-captcha":["Captcha cannot be blank."]}

但是,这些错误未显示在我的表单字段下。表单字段的创建方式如下:

 <?= $form->field($model, 'username')->textInput()

如果我关闭ajax验证,则会显示错误。这可能有什么问题?

1 个答案:

答案 0 :(得分:2)

我担心在'tag' = false中关闭fieldConfig时无法显示错误。

即使它适用于服务器端验证,但主要问题是字段的yii.activeForm.js updateInput()函数的工作原理。当ajax请求完成时,.js会尝试使用.field-<model>-<attribute>类选择器查找外部标记(字段)并获取error-div子项。只要没有外部.field标记,就不会在表单中追加错误消息。

我对此并不是百分之百确定,但这是我对调试yii.activeForm.js功能的理解。

实际上,这里是yii2 / issues中的类似问题,SilverFire解释说没有办法实现这一点。
ActiveForm fieldConfig options tag=>false will render class attribute without any tag