原文地址:http://blog.csdn.net/hy840429/article/details/6725660 public array rules () 返回屬性的有效性規(guī)則。 聲明驗證規(guī)則,應(yīng)重寫此方法。 每個規(guī)則是數(shù)組具有以下結(jié)構(gòu): array(‘a(chǎn)ttribute list’, ‘validator name’, ‘on’=>’scenario name’, …validation parameters…) 注: * attribute list: 指定屬性 (以逗號分隔) 進(jìn)行驗證 ; * validator name: 指定要使用的驗證程序。 一種驗證方法必須具有以下簽名: // $params refers to validation parameters given in the rule function validatorName($attribute,$params) 內(nèi)置的驗證程序是指在 CValidator::builtInValidators 中聲明的驗證程序之一。 驗證程序的類是擴(kuò)展 CValidator 的類。 on: 應(yīng)執(zhí)行有效性規(guī)則時,此選項指定的情形。 * 附加參數(shù)用于初始化相應(yīng)的驗證程序?qū)傩浴?請參閱 individal 驗證器類 API 可能的屬性。 以下是一些例子: array( array(‘username’, ‘required’), 預(yù)定義完整列表: * boolean : CBooleanValidator 的別名, 確保屬性的值是CBooleanValidator::trueValue 或 CBooleanValidator::falseValue . captcha : CCaptchaValidator 的別名,確保了特性的值等于 CAPTCHA 顯示出來的驗證碼. compare : CCompareValidator 的別名, 確保了特性的值等于另一個特性或常量. email : CEmailValidator 的別名,確保了特性的值是一個有效的電郵地址. default : CDefaultValueValidator 的別名, 為特性指派了一個默認(rèn)值. exist : CExistValidator 的別名, 確保屬性值存在于指定的數(shù)據(jù)表字段中. file : CFileValidator 的別名, 確保了特性包含了一個上傳文件的名稱. filter : CFilterValidator 的別名, 使用一個filter轉(zhuǎn)換屬性. in : CRangeValidator 的別名, 確保了特性出現(xiàn)在一個預(yù)訂的值列表里. length : CStringValidator 的別名, 確保了特性的長度在指定的范圍內(nèi). match : CRegularExpressionValidator 的別名, 確保了特性匹配一個正則表達(dá)式. numerical : CNumberValidator 的別名, 確保了特性是一個有效的數(shù)字. required : CRequiredValidator 的別名, 確保了特性不為空. type : CTypeValidator 的別名, 確保了特性為指定的數(shù)據(jù)類型. unique : CUniqueValidator 的別名, 確保了特性在數(shù)據(jù)表字段中是唯一的. url : CUrlValidator 的別名, 確保了特性是一個有效的路徑. 驗證的實現(xiàn): 事實上CModel.rules()+CActiveForm.validate的結(jié)合就實現(xiàn)驗證功能了。 例子: 【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()就是在調(diào)用model.rules進(jì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’), ); } …… 要實現(xiàn)更強(qiáng)大復(fù)雜的驗證功能也就在rules()里做文章了。 有關(guān)用Ajax驗證,會在Ajax專題中具體介紹。當(dāng)然有必要時,也會再加的。
================================================== 遇到個很囧的model rules問題(測試create與update的username)
----=====-------=======----------=======---------========------ 缺省 new 出來的 model 實例的 scenario 是 insert 而不是 create ,你應(yīng)該用 $model = new ModelClass('create'); 去試試。 ------------------------- 怪不得我以前寫 create時候失敗 后來new XXXXX('create')才可以 原來缺省 insert.
=========================================== 1.場景(scenario)多了怎么辦? --------------====================---------------------------==================
|
|