Yii2的ActiveForm组件实现ajax验证功能
yii model的rules具有很强大的验证功能,当我们使用Yii的ActiveForm组件时它会自动生成对应js验证代码,对数据进行验证,但是当我们在rules中写自定义验证时,就只有在表单提交后才会验证,这样对用户来说是很不友好的,所以此时我们可以使用ajax验证,具体代码如下:
在model中写我们的自定义验证规则
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中做如下修改
<?php $form = ActiveForm::begin([ 'enableAjaxValidation' => true, 'validationUrl' => 'validate',//这里是ajax验证请求的控制器action ]); ?>
在控制器中完善验证方法如下:
/* * 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; } }
这样就可以做到文本框失去焦点时进行自定义验证