阿江 2017-01-16 16:37:31 2466次浏览 0条回复 1 0 0

Yii2框架提供了功能强大的验证器(Validator),验证器包括服务器端(server-side validator)和客户端(client-side validator)两类,客户端验证器是否能够最终生效是个困扰初学者的问题,在这里我做个简单总结。

客户端验证器是否能够最终生效主要由以下两个参数决定:

enableAjaxValidation和enableClientValidation

这两个参数的应用规则如下:

  1. enableAjaxValidation的优先级高于enableClientValidation
  2. ActiveField的设置高于ActiveForm的设置
  3. enableAjaxValidation=false时,模型中的enableClientValidation将最终决定是否能够进行客户端验证。

举一个应用实例,将这些关键代码(不完整)放到程序中跑一下就看出来了:

控制器:
use frontend\models\Validator;
class PostController extends CommonController {
    public function actionValidator(){
        $model=new Validator();
	if ($model->load(Yii::$app->request->post())) {
            if (Yii::$app->request->isAjax) {
                Yii::$app->response->format = \yii\web\Response::FORMAT_JSON;
                $result = \yii\bootstrap\ActiveForm::validate($model);
                return $result;
            }
            if($model->validate()){
                $attributes=$model->getAttributes();
                foreach($attributes as $k=>$item){
                    echo "<br>error:".$k;
                    var_dump($item);
                }
                $this->success('Submit success,Thank you!');
            }else{
                $errInfo="";
                foreach($model->firstErrors as $key=>$error){
                    $errInfo.="$key:$error\n";
                }
                $this->error("Validate Error:\n".$errInfo);
            }
        }else{
            return $this->render("validator",['model'=>$model]);
        }
    }
}
视图文件:

文件位置:D:\phpwork\advanced\frontend\views\post\validator.php

use yii\bootstrap\ActiveForm;
//在视图中为form设置客户端验证
$form = ActiveForm::begin([
	//enableAjaxValidation的优先级高于enableClientValidation
	'enableAjaxValidation' => false,
	//在form中设置enableClientValidation为false,即禁用客户端验证
	'enableClientValidation'=>false,
]);
	//单独设置ActiveField的'selectedDefault'输入项的enableClientValidation为true,即进行客户端的验证
	echo $form->field($model, 'selectedDefault',['enableClientValidation'=>true,'enableAjaxValidation'=>true])->textInput();
ActiveForm::end();
模型文件

文件位置:D:\phpwork\advanced\frontend\models\Validator.php

class  Validator extends Model{
        public $selectedDefault;
        public function rules(){
            return [
		//必填项required()检查是可以运行的,因为其'enableClientValidation'=true(默认值)。
		['selectedDefault','required'],
		//范围in()检查是不会被运行的,因为'enableClientValidation'=false,相当于没有生成客户端的验证程序。
		['selectedDefault','in','range'=>['ok','active','offline','online'],'enableClientValidation'=>false],
		//此句报错,规则中没有enableAjaxValidation这个选项
		//['selectedDefault','in','range'=>['ok','active','offline','online'],'enableClientValidation'=>false,'enableAjaxValidation' => false],
            ];
        }
}

如何运行?

将上例中的enableAjaxValidation和enableClientValidation分别修改一下,修改后,F5刷新测试页面即可查看到效果,以各种组合进行测试一下你就明白了。

(全文完)

    没有找到数据。
您需要登录后才可以回复。登录 | 立即注册