参考:
http://www.yiiframework.com/wiki/266/understanding-scenarios/
http://www.yiiframework.com/wiki/56/reference-model-rules-validation/
http://php.refulz.com/yii-framework-scenarios-for-conditional-multiple-validation-rules/
规则列表写法格式:
虽然可以 多字段 同一个验证规则,多个场景。
array(‘field1,…,field20’, ‘required’, on=>‘insert,update,registration’);
但下面这种写法可读性更高些:
//所有场景
array(‘fiedl1,…field20’, ‘required’);//先定义required规则
array(‘fiedl1,…field20’, ‘email’);//其他规则
//…
//特定场景insert
array(‘field1,…,’, ‘required’, ‘on’=>‘insert’);//再定义场景的required规则
array(‘field1,…,’, ’ yourValidator’, ‘on’=>‘insert’);//再定义场景的其他规则
//特定场景update
array(‘field1,…,’, ‘required’, ‘on’=>‘update’);//再定义场景的required规则
array(‘field1,…,’, ’ yourValidator’, ‘on’=>’ update’);//再定义场景的其他规则
//…
//特定场景search
array(‘field1,…,’, ‘required’, ‘on’=>‘search’);//再定义场景的required规则
array(‘field1,…,’, ‘yourValidator’, ‘on’=>’ search’);//再定义场景的其他规则
//…
场景的命名:
在一些复杂的应用中,数据入库方式有多种,比如:
Web注册 r=user/registrion/reginstrion、
Web注册后向导 r=user/guide/step1、
Web资料完善 r=user/profile/profile、
App注册 r=api/registrion/reginstrion、
App注册后向导 api/guide/step1、
App资料完善 api/profile/profile,
他们所需要的收集的信息和验证规则有所差异(一般来说 主要在必填字段的差异),那么默认的几个场景名称(在CAtiveRecord中有insert、update、search)就不太够用了,那么场景名称以Yii::app()->controller->route来定义吧?
关于场景的使用:
1.在实例化时即指定
$model = new User(‘changepwd’);
2.在实例化之后手工指定
$model = User::model()->findByPk($id);
$model->scenario = ‘changepwd’;
3.在验证时指定
//Case 1
$model1 = User::model()->findByPk($id)
//Case 2
$model2 = new User();
$model1->validate(‘changepwd’);
$model2->validate(‘changepwd’);
关于验证规则的动态调整:
1.添加规则:
$validator = new CNumberValidator;
$validator->attributes = array(‘id’);
$validator->integerOnly = true;
$model->validatorList->add($validator);
等同于
array(‘id’, ‘numerical’, ‘integerOnly’ => true),
2.删除规则????由于基于CList,貌似不好删改~~~~