原文地址:http://blog.csdn.net/hy840429/article/details/6725660
public array rules ()
{return}
array 要調(diào)用 validate() 時(shí)應(yīng)用的有效性規(guī)則。
返回屬性的有效性規(guī)則。
聲明驗(yàn)證規(guī)則,應(yīng)重寫(xiě)此方法。 每個(gè)規(guī)則是數(shù)組具有以下結(jié)構(gòu):
array(‘a(chǎn)ttribute list’, ‘validator name’, ‘on’=>’scenario name’, …validation parameters…)
注:
*
attribute list: 指定屬性 (以逗號(hào)分隔) 進(jìn)行驗(yàn)證 ;
*
validator name: 指定要使用的驗(yàn)證程序。
它可以是方法的一個(gè)模型類(lèi)的一個(gè)內(nèi)置的驗(yàn)證器或驗(yàn)證程序類(lèi) (或其路徑的別名) 名稱(chēng)的名稱(chēng)。
一種驗(yàn)證方法必須具有以下簽名:
// $params refers to validation parameters given in the rule
function validatorName($attribute,$params)
內(nèi)置的驗(yàn)證程序是指在 CValidator::builtInValidators 中聲明的驗(yàn)證程序之一。 驗(yàn)證程序的類(lèi)是擴(kuò)展 CValidator 的類(lèi)。
*
on: 應(yīng)執(zhí)行有效性規(guī)則時(shí),此選項(xiàng)指定的情形。
用逗號(hào)分開(kāi)不同的方案。
如果未設(shè)置此選項(xiàng),將在任何情況下應(yīng)用規(guī)則。
請(qǐng) 方案
中有關(guān)此選項(xiàng)的更多詳細(xì)信息,參閱。
* 附加參數(shù)用于初始化相應(yīng)的驗(yàn)證程序?qū)傩浴?請(qǐng)參閱 individal 驗(yàn)證器類(lèi) API 可能的屬性。
以下是一些例子:
array(
array(‘username’, ‘required’),
array(‘username’, ‘length’, ‘min’=>3, ‘max’=>12),
array(‘password’, ‘compare’, ‘compareAttribute’=>’password2′, ‘on’=>’register’),
array(‘password’, ‘a(chǎn)uthenticate’, ‘on’=>’login’),
array(‘Price’,'numerical’, ‘integerOnly’=>true),
);
預(yù)定義完整列表:
*
boolean : CBooleanValidator 的別名, 確保屬性的值是CBooleanValidator::trueValue 或 CBooleanValidator::falseValue .
*
captcha : CCaptchaValidator 的別名,確保了特性的值等于 CAPTCHA 顯示出來(lái)的驗(yàn)證碼.
*
compare : CCompareValidator 的別名, 確保了特性的值等于另一個(gè)特性或常量.
*
email : CEmailValidator 的別名,確保了特性的值是一個(gè)有效的電郵地址.
*
default : CDefaultValueValidator 的別名, 為特性指派了一個(gè)默認(rèn)值.
*
exist : CExistValidator 的別名, 確保屬性值存在于指定的數(shù)據(jù)表字段中.
*
file : CFileValidator 的別名, 確保了特性包含了一個(gè)上傳文件的名稱(chēng).
*
filter : CFilterValidator 的別名, 使用一個(gè)filter轉(zhuǎn)換屬性.
*
in : CRangeValidator 的別名, 確保了特性出現(xiàn)在一個(gè)預(yù)訂的值列表里.
*
length : CStringValidator 的別名, 確保了特性的長(zhǎng)度在指定的范圍內(nèi).
*
match : CRegularExpressionValidator 的別名, 確保了特性匹配一個(gè)正則表達(dá)式.
*
numerical : CNumberValidator 的別名, 確保了特性是一個(gè)有效的數(shù)字.
*
required : CRequiredValidator 的別名, 確保了特性不為空.
*
type : CTypeValidator 的別名, 確保了特性為指定的數(shù)據(jù)類(lèi)型.
*
unique : CUniqueValidator 的別名, 確保了特性在數(shù)據(jù)表字段中是唯一的.
*
url : CUrlValidator 的別名, 確保了特性是一個(gè)有效的路徑.
驗(yàn)證的實(shí)現(xiàn):
事實(shí)上CModel.rules()+CActiveForm.validate的結(jié)合就實(shí)現(xiàn)驗(yàn)證功能了。
例子:
【view】
beginWidget(‘CActiveForm’); ?>
errorSummary($model); ?> //注1:這里顯示出錯(cuò)時(shí),報(bào)錯(cuò)的地方
……
endWidget(); ?>
【control】
$model=new user;
if(isset($_POST['user']))
{
$model->attributes=$_POST['user'];
if($model->validate() && $model->save()) //注2:$model->validate()就是在調(diào)用model.rules進(jìn)行驗(yàn)證
$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’),
);
}
……
要實(shí)現(xiàn)更強(qiáng)大復(fù)雜的驗(yàn)證功能也就在rules()里做文章了。
有關(guān)用Ajax驗(yàn)證,會(huì)在Ajax專(zhuān)題中具體介紹。當(dāng)然有必要時(shí),也會(huì)再加的。
==================================================
遇到個(gè)很?chē)宓?strong style="margin: 0px; padding: 0px;">model rules問(wèn)題(測(cè)試create與update的username)
1.array('username', 'required')
測(cè)試結(jié)果:create 生效(正常), update 生效(正常)
2.array('username', 'required', 'on' => 'create, update')
測(cè)試結(jié)果:create不生效(不正常), update 生效(正常)
3.array('username', 'required', 'on' => 'create')
測(cè)試結(jié)果:create不生效(不正常), update 不生效(正常)
4.array('username', 'required', 'on' => 'update')
測(cè)試結(jié)果:create不生效(正常), update 生效(正常)
----=====-------=======----------=======---------========------
缺省 new 出來(lái)的 model 實(shí)例的 scenario 是 insert 而不是 create ,你應(yīng)該用 $model = new ModelClass('create'); 去試試。
-------------------------
怪不得我以前寫(xiě) create時(shí)候失敗 后來(lái)new XXXXX('create')才可以 原來(lái)缺省 insert.
===========================================
1.場(chǎng)景(scenario)多了怎么辦?
項(xiàng)目中的user model,場(chǎng)景有10幾個(gè):注冊(cè),登錄,修改用戶(hù)基本資料,修改用戶(hù)附屬資料,修改用戶(hù)密碼,修改頭像,修改用戶(hù)隱私策略,修改用戶(hù)tag,修改用戶(hù)興趣,愛(ài)好等等.
這么多場(chǎng)景(scenario)和驗(yàn)證(validation)交織在一起,覺(jué)得很混亂,CModel::rules函數(shù)很難寫(xiě)
2.驗(yàn)證(validation)不能用全局函數(shù)么??這樣的話有很多驗(yàn)證要重復(fù)去寫(xiě)
------------------------------------------------------------------------
比如User Model中,有對(duì)user_name的validation_rule
在其他model中,比如用戶(hù)好友,博客作者用戶(hù)名等Model中,還要重復(fù)的去寫(xiě)相應(yīng)的驗(yàn)證規(guī)則
比如我要在項(xiàng)目中的很多model中寫(xiě)上規(guī)則
array('user_name','match','pattern'=>'/^[a-zA-Z0-9_]{4,16}$/u','message'=>'賬號(hào)只能由4-16個(gè)字母,數(shù)字,下劃線組成'),
這樣的話比如以后驗(yàn)證策略變了,要求用戶(hù)名只能是10個(gè)字符以?xún)?nèi),就比較麻煩,要把項(xiàng)目中所有model中驗(yàn)證user_name的規(guī)則進(jìn)行修改
--------------====================---------------------------==================
--------------------------------
1.據(jù)你所說(shuō)的意思應(yīng)該是你在每一個(gè)功能點(diǎn)上者應(yīng)用了一個(gè)場(chǎng)景吧?我想應(yīng)該沒(méi)這個(gè)必要,設(shè)置場(chǎng)景一般為了區(qū)別于一般情況的驗(yàn)證,比如注冊(cè)需要驗(yàn)證確認(rèn)密碼字段而其它情況下不需要驗(yàn)證這個(gè)字段,像這種情況就可以把“確認(rèn)密碼”這個(gè)字段的驗(yàn)證指定一個(gè)場(chǎng)景而其它的字段默認(rèn)應(yīng)用于所有的場(chǎng)景,不需要每一個(gè)能點(diǎn)上應(yīng)用一個(gè)場(chǎng)景。
2.多個(gè)模型都要用到的驗(yàn)證規(guī)則可以自己寫(xiě)成一個(gè)驗(yàn)證類(lèi),然后在各個(gè)model的rule中去運(yùn)用這個(gè)類(lèi)
-------------------------------
Form 是 Form,model 是 model,不同的。
當(dāng)然,gii 生成的代碼,是省略了 Form,直接拿 model 當(dāng) form 用,自然是 model 的 rules 判斷了。
聯(lián)系客服