setFlash(), getFlash()可以完成验证成功后提示
- <?php
- # 成功信息提示
- Yii::app()->user->setFlash('success', "Thinks saved success!");
- # 错误信息提示
- Yii::app()->user->setFlash('error', "here has an Error, Please check that!");
- # 一般消息信息提示
- Yii::app()->user->setFlash('notice', "messge here");
- ?>
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
- class passwordStrength extends CValidator{
- public $strength;
- private $weak_pattern = '/^(?=.*[a-zA-Z0-9]).{5,}$/';
- private $strong_pattern = '/^(?=.*\d(?=.*\d))(?=.*[a-zA-Z](?=.*[a-zA-Z])).{5,}$/';
- protected function validateAttribute($object,$attribute)
- {
- // check the strength parameter used in the validation rule of our model
- if ($this->strength == 'weak')
- $pattern = $this->weak_pattern;
- elseif ($this->strength == 'strong')
- $pattern = $this->strong_pattern;
- // extract the attribute value from it's model object
- $value=$object->$attribute;
- if(!preg_match($pattern, $value))
- {
- $this->addError($object,$attribute,'your password is too weak!');
- }
- }
然后在模型(model)的:
- /**
- * @return array validation rules for model attributes.
- */
- public function rules()
- {
- return array(
- array('password', 'ext.MyValidators.passwordStrength', 'strength'=>self::STRONG),
- );
- }
由于我们直接在User AR类中添加了$repassword属性,并且它与底层数据库表之间没有对应关系,我们需要告诉模型类允许这个属性在setAttributes()被调用时被设置。 保存时不能入库需要添加rules验证验证器 。我们的做法是将其添加到User模型类的安全属性列表中。向User::rules()数组添加下列代码:
- array('repassword', 'safe'),
我们新建的$repassword不存在对应的tbl_user表中的列,需要将其直接添加到安全属性列表。
setAttributes:
- $model->attributes=$_POST['User'];
添加了$repassword属性
- class User extends CActiveRecord
- {
- public $repassword; //不能是private会报错 以注册验证为例.controller
- public function actionRegister()
- {
- $model=new User;
- if(isset($_POST['User']))
- {
- $model->attributes=$_POST['User'];
- if($model->save()){
- Yii::app()->user->setFlash('register','Thank you for your register.');//验证通过提示
- $this->refresh();
- }
- }
- $this->render('register',array(
- 'model'=>$model,
- ));
- }
register.php
- <h1>注册用户</h1>
- <?php if(Yii::app()->user->hasFlash('register')): ?>
- <div class="flash-success">
- <?php echo Yii::app()->user->getFlash('register'); ?>
- </div>
- <?php else: ?>
- <div class="form">
- <?php $form=$this->beginWidget('CActiveForm', array(
- 'id'=>'user-form',
- 'enableAjaxValidation'=>false,
- ));
- ?>
- <p class="note">Fields with <span class="required">*</span> are required.</p>
- <?php echo $form->errorSummary($model); ?>
- <div class="row">
- <?php echo $form->labelEx($model,'password'); ?>
- <?php echo $form->passwordField($model,'password',array('size'=>60,'maxlength'=>128, 'autocomplete'=>'off','value'=>'')); ?>
- <?php echo $form->error($model,'password'); ?>
- <?php //echo $model->getError('password'); ?>
- </div>
- <div class="row">
- <?php echo $form->labelEx($model,'repassword'); ?>
- <?php echo $form->passwordField($model,'repassword',array('size'=>60,'maxlength'=>128, 'autocomplete'=>'off','value'=>'')); ?>
- <?php echo $form->error($model,'repassword'); ?>
- </div>
- <div class="row buttons">
- <?php echo CHtml::submitButton('注册'); ?>
- </div>
- <?php $this->endWidget(); ?>
- </div>
- <?php endif; ?>
ajax动态验证
第一步:在_form中最上面改成
- $form=$this->beginWidget('CActiveForm', array(
- 'id'=>'user-form',
- 'enableAjaxValidation'=>true,
- )
第二步:controller中添加,对应 'id'=>'user-form'
- $this->performAjaxValidation($model);
- protected function performAjaxValidation($model)
- {
- if(isset($_POST['ajax']) && $_POST['ajax']==='user-form')
- {
- echo CActiveForm::validate($model);
- Yii::app()->end();
- }
- }
第三步:在models层中加入checkemai方法
- public function rules()
- {
- // NOTE: 可以用exist验证器替换
- return array(
- array('email', 'checkUser','message'=>'Test message for email validation'),
- array('user_id', 'checkUser','message'=>'Test message for {attribute} validation'),
- );
- }
- public function checkUser($attribute,$params) //attribute用法
- {
- switch($attribute){
- case "email": //rules email
- $models = ServiceReviews::model()->findAllByAttributes(array('email' =>$this->email,'service_id'=>$this->service_id));
- if(count($models)>0){
- $this->addError($attribute, $params['message']);
- }
- break;
- case "user_id":
- if(Yii::app()->user->isGuest){
- $models = ServiceReviews::model()->findAllByAttributes(array('user_id' =>Yii::app()->user->id,'service_id'=>$this->service_id));
- if(count($models)>0){
- $this->addError($attribute, $params['message']);
- }
- }
- break;
- }
- }
最后在models层的验证规则中(rules)加入以下验证规则{attribute}
- array('email', 'checkUser','message'=>'已经存在{attribute}'),
刚才创建的方法需要两个参数:
* $attribute 需要验证的属性
* $params 在规则中自定义的参数
在模型的 rules 方法中我们验证的是email属性,所以在验证规则中需要验证的属性值应该是 email.
在 rules 方法中我们还设置了自定义的参数 message,它的值将会放到 $params 数组中.
三.非表单验证错误处理 :
你会发现在方法中我们使用了 CModel::addError().添加错误接受两个参数:第一个参数是在表单中显示错误的属性名,第二个参数时显示的错误信息 。
用户提交表单时,可能除表单验证之外还有与表单各输入项无关的其他错误产生,例如后台数据库出错、接口调用失败等。
这种情况下可以在Model中相应的位置使用如下代码记录错误:
- $this->addError('info', '发送不明错误,请重试'); // info 只是一个自定义的名字,不需要真正有这个字段或属性。
然后在视图文件中这样输出错误:
- echo $form->error($model, 'info'); //$form 是 CActiveForm 的实例。$form->getErrors();
当我们调用 CModel::validate() 方法, 我们可以指定一个场景参数. 只有在特定的场景下校验规则才会生效.校验规则会在那些 on 选项没有被设置或者包含了指定的场景名称的场景中生效.如果我们没有指定场景,而调用了 CModel::validate() 方法,只有那些 on 选项没有设置的规则才会被执行 .
- $model = new model('register');
- // or $model=new User;
- // $model->scenario='register';
例如,在注册一个用户时,我们运行以下脚本来执行校验 :
- array('password', 'compare', 'compareAttribute'=>'repassword', 'on'=>'register,edit'),
- Email验证器
- array('email','email'), //验证email这个字段必须符合email格式
- Compare验证器
- array('password2','compare','compareAttribute'=>'password1'),//验证password1和password2必须一致
- array('end_date','compare', 'compareAttribute' => 'start_date', 'operator' => '>', 'message' => '错误的开始结束日期'),
- Unique验证器
- array('username,email','unique','className'=>'User'),//User为Model,username,email在user中不允许重复
- 如果被验证属性为空,就认为完全合法,立刻返回,但是如果allowEmpty为false的话,就要通过函数后续的所有验证条件 。那么对于一个传入的空值来说,allowEmpty无论是true还是false,极有可能都不会报错,上面节选的验证器是StringValidator,如果我没有设定min的值,那么一个空串在allowEmpty为false的情况下,还是不会报任何错误的。
- 如果希望一个属性值不能为空,最好还是用RequiredValidator来验证,allowEmpty是不靠谱的,建议一般就采取allowEmpty的默认值true,可以节省几次判断。
- array('verifyCode', 'captcha', 'allowEmpty'=>!CCaptcha::checkRequirements()),
- 布尔验证器
- array('rememberMe', 'boolean'),
- 数字验证器
- array('id', 'numerical', 'min'=>1, 'max'=>10, 'integerOnly'=>true),
- default验证器 datetime格式
- array('created','default','value'=>new CDbExpression('NOW()'),'setOnEmpty'=>false)
- fiter验证器
- array('moduleID', 'filter', 'filter'=>'trim'),
- 正则验证器
- array('name','match','pattern'=>'/^[a-z0-9\-_]+$/'),
- in验证器
- array('superuser', 'in', 'range' => array(0, 1)),
- length验证器
- array('password','length','min'=>'6','max'=>'16','message'=>'{attribute}长度必须在{min}到{max}之间'),
- 类型验证 integer,float,string,array,date,time,datetime
- array('created', 'type', 'datetime'),
- 日期格式验证
- array('created', 'date', 'format'=>'yyyy/MM/dd/ HH:mm:ss'),
- 文件验证
- array('filename', 'file', 'allowEmpty'=>true, 'types'=>'zip, rar, xls, pdf, ppt'),
- array(
- array(‘username’, ‘required’),
- array(‘username’, ‘length’, ‘min’=>3, ‘max’=>12),
- array(‘password’, ‘compare’, ‘compareAttribute’=>’password2′, ‘on’=>’register’),
- array(‘password’, ‘authenticate’, ‘on’=>’login’),
- array(‘Price’,’numerical’, ‘integerOnly’=>true),
- );
- public function rules()
- {
- return array(
- array(‘title, content, status’, ‘required’),
- array(‘title’, ‘length’, ‘max’=>128),
- array(‘status’, ‘in’, ‘range’=>array(1,2,3)),
- array(‘tags’, ‘match’, ‘pattern’=>’/^[\w\s,]+$/’,
- ‘message’=>’Tags can only contain word characters.’),
- array(‘tags’, ‘normalizeTags’),
- array(‘title, status’, ‘safe’, ‘on’=>’search’),
- );
- }
经常用到的属性有 attributes,builtInvalidators,message,on这四个
下面是对应的验证类
- required: CRequiredValidator
- filter: CFilterValidator
- match: CRegularExpressionValidator
- email: CEmailValidator
- url: CUrlValidator
- unique: CUniqueValidator
- compare: CCompareValidator
- length: CStringValidator
- in: CRangeValidator
- numerical: CNumberValidator
- captcha: CCaptchaValidator
- type: CTypeValidator
- file: CFileValidator
- default: CDefaultValueValidator
- exist: CExistValidator
- boolean: CBooleanValidator
- date: CDateValidator
- safe: CSafeValidator
- unsafe: CUnsafeValidator
- 1、CRequiredValidator – 必须值验证属性
- requiredValue-mixed-所需的值
- strict-boolean-是否比较严格
- 实例: array(‘username’, ‘required’), 不能为空
- array(‘username’, ‘required’, ‘requiredValue’=>’lh’,’message’=> ‘usernmae must be lh’), 这个值必须为lh,如果填其他值还是会验证不过
- array(‘username’, ‘required’, ‘requiredValue’=>’lh’, ‘strict’=>true), 严格验证 还可以在后面加 ‘message’=>”,’on’=>这些
- 2、CFilterValidator 过滤验证属性
- filter – 方法名 (调用用户自己定义的函数)
- 实例:
- array(‘username’, ‘test’) function test() { $username = $this->username; if($username != ‘lh’){ $this->addError(‘username’, ‘username must be lh’); } }
- 使用这个方法如果你还在array里面写message=>”,给出的提示信息还是你的test里面的。也就是以test里面的错误信息为准
- 3、CRegularExpressionValidator -
- 正则验证属性allowEmpty – 是否为空(默认true)
- not-是否反转的验证逻辑(默认false) pattern – 正则表达式匹配实例:
- // 匹配a-z array(‘username’, ‘match’, ‘allowEmpty’=>true, ‘pattern’=>’/[a-z]/i’,’message’=>’必须为字母’),
- // 匹配不是a-z array(‘username’, ‘match’, ‘allowEmpty’=>true, ‘not’=>true, ‘pattern’=>’/[a-z]/i’,’message’=>’必须不是字母’),
- 4、CEmailValidator –邮箱验证属性:
- allowEmpty – 是否为空
- allowName – 是否允许在电子邮件地址的名称
- checkMx – 是否检查电子邮件地址的MX记录
- checkPort – 是否要检查端口25的电子邮件地址
- fullPattern – 正则表达式,用来验证电子邮件地址与名称的一部分
- pattern – 正则表达式,
- 用来验证的属性值实例: array(‘username’, ‘email’, ‘message’=>’必须为电子邮箱’, ‘pattern’=>’/[a-z]/i’),
- 5、CUrlValidator – url验证属性:
- allowEmpty – 是否为空
- defaultScheme – 默认的URI方案
- pattern – 正则表达式
- validSchemes – 清单应视为有效的URI计划。
- 实例:
- array(‘username’, ‘url’, ‘message’=>’must url’),
- array(‘username’, ‘url’, ‘defaultScheme’=>’http://www.baidu.com’),
- 6、CUniqueValidator – 唯一性验证属性:
- allowEmpty – 是否为空
- attributeName – 属性名称
- caseSensitive – 区分大小写
- className – 类名
- criteria – 额外的查询条件
- 实例:
- array(‘username’, ‘unique’, ‘message’=>’该记录存在’),
- array(‘username’, ‘unique’, ‘caseSensitive’=>false, ‘message’=>’该记录存在’),
- 7、CCompareValidator – 比较验证属性:
- allowEmpty – 是否为空
- compareAttribute – 需要比较的属性
- compareValue -比较的值
- operator – 比较运算符
- strict – 严格验证(值和类型都要相等)
- 实例: // 与某个值比较 array(‘username’, ‘compare’, ‘compareValue’=>’10′, ‘operator’=>’>’, ‘message’=>’必须大于10′),
- // 与某个提交的属性比较 array(‘username’, ‘compare’, ‘compareAttribute’=>’password’, ‘operator’=>’>’, ‘message’=>’必须大于password’),
- 8、CStringValidator – 字符串验证属性:
- allowEmpty – 是否为空
- encoding – 编码
- is – 确切的长度
- max – 最大长度
- min – 最小长度
- tooLong – 定义值太大的错误
- tooShort – 定义最小长度的错误
- 实例: array(‘username’, ‘length’, ‘max’=>10, ‘min’=>5, ‘tooLong’=>’太长了’, ‘tooShort’=>’太短了’),
- array(‘username’, ‘length’, ‘is’=>5, ‘message’=>’长度必须为5′),
- 9、CRangeValidator – 在某个范围内属性:
- allowEmpty – 是否为空
- not – 是否反转的验证逻辑。
- range – array范围
- strict – 严格验证(类型和值都要一样)
- 实例: array(‘username’, ‘in’, ‘range’=>array(1,2,3,4,5), ‘message’=>’must in 1 2 3 4 5′),
- array(‘username’, ‘in’, ‘not’=>true, ‘range’=>array(1,2,3,4,5), ‘message’=>’must not in 1 2 3 4 5′),
- 10、CNumberValidator – 数字验证属性:
- allowEmpty – 是否为空
- integerOnly – 整数
- integerPattern – 正则表达式匹配整数
- max – 最大值
- min – 最小值
- numberPattern – 匹配号码
- tooBig – 值太大时的错误提示
- tooSmall – 值太小时的错误提示
- 实例: array(‘username’, ‘numerical’, ‘integerOnly’=>true, ‘message’=>’must be int’),
- array(‘username’, ‘numerical’, ‘integerOnly’=>true, ‘message’=>’must be int’, ‘max’=>100, ‘min’=>10, ‘tooBig’=>’is too big’, ‘tooSmall’=>’is too small’),
- 11、CCaptchaValidator – 验证码验证属性:
- allowEmpty – 是否为空
- caseSensitive – 区分大小写
- 12、CTypeValidator – 类型验证属性:
- allowEmpty – 是否为空
- dateFormat – 日期应遵循的格式模式(‘MM/dd/yyyy’)
- datetimeFormat – 日期时间应遵循的格式模式(‘MM/dd/yyyy hh:mm’)
- timeFormat – 时间应遵循的格式模式(‘hh:mm’)
- type – 类型 ‘string’, ‘integer’, ‘float’, ‘array’, ‘date’, ‘time’ and ‘datetime’
- 实例: array(‘username’, ‘type’, ‘dateFormat’=>’MM/dd/yyyy’, ‘type’=>’date’),
- 13、CFileValidator – 文件验证属性:
- allowEmpty – 是否为空
- maxFiles – 最大文件数
- maxSize – 文件的最大值
- minSize – 最小值
- tooLarge – 太大时的错误信息
- tooMany – 太多时的错误信息
- tooSmall – 太小时的错误信息
- types – 允许的文件扩展名
- wrongType – 扩展名错误时给出的错误信息
- 14、CDefaultValueValidator – 默认值属性:
- setOnEmpty – 设置为空
- value – 默认值
- 实例: array(‘username’, ‘default’, ‘setOnEmpty’=>true, ‘value’=>’lh’),
- 15、CExistValidator – 是否存在属性:
- allowEmpty = 是否为空
- attributeName – 属性名称
- className – 类名
- criteria – 标准
- 16、CBooleanValidator – 布尔类型验证属性:
- allowEmpty – 是否为空
- falseValue – 错误状态的值
- strict – 严格验证
- trueValue – 真实状态的值
- 实例: array(‘username’, ‘boolean’, ‘trueValue’=>1, ‘falseValue’=>-1, ‘message’=>’the value must be 1 or -1′),
- 17、CDateValidator – 日期验证属性:
- allowEmpty – 是否为空
- format – 日期值应遵循的格式模式
- timestampAttribute – 接收解析结果的属性名称
- 实例: array(‘username’, ‘date’, ‘format’=>’MM-dd-yyyy’,’message’=>’must be MM-dd-yyyy’),
- <?php
- class ContactForm extends CFormModel
- {
- public $_id;
- public $contact;//联系人
- public $tel;//电话
- public $fax;//传真
- public $zipcode;//邮编
- public $addr;//地址
- public $mobile;//手机
- public $email;//邮箱
- public $website;//网址
- public $qq;//QQ
- public $msn;//MSN
- public function rules()
- {
- return array(
- array('contact','required','on'=>'edit','message'=>'联系人必须填写.'),
- array('contact','length','on'=>'edit','min'=>2,'max'=>10,'tooShort'=>'联系人长度请控制在2-10个字符.','tooLong'=>'联系人长度请控制在2-10个字符.'),
- array('tel', 'match','pattern' => '/^(\d{3}-|\d{4}-)(\d{8}|\d{7})?$/','message' => '请输入正确的电话号码.'),
- array('fax', 'match','pattern' => '/^(\d{3}-|\d{4}-)(\d{8}|\d{7})?$/','message' => '请输入正确的传真号码.'),
- array('mobile', 'match','pattern' => '/^13[0-9]{1}[0-9]{8}$|15[0189]{1}[0-9]{8}$|189[0-9]{8}$/','message' => '请输入正确的手机号码.'),
- array('email','email','on'=>'edit','message'=>'邮箱输入有误.'),
- array('zipcode','required','on'=>'edit','message'=>'邮编必须填写.'),
- array('zipcode','numerical','on'=>'edit','message'=>'邮编是6位数字.'),
- array('zipcode','length','on'=>'edit','min'=>6,'max'=>6,'tooShort'=>'邮编长度为6位数.','tooLong'=>'邮编长度为6位数.'),
- array('website','url','on'=>'edit','message'=>'网址输入有误.'),
- array('qq', 'match','pattern' => '/^[1-9]{1}[0-9]{4,11}$/','message' => '请输入正确的QQ号码.'),
- array('msn','email','on'=>'edit','message'=>'MSN输入有误.'),
- );
- }
- }
- public function rules()
- {
- return array(
- array('project_id, type_id, status_id, owner_id, requester_id,', 'numerical', 'integerOnly'=>true),
- array('name', 'length', 'max'=>256),
- array('description', 'length', 'max'=>2000),
- array('create_time,create_user_id,update_user_id, update_time', 'safe'),
- array('id, name, description, project_id, type_id, status_id, owner_id', 'on'=>'search'),
- );
- }
- //required: 必填
- array('title,content','required'),
- //match: 正则表达式验证
- array('birthday', 'match', 'pattern'=>'%^\d{4}(\-|\/|\.)\d{1,2}\1\d{1,2}$%', 'allowEmpty'=>true, 'message'=>'生日必须是年-月-日格式'),
- //email:邮箱格式验证
- array('user_mail', 'email'),
- //url:URL格式验证
- array('user', 'url'),
- //unique:唯一性验证
- array('username', 'unique','caseSensitive'=>false,'className'=>'user','message'=>'用户名"{value}"已经被注册,请更换'),
- //caseSensitive 定义大小写是否敏感
- //compare:一致性验证
- array('repassword', 'compare', 'compareAttribute'=>'password','message'=>'两处输入的密码并不一致'),
- //length:长度验证
- //in: 验证此属性值在列表之中(通过range指定)。
- //numerical: 验证此属性的值是一个数字
- //captcha: 验证属性值和验证码中显示的一致
- array('verifyCode','captcha'),
- //type: 验证属性的类型是否为type所指定的类型.
- //file: 验证一个属性是否接收到一个有效的上传文件
- //default: 属性指定默认值
- //exist: 验证属性值在数据库中是否存在
- //boolean: 验证布尔属性值
- //date: 检验此属性是否描述了一个日期、时间或日期时间
- //safe: 属性标志为在批量赋值时是安全的。
- //unsafe: 标志为不安全,所以他们不能被批量赋值。