Yii2的ActiveForm组件enableajaxvalidation实现ajax验证功能
yii model的rules具有很强大的验证功能,当我们使用Yii的ActiveForm组件时它会自动生成对应js验证代码,对数据进行验证,但是当我们在rules中写自定义验证时,就只有在表单提交后才会验证,这样对用户来说是很不友好的,所以此时我们可以使用ajax验证,具体代码如下:
关于validateUrl我们做一个说明。如果你不设置该参数,该地址默认是你当前路由,而又恰巧你当前路由就是表单form的action,你会很好奇的发现,当表单项input失去焦点的时候,你对数据的修改已经提交到后端进行了处理了?这往往不是我们想要的,此时就需要给validateUrl设置一个路由地址,其所要请求的操作的意义就在于异步做验证!
在model中写我们的自定义验证规则
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
|
public function rules() { return [ [['uuid', 'single_dog', 'name'], 'required'], [['wife_name','son_name'], 'singleDogVerify','skipOnEmpty' => false, 'skipOnError' => false], ]; } /* * 验证是否单身 */ public function singleDogVerify($attribute) { if (!$this->single_dog){ if (strlen($this->$attribute)==0){ $name = $this->getAttributeLabel($attribute); $this->addError($attribute, $name.'不能为空'); } } } |
在上述代码中single_dog字段对应form中的一个单选框,值为1代表单身狗,值为0代表已婚,当已婚时wife_name是必填的
在ActiveForm中做如下修改
|
1
2
3
4
|
<?php $form = ActiveForm::begin([ 'enableAjaxValidation' => true, 'validationUrl' => 'validate',//这里是ajax验证请求的控制器action ]); ?> |
在控制器中完善验证方法如下:
|
1
2
3
4
5
6
7
8
9
10
11
12
|
/* * ajax验证 */public function actionValidate(){ $model = new ModelName(); $postData = Yii::$app->request->post(); if (Yii::$app->request->isAjax && $model ->load($postData)) { Yii::$app->response->format = \yii\web\Response::FORMAT_JSON; $result = \yii\bootstrap\ActiveForm::validate($model ); return $result; }} |
这样就可以做到文本框失去焦点时进行自定义验证

浙公网安备 33010602011771号