关于Yii2客户端验证器是否能够生效的问题 [ 技术分享 ]
Yii2框架提供了功能强大的验证器(Validator),验证器包括服务器端(server-side validator)和客户端(client-side validator)两类,客户端验证器是否能够最终生效是个困扰初学者的问题,在这里我做个简单总结。
客户端验证器是否能够最终生效主要由以下两个参数决定:
enableAjaxValidation和enableClientValidation
这两个参数的应用规则如下:
- enableAjaxValidation的优先级高于enableClientValidation
- ActiveField的设置高于ActiveForm的设置
- 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刷新测试页面即可查看到效果,以各种组合进行测试一下你就明白了。
(全文完)
共 0 条回复
没有找到数据。
阿江
注册时间:2015-10-18
最后登录:2024-03-03
在线时长:186小时21分
最后登录:2024-03-03
在线时长:186小时21分
- 粉丝94
- 金钱16816
- 威望160
- 积分20276