setFlash(), getFlash()可以完成验证成功后提示

  1. <?php
  2. # 成功信息提示
  3. Yii::app()->user->setFlash('success', "Thinks saved success!");
  4. # 错误信息提示
  5. Yii::app()->user->setFlash('error', "here has an Error, Please check that!");
  6. # 一般消息信息提示
  7. Yii::app()->user->setFlash('notice', "messge here");
  8. ?>

2.errorSummary验证不通过的错误提示

rules()方法中定义的规则会在模型实例调用其 validate() 或 save() 方法时逐一执行。normalizeTags验证器是一个基于方法的验证器,Models/xx.php中的rules()的验证规则是对数据库表进行的,Models/xxForm.php中的rules()的验证规则是对表单进行的,和数据库表没有关系,类名和文件名要相同 。

如果我们使用一个validator(验证器)类,则这个类必须继承CValidator。其实有三种方法可以指定validator(验证器),包括前面提到的一种格式:
1.第一种是在模型类中定义验证方法
2.第二种是指定一个单独的验证器类(这个类继承validators/CValidator )。
3.第三种是你可以使用Yii框架中现有的验证器,指定预定义的验证器别名即可。

Yii为你提供了很多预定义的验证器类,同时也指定了别名,用在定义规则时。Yii1.1版本,预定义的验证器别名的完整列表如下:
* captcha:它是CCaptchaValidator类的别名,验证属性的值等于一个显示的CAPTCHA(验证码)的值。
* compare:它是CCompareValidator类的别名'=','==','!=','>','>='。
* default:它是CDefaultValidator类的别名,验证属性的值为分配的默认值。
* exist:它是CExistValidator类的别名,验证属性的值在表中的对应列中存在。 
* filter:它是CFilterValidator类的别名,用过滤器转换属性的值。
* in:它是CRangeValidator类的别名,验证属性值在一个预定义列表中。
* length:它是CStringValidator类的别名,验证属性值的长度在一个范围内。
* match:它是CRegularExpressionValidator类的别名,验证属性值匹配一个正则表达式。
* numerical:它是CNumberValidator类的别名,验证属性值是数字。
* type:它是CTypedValidator类的别名,验证属性值是一个指定的数据类型。
* unique:它是CUniquedValidator类的别名,验证属性值在表中的对应列中是唯一的。
* url:它是CUrlValidator类的别名,验证属性值是一个有效的URL。

2.单独的验证器类 方便重用

