亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 開發 > PHP > 正文

PHP YII框架開發小技巧之模型(models)中rules自定義驗證規則

2024-05-04 23:40:26
字體:
來源:轉載
供稿:網友

yii的models中rules部分是一些表單的驗證規則,對于表單驗證有幫助,在相應的視圖(views)里面添加了表單,在表單被提交之前程序都會自動先來這里面的規則里驗證,只有通過對其有效的限制規則后才能被提交,可以很有效地保證表單安全和信息的有效性

YII的models中的rules部分是一些表單的驗證規則,對于表單驗證十分有用,在相應的視圖(views)里面添加了表單,在表單被提交之前程序都會自動先來這里面的規則里驗證,只有通過對其有效的限制規則后才能被提交,可以很有效地保證表單安全和信息的有效性。還是給大家具體說明一下:

以下是視圖(views)部分的簡單代碼:

 

 
  1. <?php $form=$this->beginWidget('CActiveForm', array(  
  2. 'id'=>'tag-form',  
  3. 'enableAjaxValidation'=>false,  
  4. )); ?>  
  5. <div class="row">  
  6. <?php echo $form->labelEx($model,'tagname'); ?>  
  7. <?php echo $form->textField($model,'tagname',array('size'=>20,'maxlength'=>32)); ?>  
  8. </div>  
  9. <div class="row">  
  10. <?php echo $form->labelEx($model,'tagtype'); ?>  
  11. <?php echo $form->radioButtonList($model,'tagtype'array(1=>"普通TAG",2=>"系統默認TAG"),array('separator'=>'','labelOptions'=>array('class'=>'tagtypelabel'))); ?>  
  12. </div>  
  13. <?php echo $form->errorSummary($model); ?>  
  14. <div class="row buttons">  
  15. <?php echo CHtml::submitButton($model->isNewRecord ? '添加' : '修改'); ?>  
  16. </div>  
  17. <?php $this->endWidget(); ?> 

