首页 > 活着 > YII 验证和消息

YII 验证和消息

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

Java代码
1. 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.?>
# 成功信息提示
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

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. }
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)的:

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.}
/**
* @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()数组添加下列代码:

Java代码
1.array(‘repassword’, ‘safe’),
array(‘repassword’, ‘safe’),我们新建的$repassword不存在对应的tbl_user表中的列,需要将其直接添加到安全属性列表。

setAttributes:

Java代码
1.$model->attributes=$_POST[‘User’];
$model->attributes=$_POST[‘User’];
添加了$repassword属性

Java代码
1.class User extends CActiveRecord
2.{
3. public $repassword; //不能是private会报错
class User extends CActiveRecord
{
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.}
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

Java代码
1.

注册用户

2.user->hasFlash(‘register’)): ?>
3.
4.

5. user->getFlash(‘register’); ?>
6.

7.
8.
9.
10.

11.beginWidget(‘CActiveForm’, array(
12. ‘id’=>’user-form’,
13. ‘enableAjaxValidation’=>false,
14.));
15.?>
16.

Fields with * are required.

17.
18. errorSummary($model); ?>
19.
20.

21. labelEx($model,’password’); ?>
22. passwordField($model,’password’,array(‘size’=>60,’maxlength’=>128, ‘autocomplete’=>’off’,’value’=>”)); ?>
23. error($model,’password’); ?>
24.

25.
26.

27. labelEx($model,’repassword’); ?>
28. passwordField($model,’repassword’,array(‘size’=>60,’maxlength’=>128, ‘autocomplete’=>’off’,’value’=>”)); ?>
29. error($model,’repassword’); ?>
30.

31.
32.

33.
34.

35.
36.endWidget(); ?>
37.

38.
39.

注册用户

user->hasFlash(‘register’)): ?>

user->getFlash(‘register’); ?>

beginWidget(‘CActiveForm’, array(
‘id’=>’user-form’,
‘enableAjaxValidation’=>false,
));
?>

Fields with * are required.

errorSummary($model); ?>

labelEx($model,’password’); ?>
passwordField($model,’password’,array(‘size’=>60,’maxlength’=>128, ‘autocomplete’=>’off’,’value’=>”)); ?>
error($model,’password’); ?>
labelEx($model,’repassword’); ?>
passwordField($model,’repassword’,array(‘size’=>60,’maxlength’=>128, ‘autocomplete’=>’off’,’value’=>”)); ?>
error($model,’repassword’); ?>

endWidget(); ?>

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

Java代码
1.$form=$this->beginWidget(‘CActiveForm’, array(
2. ‘id’=>’user-form’,
3. ‘enableAjaxValidation’=>true,
4.)
$form=$this->beginWidget(‘CActiveForm’, array(
‘id’=>’user-form’,
‘enableAjaxValidation’=>true,
)第二步: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.}
$this->performAjaxValidation($model);

protected function performAjaxValidation($model)
{
if(isset($_POST[‘ajax’]) && $_POST[‘ajax’]===’user-form’)
{
echo CActiveForm::validate($model);
Yii::app()->end();
}
}第三步:在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.}
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}

Java代码
1.array(‘email’, ‘checkUser’,’message’=>’已经存在{attribute}’),
array(‘email’, ‘checkUser’,’message’=>’已经存在{attribute}’),刚才创建的方法需要两个参数:
* $attribute 需要验证的属性
* $params 在规则中自定义的参数
在模型的 rules 方法中我们验证的是email属性,所以在验证规则中需要验证的属性值应该是 email.

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

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

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

Java代码
1.$this->addError(‘info’, ‘发送不明错误,请重试’); // info 只是一个自定义的名字,不需要真正有这个字段或属性。
$this->addError(‘info’, ‘发送不明错误,请重试’); // info 只是一个自定义的名字,不需要真正有这个字段或属性。然后在视图文件中这样输出错误:

Java代码
1.echo $form->error($model, ‘info’); //$form 是 CActiveForm 的实例。$form->getErrors();
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';
$model = new model(‘register’);
// or $model=new User;
// $model->scenario=’register';例如,在注册一个用户时,我们运行以下脚本来执行校验 :

Java代码
1.array(‘password’, ‘compare’, ‘compareAttribute’=>’repassword’, ‘on’=>’register,edit’),
array(‘password’, ‘compare’, ‘compareAttribute’=>’repassword’, ‘on’=>’register,edit’), Email验证器

Java代码
1.array(‘email’,’email’), //验证email这个字段必须符合email格式
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’ => ‘错误的开始结束日期’),
array(‘password2′,’compare’,’compareAttribute’=>’password1′),//验证password1和password2必须一致
array(‘end_date’,’compare’, ‘compareAttribute’ => ‘start_date’, ‘operator’ => ‘>’, ‘message’ => ‘错误的开始结束日期’),Unique验证器

Java代码
1.array(‘username,email’,’unique’,’className’=>’User’),//User为Model,username,email在user中不允许重复
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()),
array(‘verifyCode’, ‘captcha’, ‘allowEmpty’=>!CCaptcha::checkRequirements()),布尔验证器

Java代码
1.array(‘rememberMe’, ‘boolean’),
array(‘rememberMe’, ‘boolean’),数字验证器

Java代码
1.array(‘id’, ‘numerical’, ‘min’=>1, ‘max’=>10, ‘integerOnly’=>true),
array(‘id’, ‘numerical’, ‘min’=>1, ‘max’=>10, ‘integerOnly’=>true),default验证器 datetime格式

Java代码
1.array(‘created’,’default’,’value’=>new CDbExpression(‘NOW()’),’setOnEmpty’=>false)
array(‘created’,’default’,’value’=>new CDbExpression(‘NOW()’),’setOnEmpty’=>false)fiter验证器

Java代码
1.array(‘moduleID’, ‘filter’, ‘filter’=>’trim’),
array(‘moduleID’, ‘filter’, ‘filter’=>’trim’),正则验证器

Java代码
1.array(‘name’,’match’,’pattern’=>’/^[a-z0-9\-_]+$/’),
array(‘name’,’match’,’pattern’=>’/^[a-z0-9\-_]+$/’),in验证器

Java代码
1.array(‘superuser’, ‘in’, ‘range’ => array(0, 1)),
array(‘superuser’, ‘in’, ‘range’ => array(0, 1)),
length验证器

Java代码
1.array(‘password’,’length’,’min’=>’6′,’max’=>’16’,’message’=>'{attribute}长度必须在{min}到{max}之间’),
array(‘password’,’length’,’min’=>’6′,’max’=>’16’,’message’=>'{attribute}长度必须在{min}到{max}之间’), 类型验证 integer,float,string,array,date,time,datetime

Java代码
1.array(‘created’, ‘type’, ‘datetime’),
array(‘created’, ‘type’, ‘datetime’),日期格式验证

Java代码
1.array(‘created’, ‘date’, ‘format’=>’yyyy/MM/dd/ HH:mm:ss’),
array(‘created’, ‘date’, ‘format’=>’yyyy/MM/dd/ HH:mm:ss’),文件验证

Java代码
1.array(‘filename’, ‘file’, ‘allowEmpty’=>true, ‘types’=>’zip, rar, xls, pdf, ppt’),

setFlash(), getFlash()可以完成验证成功后提示 Java代码 1. 2.errorSumm […]

  1. 还没有评论
评论提交中, 请稍候...

留言

(Spamcheck Enabled)

Trackbacks & Pingbacks ( 0 )
  1. 还没有 trackbacks