YII 验证和消息

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

Java代码  

  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

Java代码  

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

 然后在模型(model)的:

Java代码  

  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()数组添加下列代码:

Java代码  

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

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

setAttributes:

Java代码  

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

添加了$repassword属性

Java代码  

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

以注册验证为例.controller

Java代码  

  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.     
  13.     $this->render('register',array(    
  14.         'model'=>$model,    
  15.     ));    
  16. }    

register.php

Java代码  

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

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

Java代码  

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

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

Java代码  

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

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

Java代码  

  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}

Java代码  

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

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

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

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

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

Java代码  

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

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

Java代码  

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

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

Java代码  

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

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

Java代码  

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

  Email验证器

Java代码  

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

 Compare验证器

Java代码  

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

Unique验证器

Java代码  

  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,可以节省几次判断。

Java代码  

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

布尔验证器

Java代码  

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

数字验证器

Java代码  

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

default验证器 datetime格式

Java代码  

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

fiter验证器

Java代码  

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

正则验证器

Java代码  

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

in验证器

Java代码  

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

length验证器

Java代码  

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

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

Java代码  

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

日期格式验证

Java代码  

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

文件验证

Java代码  

  1. array('filename', 'file', 'allowEmpty'=>true, 'types'=>'zip, rar, xls, pdf, ppt'),  
时间: 2024-12-30 16:45:12

YII 验证和消息的相关文章

PHP Yii框架之表单验证规则大全_php实例

Yii是一个基于组件的高性能PHP框架,用于开发大型Web应用.Yii采用严格的OOP编写,并有着完善的库引用以及全面的教程. 废话不多说了,直接给大家贴代码了. <?php class ContactForm extends CFormModel { public $_id; public $contact;//联系人 public $tel;//电话 public $fax;//传真 public $zipcode;//邮编 public $addr;//地址 public $mobile;

jQuery-Validate验证插件的使用步骤详解

版权声明:尊重博主原创文章,转载请注明出处哦~http://blog.csdn.net/eson_15/article/details/51497533 目录(?)[+] 1. 写在前面  (友情提示,点我:下载源码)   我们知道,用户在注册的时候,会有个表单页面,然后有些选项是必填的,有些要填的内容是有规范的,这些都要在用户提交之前进行验证才行,如果不符合要求,需要在右边显示一个友好的提示,让用户修改.  记得以前在学习Servlet的时候,实现一个简单的用户注册功能的验证是在后台做的,有些

.NET可复用TCP通信层之消息分派器组件

上一篇主要讲到了Tcp通信层中的核心组件――Tcp组件的实现,Tcp组件是整个通信层的消息驱动源,甚至,可以将Tcp组件看作是我们整个服务器系统的消息驱动源,消息处理过程从这里引发.类似的消息驱动源还有发布的WebService接口.Remoting接口等.今天我们需要关注的是Tcp通信层中的"中央"组件――消息分派器组件ITcpReqStreamDispatcher,大家已经从前文的组件关系图中看到了消息分派器的大致位置和作用了,它是Tcp通信组件和消息处理器之间的"桥梁&

ASP.NET MVC基于标注特性的Model验证:ValidationAttribute

通过前面的介绍我们知道ModelValidatorProviders的静态只读Providers维护着一个全局的ModelValidatorProvider列表,最终用于Model验证的ModelValidator都是通过这些ModelValidatorProvider来提供的.对于该列表默认包含的三种ModelValidatorProvider来说,DataAnnotationsModelValidatorProvider无疑是最重要的,ASP.NET MVC默认提供的基于数据标注特性的声明式

ASP.NET MVC的客户端验证:jQuery验证在Model验证中的实现

在简单了解了Unobtrusive JavaScript形式的验证在jQuery中的编程方式之后,我们来介绍ASP.NET MVC是如何利用它实现客户端验证的.服务端验证最终实现在相应的ModelValidator中,而最终的验证规则定义在相应的ValidationAttribute中:而客户端验证规则通过HtmlHelper<TModel>相应的扩展方法(比如TextBoxFor.EditorFor和EdidtorForModel等)出现在生成的被验证HTML元素中.毫无疑问,服务端验证和客

PHP开发框架Yii Framework教程(21) UI 组件 自定义Captcha示例

Yii内置的Captcha基本上可以满足大部分需求,如果你对验证码有特殊要求,你可以自定义Captcha,这主要是通过扩展 CCaptchaAction来实现的,本例自定义一个验证码功能,随机产生10以内的加减法,用户需要计算出正确的结果才能通过验证. 本例基于上例Yii Framework 开发教程(20) UI 组件 Captcha示例,做如下修改 首先在protected/components 目 录下创建一个MathCaptchaAction,重载generateVerifyCode,

PHP开发框架Yii Framework教程(20) UI组件 Captcha示例

Captcha(全自动区分计算机和人类的图灵测试-Completely Automated Public Turing test to tell Computers and Humans Apart,简称CAPTCHA)俗称验证码,是一种区分用户是计算机和人的公共全自动程序.在CAPTCHA测试中,作为服务器的 计算机会自动生成一个问题由用户来解答.这个问题可以由计算机生成并评判,但是必须只有人类才能解答.由于计算机无法解 答CAPTCHA的问题,所以回答出问题的用户就可以被认为是人类. Yii

PHP开发框架Yii Framework教程(5) URL管理

在上一篇Yii Framework 开发简明教程(4) Hangman 猜单词游戏实例略去了几个方面的问题,一是配置文件main.php 的 URLManager,二是Controller的基类CComponent ,三是定义View使用的CHtml帮助类.本篇战开介绍URLManager,URL管理. return array( ... 'components'=>array( 'urlManager'=>array( 'urlFormat'=>'path', 'rules'=>

在Visual Web JSF应用程序中转换和验证数据

在本教程中,您将学习 JSF 1.2(Woodstock)中的转换器和验证器.转换器用来将字符串输入转换为数据型 Java 数据类型,以达到计算之类的多种目的.验证器用来核实用户输入是否落在指定的范围内.您将使用 Visual Web JSF 框架来创建一个将温度从摄氏转换为华氏的应用程序.该应用程序使用一个转换器来将用户输入从一个字符串值转换为数值型 Java 数据类型,应用程序就能用它来进行计算.该应用程序还是用一个验证器来检查数据是否落在指定的范围内,并通过一个消息组件来报告验证错误.然后