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;
        }
    }

这样就可以做到文本框失去焦点时进行自定义验证

posted @ 2020-03-13 12:36  night-bright  阅读(...)  评论(...编辑  收藏