我制作了一个带有验证和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验证,则会显示错误。这可能有什么问题?
答案 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