Yii CModel.rules()方法 、validate预定义完整列表

 

public array rules ()
{return}
array 要调用 validate() 时应用的有效性规则。

返回属性的有效性规则。

声明验证规则,应重写此方法。 每个规则是数组具有以下结构:

array(‘attribute list’, ‘validator name’, ‘on’=>’scenario name’, …validation parameters…)

注:

*

attribute list: 指定属性 (以逗号分隔) 进行验证 ;

*

validator name: 指定要使用的验证程序。
它可以是方法的一个模型类的一个内置的验证器或验证程序类 (或其路径的别名) 名称的名称。

一种验证方法必须具有以下签名:

// $params refers to validation parameters given in the rule

function validatorName($attribute,$params)

内置的验证程序是指在 CValidator::builtInValidators 中声明的验证程序之一。 验证程序的类是扩展 CValidator 的类。
*

on: 应执行有效性规则时,此选项指定的情形。
用逗号分开不同的方案。
如果未设置此选项,将在任何情况下应用规则。
请 方案
中有关此选项的更多详细信息,参阅。

* 附加参数用于初始化相应的验证程序属性。 请参阅 individal 验证器类 API 可能的属性。

以下是一些例子:

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),
);

预定义完整列表:

*

boolean : CBooleanValidator 的别名, 确保属性的值是CBooleanValidator::trueValue 或 CBooleanValidator::falseValue .
*

captcha : CCaptchaValidator 的别名,确保了特性的值等于 CAPTCHA 显示出来的验证码.
*

compare : CCompareValidator 的别名, 确保了特性的值等于另一个特性或常量.
*

email : CEmailValidator 的别名,确保了特性的值是一个有效的电邮地址.
*

default : CDefaultValueValidator 的别名, 为特性指派了一个默认值.
*

exist : CExistValidator 的别名, 确保属性值存在于指定的数据表字段中.
*

file : CFileValidator 的别名, 确保了特性包含了一个上传文件的名称.
*

filter : CFilterValidator 的别名, 使用一个filter转换属性.
*

in : CRangeValidator 的别名, 确保了特性出现在一个预订的值列表里.
*

length : CStringValidator 的别名, 确保了特性的长度在指定的范围内.
*

match : CRegularExpressionValidator 的别名, 确保了特性匹配一个正则表达式.
*

numerical : CNumberValidator 的别名, 确保了特性是一个有效的数字.
*

required : CRequiredValidator 的别名, 确保了特性不为空.
*

type : CTypeValidator 的别名, 确保了特性为指定的数据类型.
*

unique : CUniqueValidator 的别名, 确保了特性在数据表字段中是唯一的.
*

url : CUrlValidator 的别名, 确保了特性是一个有效的路径.

验证的实现:

事实上CModel.rules()+CActiveForm.validate的结合就实现验证功能了。

例子:

【view】

beginWidget(‘CActiveForm’); ?>

errorSummary($model); ?> //注1:这里显示出错时,报错的地方

……

endWidget(); ?>

【control】

$model=new user;

if(isset($_POST['user']))

{

$model->attributes=$_POST['user'];

if($model->validate() && $model->save()) //注2:$model->validate()就是在调用model.rules进行验证

$this->redirect(array(‘view’,'id’=>$model->id));

}

【model】

class user extends CActiveRecord

……

public function rules()

{

// NOTE: you should only define rules for those attributes that

// will receive user inputs.

return array(

array(‘username, password, email’, ‘required’),

array(‘username, password, email’, ‘length’, ‘max’=>128),

array(‘id, username, password, email’, ‘safe’, ‘on’=>’search’),

);

}

……

要实现更强大复杂的验证功能也就在rules()里做文章了。

有关用Ajax验证,会在Ajax专题中具体介绍。当然有必要时,也会再加的。

 

 

 

 

==================================================

遇到个很囧的model rules问题(测试create与update的username)

1.array('username', 'required')
测试结果:create 生效(正常), update 生效(正常)

2.array('username', 'required', 'on' => 'create, update')

测试结果:create不生效(不正常), update 生效(正常)

3.array('username', 'required', 'on' => 'create')
测试结果:create不生效(不正常), update 不生效(正常)

4.array('username', 'required', 'on' => 'update')
测试结果:create不生效(正常), update 生效(正常)

 

----=====-------=======----------=======---------========------

缺省 new 出来的 model 实例的 scenario 是 insert 而不是 create ,你应该用 $model = new ModelClass('create'); 去试试。

-------------------------

怪不得我以前写 create时候失败 后来new XXXXX('create')才可以 原来缺省 insert.

 

 

 

 

 

===========================================

1.场景(scenario)多了怎么办?
项目中的user model,场景有10几个:注册,登录,修改用户基本资料,修改用户附属资料,修改用户密码,修改头像,修改用户隐私策略,修改用户tag,修改用户兴趣,爱好等等.
这么多场景(scenario)和验证(validation)交织在一起,觉得很混乱,CModel::rules函数很难写
2.验证(validation)不能用全局函数么??这样的话有很多验证要重复去写
------------------------------------------------------------------------
比如User Model中,有对user_name的validation_rule
在其他model中,比如用户好友,博客作者用户名等Model中,还要重复的去写相应的验证规则
比如我要在项目中的很多model中写上规则
array('user_name','match','pattern'=>'/^[a-zA-Z0-9_]{4,16}$/u','message'=>'账号只能由4-16个字母,数字,下划线组成'),

这样的话比如以后验证策略变了,要求用户名只能是10个字符以内,就比较麻烦,要把项目中所有model中验证user_name的规则进行修改

--------------====================---------------------------==================

  • 尽量不要用Model里面的rules,应该用Form里面的rules
  • 可以写自定义的validation,然后直接 array('user_name','ext.your_validation');

    --------------------------------

    1.据你所说的意思应该是你在每一个功能点上者应用了一个场景吧?我想应该没这个必要,设置场景一般为了区别于一般情况的验证,比如注册需要验证确认密码字段而其它情况下不需要验证这个字段,像这种情况就可以把“确认密码”这个字段的验证指定一个场景而其它的字段默认应用于所有的场景,不需要每一个能点上应用一个场景。
    2.多个模型都要用到的验证规则可以自己写成一个验证类,然后在各个model的rule中去运用这个类
    -------------------------------

    Form 是 Form,modelmodel,不同的。

    当然,gii 生成的代码,是省略了 Form,直接拿 model 当 form 用,自然是 modelrules 判断了。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值