麻豆小视频在线观看_中文黄色一级片_久久久成人精品_成片免费观看视频大全_午夜精品久久久久久久99热浪潮_成人一区二区三区四区

首頁 > 開發(fā) > PHP > 正文

PHP YII框架開發(fā)小技巧之模型(models)中rules自定義驗(yàn)證規(guī)則

2024-05-04 23:40:26
字體:
供稿:網(wǎng)友

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

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

以下是視圖(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=>"系統(tǒng)默認(rèn)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'=>'標(biāo)簽不合法,必須為漢字、字母或者數(shù)字!'),  
  9. array('tagname''checktagname''on'=>'create,update'),//插入TAG時(shí)檢查是否已經(jīng)存在該tag  
  10. array('tagid, tagname, tagtype''safe''on'=>'search'),  
  11. );  

系統(tǒng)默認(rèn)有這些驗(yàn)證規(guī)則:

boolean : CBooleanValidator 的別名, 確保屬性的值是CBooleanValidator::trueValue 或 CBooleanValidator::falseValue .

captcha : CCaptchaValidator 的別名,確保了特性的值等于 CAPTCHA 顯示出來的驗(yàn)證碼.

compare : CCompareValidator 的別名, 確保了特性的值等于另一個(gè)特性或常量.

email : CEmailValidator 的別名,確保了特性的值是一個(gè)有效的電郵地址.

default : CDefaultValueValidator 的別名, 為特性指派了一個(gè)默認(rèn)值.

exist : CExistValidator 的別名, 確保屬性值存在于指定的數(shù)據(jù)表字段中.

file : CFileValidator 的別名, 確保了特性包含了一個(gè)上傳文件的名稱.

filter : CFilterValidator 的別名, 使用一個(gè)filter轉(zhuǎn)換屬性.

in : CRangeValidator 的別名, 確保了特性出現(xiàn)在一個(gè)預(yù)訂的值列表里.

length : CStringValidator 的別名, 確保了特性的長度在指定的范圍內(nèi).

match : CRegularExpressionValidator 的別名, 確保了特性匹配一個(gè)正則表達(dá)式.

numerical : CNumberValidator 的別名, 確保了特性是一個(gè)有效的數(shù)字.

required : CRequiredValidator 的別名, 確保了特性不為空.

type : CTypeValidator 的別名, 確保了特性為指定的數(shù)據(jù)類型.

unique : CUniqueValidator 的別名, 確保了特性在數(shù)據(jù)表字段中是唯一的.

url : CUrlValidator 的別名, 確保了特性是一個(gè)有效的路徑.

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

關(guān)鍵有一下兩個(gè)步驟:

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

注:我在其中用了 'on'=>'create,update',所以這個(gè)驗(yàn)證規(guī)則之對create,update場景生效

2、在該模型(models)中添加驗(yàn)證函數(shù):

 

 
  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已經(jīng)存在!');  
  5. }  

其中需要說明的是:

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

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

就是這么簡單,有了這個(gè)方法,表單驗(yàn)證的各種想要的規(guī)則就都可以自定義了。

下面給大家介紹Yii自定義驗(yàn)證規(guī)則

最簡單的定義驗(yàn)證規(guī)則的方法是在使用它的模型(model)內(nèi)部定義。

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

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

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

const WEAK = 0;

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

 

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

確保你寫的規(guī)則不是一個(gè)已經(jīng)存在的規(guī)則,否則將會報(bào)錯(cuò).

現(xiàn)在要做的是在模型(model)中創(chuàng)建一個(gè)名稱為上面填寫的規(guī)則的方法(即 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!'); 

剛才創(chuàng)建的方法需要兩個(gè)參數(shù):* $attribute 需要驗(yàn)證的屬性* $params 在規(guī)則中自定義的參數(shù)

在模型的 rules 方法中我們驗(yàn)證的是 password 屬性,所以在驗(yàn)證規(guī)則中需要驗(yàn)證的屬性值應(yīng)該是 password.

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

你會發(fā)現(xiàn)在方法中我們使用了 CModel::addError().

添加錯(cuò)誤接受兩個(gè)參數(shù):第一個(gè)參數(shù)是在表單中顯示錯(cuò)誤的屬性名,第二個(gè)參數(shù)時(shí)顯示的錯(cuò)誤信息 。

完整的方法:繼承 CValidator 類

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

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

創(chuàng)建類文件

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

讓我們在應(yīng)用(application)的擴(kuò)展(extensiions)目錄(在 protected 文件夾下)下新建一個(gè)文件夾.

將目錄命名為: MyValidators

然后創(chuàng)建文件: passwordStrength.php

在文件中創(chuàng)建我們的驗(yàn)證方法

 

 
  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. ... 

在類中創(chuàng)建屬性,此屬性為在驗(yàn)證規(guī)則中使用的參數(shù).

CValidator 會自動根據(jù)參數(shù)來填充這些屬性.

我們也創(chuàng)建了兩個(gè)其他的屬性,它們?yōu)?preg_match 函數(shù)使用的正則表達(dá)式.

現(xiàn)在我們應(yīng)該重寫父類的抽象方法(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!'); 

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


注:相關(guān)教程知識閱讀請移步到PHP教程頻道。
發(fā)表評論 共有條評論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 欧美一区二区片 | 日本免费一区二区三区四区 | 国产一区二区三区高清 | 欧美一区二区三区中文字幕 | 国产精品一区二区三区在线播放 | 久久久久99一区二区三区 | 亚洲综人网 | 精品一区二区久久久久久久网精 | 国产精品视频二区不卡 | 久久国产精品久久久久 | 一级α片免费看刺激高潮视频 | 最新中文字幕第一页视频 | av成人在线播放 | 4p一女两男做爰在线观看 | 日本高清黄色片 | 国产精品久久久久久久久久尿 | 黄色一级片在线免费观看 | 精品一区二区三区免费毛片 | 91精品国产乱码久久久久久久久 | 欧美日韩国产成人在线 | 国产亚洲精品久久久久婷婷瑜伽 | 国产一级免费视频 | 国产不卡av在线 | 欧美a级大胆视频 | 一分钟免费观看完整版电影 | 视频一区免费观看 | 久久久中精品2020中文 | 久草在线视频首页 | 久久国产精品小视频 | wwwxxx视频| 吾色视频 | h视频在线免费看 | 九九综合九九 | 91小视频在线观看免费版高清 | www.热| 337p日本欧洲亚洲大胆精蜜臀 | 亚洲第一成人在线 | 成人在线视频黄色 | 黄色片网站在线免费观看 | 国产真实孩交 | 久久国产免费视频 |