模型(models)中rules部分的簡單代碼:

 

  1. public function rules()  
  2. {  
  3. return array(  
  4. array('tagname,tagtype''required'),  
  5. array('tagtype''numerical''integerOnly'=>true),  
  6. array('tagname''length''max'=>32),  
  7. array('tagname''match''pattern'=>'/^[/x{4e00}-/x{9fa5}A-Za-z0-9]+$/u',  
  8. 'message'=>'標簽不合法,必須為漢字、字母或者數字!'),  
  9. array('tagname''checktagname''on'=>'create,update'),//插入TAG時檢查是否已經存在該tag  
  10. array('tagid, tagname, tagtype''safe''on'=>'search'),  
  11. );  

系統默認有這些驗證規則:

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 的別名, 確保了特性是一個有效的路徑.

基本上還是比較全面的,一般的都夠用了,但是還是有時候有的驗證需要自定義。就以上面的代碼為例,我們在添加TAG時需要檢查系統之前是否已經存在這個TAG,如果存在則不讓用戶添加。這個就需要在添加之前去查詢數據庫,看該TAG是否已經存在,這里我們就需要自定一個驗證規則了。

關鍵有一下兩個步驟:

1、在rules中 添加代碼:array('tagname', 'checktagname', 'on'=>'create,update'),//插入TAG時檢查是否已經存在該tag

注:我在其中用了 'on'=>'create,update',所以這個驗證規則之對create,update場景生效

2、在該模型(models)中添加驗證函數:

 

 
  1. public function checktagname($attribute,$params){  
  2. $oldtag = Tag::model()->findByAttributes(array('tagname'=>$this->tagname));  
  3. if($oldtag->tagid > 0){  
  4. $this->addError($attribute, '該TAG已經存在!');  
  5. }  

其中需要說明的是:

(1)該驗證函數的參數必須是($attribute,$params),不能缺少其中任何一個;

(2)$this->addError($attribute, '該TAG已經存在!');這個是你想要在視圖中輸出的錯誤提示信息。

就是這么簡單,有了這個方法,表單驗證的各種想要的規則就都可以自定義了。

下面給大家介紹Yii自定義驗證規則

最簡單的定義驗證規則的方法是在使用它的模型(model)內部定義。

比方說,你要檢查用戶的密碼是否足夠安全.

通常情況下你會使用 CRegularExpression 方法驗證,但為了本指南,我們假設不存在此驗證方法.

首先在模型(model)中添加兩個常量

const WEAK = 0;

const STRONG = 1;然后在模型(model)的 rules 方法中設置:

 

 
  1. /** 
  2. * @return array validation rules for model attributes. 
  3. */ 
  4. public function rules() 
  5. return array( 
  6. array('password''passwordStrength''strength'=>self::STRONG), 
  7. ); 

確保你寫的規則不是一個已經存在的規則,否則將會報錯.

現在要做的是在模型(model)中創建一個名稱為上面填寫的規則的方法(即 passwordStrength)。

 

 
  1. /** 
  2. * check if the user password is strong enough 
  3. * check the password against the pattern requested 
  4. * by the strength parameter 
  5. * This is the 'passwordStrength' validator as declared in rules(). 
  6. */ 
  7. public function passwordStrength($attribute,$params) 
  8. if ($params['strength'] === self::WEAK) 
  9. $pattern = '/^(?=.*[a-zA-Z0-9]).{5,}$/';  
  10. elseif ($params['strength'] === self::STRONG) 
  11. $pattern = '/^(?=.*/d(?=.*/d))(?=.*[a-zA-Z](?=.*[a-zA-Z])).{5,}$/';  
  12.  
  13. if(!preg_match($pattern, $this->$attribute)) 
  14. $this->addError($attribute, 'your password is not strong enough!'); 

剛才創建的方法需要兩個參數:* $attribute 需要驗證的屬性* $params 在規則中自定義的參數

在模型的 rules 方法中我們驗證的是 password 屬性,所以在驗證規則中需要驗證的屬性值應該是 password.

在 rules 方法中我們還設置了自定義的參數 strength,它的值將會放到 $params 數組中.

你會發現在方法中我們使用了 CModel::addError().

添加錯誤接受兩個參數:第一個參數是在表單中顯示錯誤的屬性名,第二個參數時顯示的錯誤信息 。

完整的方法:繼承 CValidator 類

如果你想把規則使用在多個模型(model)中,最好的方法時繼承 CValidator 類。

繼承這個類你可以使用像 CActiveForm::$enableClientValidation (Yii 1.1.7 版本后可用) 類似的其他功能。

創建類文件

首先要做的是創建類文件.最好的方法時類的文件名和類名相同,可以使用 yii 的延遲加載(lazy loading)功能。

讓我們在應用(application)的擴展(extensiions)目錄(在 protected 文件夾下)下新建一個文件夾.

將目錄命名為: MyValidators

然后創建文件: passwordStrength.php

在文件中創建我們的驗證方法

 

 
  1. class passwordStrength extends CValidator 
  2. public $strength; 
  3. private $weak_pattern = '/^(?=.*[a-zA-Z0-9]).{5,}$/'
  4. private $strong_pattern = '/^(?=.*/d(?=.*/d))(?=.*[a-zA-Z](?=.*[a-zA-Z])).{5,}$/'
  5. ... 

在類中創建屬性,此屬性為在驗證規則中使用的參數.

CValidator 會自動根據參數來填充這些屬性.

我們也創建了兩個其他的屬性,它們為 preg_match 函數使用的正則表達式.

現在我們應該重寫父類的抽象方法(abstract method) validateAttribute

 

 
  1. /** 
  2. * Validates the attribute of the object. 
  3. * If there is any error, the error message is added to the object. 
  4. * @param CModel $object the object being validated 
  5. * @param string $attribute the attribute being validated 
  6. */ 
  7. protected function validateAttribute($object,$attribute) 
  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. // extract the attribute value from it's model object 
  14. $value=$object->$attribute; 
  15. if(!preg_match($pattern, $value)) 
  16. $this->addError($object,$attribute,'your password is too weak!'); 

上面的方法我認為就不用解釋了.當然你也可以在 if 的條件中使用常量,我推薦使用.


注:相關教程知識閱讀請移步到PHP教程頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
欧美精品中文字幕一区| 国产精品久久婷婷六月丁香| 成人黄色短视频在线观看| 亚洲成色www8888| 777777777亚洲妇女| 一本大道亚洲视频| 欧美亚洲另类视频| 亚洲成色777777在线观看影院| 久久综合久久美利坚合众国| 国产99久久精品一区二区| 欧美亚洲国产另类| 亚洲国产精品成人一区二区| 96精品久久久久中文字幕| 久久亚洲精品毛片| 国产一区二区三区直播精品电影| 欧美高清videos高潮hd| 国产伦精品免费视频| 992tv成人免费视频| 日韩精品在线观| 欧美日韩国产精品| 97精品伊人久久久大香线蕉| 欧美大片欧美激情性色a∨久久| 欧美夫妻性生活xx| 亚洲bt欧美bt日本bt| 黑人狂躁日本妞一区二区三区| 亚洲美女自拍视频| 欧美日韩国产一中文字不卡| 成人久久久久久| 欧美极品第一页| 国产91露脸中文字幕在线| 国产精品成人aaaaa网站| 国产日产久久高清欧美一区| 国产又爽又黄的激情精品视频| 美乳少妇欧美精品| 欧美激情中文网| 日韩欧美极品在线观看| 国产一区二区三区毛片| 日韩中文理论片| 亚洲视频综合网| 91性高湖久久久久久久久_久久99| 国产亚洲成精品久久| www.久久撸.com| 欧美电影免费看| 欧美性xxxx极品高清hd直播| 97在线精品视频| 6080yy精品一区二区三区| 亚洲色图50p| 国产精品视频一区国模私拍| 日韩av综合网站| 狠狠躁18三区二区一区| 亚洲人成绝费网站色www| 亚洲色图15p| 亚洲欧洲在线看| 亚洲视频在线播放| 欧美日韩一区免费| 国产成人精品免高潮在线观看| 精品国内亚洲在观看18黄| 中文字幕日韩在线播放| 精品亚洲夜色av98在线观看| 国产精品久久久久久久久| 国产精品综合不卡av| 91精品免费看| 热久久视久久精品18亚洲精品| 777午夜精品福利在线观看| 国产不卡一区二区在线播放| 欧美日韩视频在线| 91精品综合视频| 亚洲黄页视频免费观看| 国产精品igao视频| 欧美日韩综合视频网址| 午夜免费日韩视频| 精品一区二区三区电影| 久热99视频在线观看| 日韩精品在线看| 日韩av中文字幕在线播放| 亚洲tv在线观看| 国产美女搞久久| 国产97人人超碰caoprom| 91亚洲va在线va天堂va国| 美女福利精品视频| 成人免费视频97| 国产精品入口免费视| 2021国产精品视频| 国产精品久久久久影院日本| 在线观看精品国产视频| 中文综合在线观看| 日韩中文字幕在线免费观看| 亚洲国产精久久久久久久| 亚洲free性xxxx护士hd| 91久久精品在线| 国产一区二区三区三区在线观看| 日本在线精品视频| 欧美亚洲午夜视频在线观看| 在线国产精品视频| 亚洲aaa激情| 亚洲欧洲在线观看| 欧美在线激情网| 国产成人精品视频| 2020欧美日韩在线视频| 国产精品久久久久久久久久久新郎| 日韩精品中文字幕在线观看| 欧美有码在线观看| 久久精品91久久香蕉加勒比| www国产精品视频| 亚洲欧美日韩一区在线| 久精品免费视频| 欧美激情国产精品| 亚洲一区二区三区四区视频| yellow中文字幕久久| 国产婷婷成人久久av免费高清| 日韩国产精品亚洲а∨天堂免| 在线精品播放av| 97国产精品视频| 久久成人精品一区二区三区| 麻豆乱码国产一区二区三区| 狠狠久久亚洲欧美专区| 欧美大片在线看| 亚洲国产精品成人精品| 国产网站欧美日韩免费精品在线观看| 国产日韩欧美中文在线播放| 伊人久久男人天堂| 琪琪第一精品导航| 亚洲第一区第一页| 亚洲一区国产精品| 精品中文字幕在线观看| 国产成人aa精品一区在线播放| 久久久久久18| 欧美放荡办公室videos4k| 久久久999国产| 欧美一区二粉嫩精品国产一线天| 久久青草福利网站| 亚洲999一在线观看www| 日韩在线视频观看正片免费网站| 国内精品久久久久影院 日本资源| 91精品在线播放| 理论片在线不卡免费观看| 精品一区二区三区三区| 精品国产乱码久久久久久婷婷| 国产精品成人一区二区| 精品五月天久久| 欧美最猛性xxxx| 91精品啪在线观看麻豆免费| 一区二区成人精品| 九九热这里只有精品6| 日韩免费av片在线观看| 日韩精品在线视频观看| 久久久久久久久久久免费| 国产成人+综合亚洲+天堂| 欧美小视频在线观看| 性欧美xxxx交| 高清一区二区三区日本久| 国产精品视频播放| 欧美日韩一区二区三区在线免费观看| 久久久久久亚洲精品| 热久久99这里有精品| 奇门遁甲1982国语版免费观看高清| 亚洲色图日韩av| 中文字幕日韩欧美在线| 国产+成+人+亚洲欧洲| 国产亚洲日本欧美韩国| 国产在线拍偷自揄拍精品| 高清欧美一区二区三区| 欧美国产乱视频| 国内精品久久久久伊人av|