首先要做的是创建类文件.最好的方法时类的文件名和类名相同,可以使用yii的延迟加载(lazy loading)功能。
让我们在应用(application)的扩展(extensiions)目录(在 protected 文件夹下)下新建一个文件夹.
将目录命名为: MyValidators然后创建文件: passwordStrength.php

  1. class passwordStrength extends CValidator{
  2. public $strength;
  3. private $weak_pattern = '/^(?=.*[a-zA-Z0-9]).{5,}$/';
  4. private $strong_pattern = '/^(?=.*\d(?=.*\d))(?=.*[a-zA-Z](?=.*[a-zA-Z])).{5,}$/';
  5. protected function validateAttribute($object,$attribute)
  6. {
  7. // check the strength parameter used in the validation rule of our model
  8. if ($this->strength == 'weak')
  9. $pattern = $this->weak_pattern;
  10. elseif ($this->strength == 'strong')
  11. $pattern = $this->strong_pattern;
  12. // extract the attribute value from it's model object
  13. $value=$object->$attribute;
  14. if(!preg_match($pattern, $value))
  15. {
  16. $this->addError($object,$attribute,'your password is too weak!');
  17. }
  18. }

然后在模型(model)的:

  1. /**
  2. * @return array validation rules for model attributes.
  3. */
  4. public function rules()
  5. {
  6. return array(
  7. array('password', 'ext.MyValidators.passwordStrength', 'strength'=>self::STRONG),
  8. );
  9. }

由于我们直接在User AR类中添加了$repassword属性,并且它与底层数据库表之间没有对应关系,我们需要告诉模型类允许这个属性在setAttributes()被调用时被设置。 保存时不能入库需要添加rules验证验证器 。我们的做法是将其添加到User模型类的安全属性列表中。向User::rules()数组添加下列代码:

  1. array('repassword', 'safe'),

我们新建的$repassword不存在对应的tbl_user表中的列,需要将其直接添加到安全属性列表。

setAttributes:

  1. $model->attributes=$_POST['User'];

添加了$repassword属性

  1. class User extends CActiveRecord
  2. {
  3. public $repassword; //不能是private会报错

以注册验证为例.controller

  1. public function actionRegister()
  2. {
  3. $model=new User;
  4. if(isset($_POST['User']))
  5. {
  6. $model->attributes=$_POST['User'];
  7. if($model->save()){
  8. Yii::app()->user->setFlash('register','Thank you for your register.');//注册成功提示
  9. $this->refresh();
  10. }
  11. }
  12. $this->render('register',array(
  13. 'model'=>$model,
  14. ));
  15. }

register.php

  1. <h1>注册用户</h1>
  2. <?php if(Yii::app()->user->hasFlash('register')): ?>
  3. <div class="flash-success">
  4. <?php echo Yii::app()->user->getFlash('register'); ?>
  5. </div>
  6. <?php else: ?>
  7. <div class="form">
  8. <?php $form=$this->beginWidget('CActiveForm', array(
  9. 'id'=>'user-form',
  10. 'enableAjaxValidation'=>false,
  11. ));
  12. ?>
  13. <p class="note">Fields with <span class="required">*</span> are required.</p>
  14. <?php echo $form->errorSummary($model); ?>
  15. <div class="row">
  16. <?php echo $form->labelEx($model,'password'); ?>
  17. <?php echo $form->passwordField($model,'password',array('size'=>60,'maxlength'=>128, 'autocomplete'=>'off','value'=>'')); ?>
  18. <?php echo $form->error($model,'password'); ?>
  19. <?php //echo $model->getError('password'); ?>
  20. </div>
  21. <div class="row">
  22. <?php echo $form->labelEx($model,'repassword'); ?>
  23. <?php echo $form->passwordField($model,'repassword',array('size'=>60,'maxlength'=>128, 'autocomplete'=>'off','value'=>'')); ?>
  24. <?php echo $form->error($model,'repassword'); ?>
  25. </div>
  26. <div class="row buttons">
  27. <?php echo CHtml::submitButton('注册'); ?>
  28. </div>
  29. <?php $this->endWidget(); ?>
  30. </div>
  31. <?php endif; ?>

ajax动态验证 
第一步:在_form中最上面改成

  1. $form=$this->beginWidget('CActiveForm', array(
  2. 'id'=>'user-form',
  3. 'enableAjaxValidation'=>true,
  4. )

第二步:controller中添加,对应 'id'=>'user-form'

  1. $this->performAjaxValidation($model);
  2. protected function performAjaxValidation($model)
  3. {
  4. if(isset($_POST['ajax']) && $_POST['ajax']==='user-form')
  5. {
  6. echo CActiveForm::validate($model);
  7. Yii::app()->end();
  8. }
  9. }

第三步:在models层中加入checkemai方法

  1. public function rules()
  2. {
  3. // NOTE: 可以用exist验证器替换
  4. return array(
  5. array('email', 'checkUser','message'=>'Test message for email validation'),
  6. array('user_id', 'checkUser','message'=>'Test message for {attribute} validation'),
  7. );
  8. }
  9. public function checkUser($attribute,$params) //attribute用法
  10. {
  11. switch($attribute){
  12. case "email": //rules email
  13. $models = ServiceReviews::model()->findAllByAttributes(array('email' =>$this->email,'service_id'=>$this->service_id));
  14. if(count($models)>0){
  15. $this->addError($attribute, $params['message']);
  16. }
  17. break;
  18. case "user_id":
  19. if(Yii::app()->user->isGuest){
  20. $models = ServiceReviews::model()->findAllByAttributes(array('user_id' =>Yii::app()->user->id,'service_id'=>$this->service_id));
  21. if(count($models)>0){
  22. $this->addError($attribute, $params['message']);
  23. }
  24. }
  25. break;
  26. }
  27. }

最后在models层的验证规则中(rules)加入以下验证规则{attribute}

  1. array('email', 'checkUser','message'=>'已经存在{attribute}'),

刚才创建的方法需要两个参数:
* $attribute 需要验证的属性
* $params 在规则中自定义的参数
在模型的 rules 方法中我们验证的是email属性,所以在验证规则中需要验证的属性值应该是 email.

在 rules 方法中我们还设置了自定义的参数 message,它的值将会放到 $params 数组中.

三.非表单验证错误处理 :

你会发现在方法中我们使用了 CModel::addError().添加错误接受两个参数:第一个参数是在表单中显示错误的属性名,第二个参数时显示的错误信息 。
用户提交表单时,可能除表单验证之外还有与表单各输入项无关的其他错误产生,例如后台数据库出错、接口调用失败等。
这种情况下可以在Model中相应的位置使用如下代码记录错误:

  1. $this->addError('info', '发送不明错误,请重试'); // info 只是一个自定义的名字,不需要真正有这个字段或属性。

然后在视图文件中这样输出错误:

  1. echo $form->error($model, 'info'); //$form 是 CActiveForm 的实例。$form->getErrors();

当我们调用 CModel::validate() 方法, 我们可以指定一个场景参数. 只有在特定的场景下校验规则才会生效.校验规则会在那些 on 选项没有被设置或者包含了指定的场景名称的场景中生效.如果我们没有指定场景,而调用了 CModel::validate() 方法,只有那些 on 选项没有设置的规则才会被执行 .

  1. $model = new model('register');
  2. // or $model=new User;
  3. // $model->scenario='register';

例如,在注册一个用户时,我们运行以下脚本来执行校验 :

  1. array('password', 'compare', 'compareAttribute'=>'repassword', 'on'=>'register,edit'),

Email验证器

  1. array('email','email'), //验证email这个字段必须符合email格式

Compare验证器

  1. array('password2','compare','compareAttribute'=>'password1'),//验证password1和password2必须一致
  2. array('end_date','compare', 'compareAttribute' => 'start_date', 'operator' => '>', 'message' => '错误的开始结束日期'),

Unique验证器

  1. array('username,email','unique','className'=>'User'),//User为Model,username,email在user中不允许重复

如果被验证属性为空,就认为完全合法,立刻返回,但是如果allowEmpty为false的话,就要通过函数后续的所有验证条件 。那么对于一个传入的空值来说,allowEmpty无论是true还是false,极有可能都不会报错,上面节选的验证器是StringValidator,如果我没有设定min的值,那么一个空串在allowEmpty为false的情况下,还是不会报任何错误的。
如果希望一个属性值不能为空,最好还是用RequiredValidator来验证,allowEmpty是不靠谱的,建议一般就采取allowEmpty的默认值true,可以节省几次判断。

  1. array('verifyCode', 'captcha', 'allowEmpty'=>!CCaptcha::checkRequirements()),

布尔验证器

  1. array('rememberMe', 'boolean'),

数字验证器

  1. array('id', 'numerical', 'min'=>1, 'max'=>10, 'integerOnly'=>true),

default验证器 datetime格式

  1. array('created','default','value'=>new CDbExpression('NOW()'),'setOnEmpty'=>false)

fiter验证器

  1. array('moduleID', 'filter', 'filter'=>'trim'),

正则验证器

  1. array('name','match','pattern'=>'/^[a-z0-9\-_]+$/'),

in验证器

  1. array('superuser', 'in', 'range' => array(0, 1)),

length验证器

  1. array('password','length','min'=>'6','max'=>'16','message'=>'{attribute}长度必须在{min}到{max}之间'),

类型验证 integer,float,string,array,date,time,datetime

  1. array('created', 'type', 'datetime'),

日期格式验证

  1. array('created', 'date', 'format'=>'yyyy/MM/dd/ HH:mm:ss'),

文件验证

  1. array('filename', 'file', 'allowEmpty'=>true, 'types'=>'zip, rar, xls, pdf, ppt'),

参考:航空母舰㊣

Yii 验证和消息的更多相关文章

  1. laravel的Validation检索验证错误消息

    基本用法 处理错误消息 错误消息和视图 可用的验证规则 有条件地添加规则 自定义错误消息 自定义验证规则 基本用法 Laravel提供了一个简单.方便的工具,用于验证数据并通过validation类检 ...

  2. yii 验证问题

    yii 版本2.08 yii 验证码问题 1.模型里加入'verifyCode', 'captcha','message'=>'error','captchaAction' => 'tes ...

  3. .NET 微信Token验证和消息接收和回复

    public class wxXmlModel { public string ToUserName { get; set; } public string FromUserName { get; s ...

  4. yii 验证器和验证码

    http://www.yiiframework.com/doc/api/1.1/CCaptcha http://www.cnblogs.com/analyzer/articles/1673015.ht ...

  5. Yii - 验证和授权(Authentication and Authorization)

    1. 定义身份类 (Defining Identity Class)  为了验证一个用户,我们定义一个有验证逻辑的身份类.这个身份类实现[IUserIdentity] 接口.不同的类可能实现不同的验证 ...

  6. Yii 设置 flash消息 创建一个渐隐形式的消息框

    /*适用情况:比如提交一个表单,提交完成之后在页面展示一条提示消息. 控制器里面这样写: 单条消息: */ \Yii::$app->getSession()->setFlash('erro ...

  7. YII 验证功能

    YII 表单的验证可以在module目录下的xxx.php里面定义验证方法,设定需要验证的字段就行 //用户表单验证,在模型里面设置一个方法,具体表单验证规则        public functi ...

  8. 解决WCF 调用方未由服务器进行身份验证或消息包含无效或过期的安全上下文令牌

    错误描述: 1. WCF:调用方未由服务器进行身份验证 2. 无法处理消息.这很可能是因为操作“http://tempuri.org/ISCCLSvc/GetCarriersByWareHouse”不 ...

  9. yii验证系统学习记录,基于yiicms(二)

    /** * Validates the specified object. * @param \yii\base\Model $model the data model being validated ...

随机推荐

  1. Firebird execute block 批处理

    火鸟的批处理,效率好高,使用简单. execute block as declare variable i ; begin ) do begin :i = :i + ; insert into m_u ...

  2. golang学习之interface与其它类型转换

    如下函数,将interface变量in转换为int: func formatTimeStamp(in interface{}, layout string) (out string) { timeSt ...

  3. golang学习之闭包

    匿名函数不能够独立存在,但可以被赋值于某个变量,即保存函数的地址到变量中:fplus := func(x, y int) int { return x + y },然后通过变量名对函数进行调用:fpl ...

  4. 2017年12月13日 LinQ用法基本的增删改查

    LinQ是什么? LinQ是语言集成的查询,是用于C#跟Vb的扩展语言 LinQ的用法 新建一个App_Code文件夹,在文件夹下添加一个数据LinQ to SQL类,可以直接直接点击服务器管理器然后 ...

  5. jsp servlet基础复习 Part2--GET,Post请求

    最近进行servlet和jsp方面的梳理复习时,发现以前忽略了一个非常重要的知识点:get和post的请求(如果你觉得两者仅仅是提交数据量的大小以及方式不同就大错特错了)的正真区别,下面进行简答的整理 ...

  6. Eclipse提示workspaces is use

    问题描述: 有时候因为强行关闭Eclipse导致再次打开出现workspace提示正在使用 解决办法: 删除workspace目录下隐藏文件夹 .metadata 中的 .lock 文件 worksp ...

  7. 解决Openwrt安装插件提示一下错误的办法

    解决Openwrt安装插件提示一下错误的办法 Openwrt安装17ce插件,提示一下错误: Collected errors: * check_data_file_clashes: Package ...

  8. js-原始类型和声明变量

    ** Java的基本数据类型:byte.short.int.long.float.double.char.boolean ** 定义变量 都是用关键字 var(ES6中可以使用const和let来定义 ...

  9. C#基础拾遗系列之二:使用ILSpy探索C#7.0新增功能点

    C#基础拾遗系列之二:使用ILSpy探索C#7.0新增功能点   第一部分: C#是一种通用的,类型安全的,面向对象的编程语言.有如下特点: (1)面向对象:c# 是面向对象的范例的一个丰富实现, 它 ...

  10. MySQL数据库、表的字符编码

    用MySQL命令行新建数据库和表时默认的字符编码是latin1,但是在实际开发过程中一般都是使用utf8格式的编码.操作如下: 1.修改数据库字符编码 mysql> alter database ...