以前博客裏有過一次小物件的使用,不錯沒有結合model驗證,今天就結合model來作一下前臺表單的驗證吧,帶你先簡單的瞭解下model裏的一些方法,詳細的等我研究深了再來寫過來哈。php
1.首先,model的生成的話 ,使用 gii生成就能夠了,至於gii的使用,在以前已經提過了,能夠往前翻一下,輸入表名做爲model名就能夠了。前端
我想說下里面的幾個方法是作什麼用的。正則表達式
public static function model($className=__CLASS__) { return parent::model($className); }
這個就不詳細說了,直接略過,畢竟是自動生成的,你也不用作任何修改,其實就是集成父類model數據庫
public function tableName() { return '{{user}}'; }
這個的做用就是返回表名 裏面的user 表明的就是user表了。瀏覽器
public function search() { // Warning: Please modify the following code to remove attributes that // should not be searched. $criteria=new CDbCriteria; $criteria->compare('username',$this->username);$criteria->compare('userpwd',$this->userpwd,true); return new CActiveDataProvider($this, array( 'criteria'=>$criteria, )); }
上面方法是設置查詢字段,須要哪一個數據庫字段做爲數據庫查詢條件,就把他按照格式寫出來就能夠了app
public function rules() { // NOTE: you should only define rules for those attributes that // will receive user inputs. return array( array('username, userpwd', 'required','message'=>'用戶名,密碼必填'), //表明這倆字段必填 array('price, apply_version', 'length', 'max'=>10), //表明這倆字段的最大長度都是40 array('end_time', 'safe'), //表明 正確的時間 // The following rule is used by search(). // Please remove those attributes that should not be searched. array('username, userpwd,', 'safe', 'on'=>'search'), //表明username,userpwd 能夠做爲查詢條件 ); }
上面這個則是驗證規則,驗證字段是否符合系統須要的條件,就好像前端的js的效果同樣的,其實yii的驗證組件不少不少,一會我放到文章的後面 給你們都列出來把。yii
public function attributeLabels() { return array( 'password' => '原密碼', 'password1' => '新密碼', 'password2' => '確認新密碼', ); }
這個是對字段進行重命名,重命名的字段能夠經過小物件的形式顯示在前臺中,須要注意的是有一種狀況就是,可能有的字段他在數據庫表中是不存在的,好比說password1,password2這樣的字段,通常人是不會存在數據庫的,因此要建立個模擬的字段,怎麼建立呢,在model上方定義一下就能夠了,如圖:ide
看到了把 如上圖所示,數據庫表裏沒有的字段都須要定義一下,按照我圖片裏那樣的來就能夠了哦,既然說到這裏,我就接着說 怎麼樣結合view,controller把rules裏的判斷和attributesLabeles裏定義好的標籤名顯示出來,而且能判斷輸入的數據是否符合格式呢,來先從 controller開始ui
上面這是對應的controller,我想你應該會建把 而後 方法叫actionPasswdthis
$userModel = User::model(); //引入你的model
而後判斷model是否存在
而後$userModel->arributes=$_POST['User'];//接收前臺傳來的全部值
$userModel->validate(); //執行model的數據驗證
有了 這個最後別忘記 view裏的小物件,我估計你會寫了已經 ,我給你截個圖 你參考下吧
LabelEx就是輸出model裏對應的標籤值
關於labelEx裏的參數第一個是模型名,第二個是對應的字段名 ,就是你在arributesLabels裏定義的名字。
-----------------------------------------------------------------------------------------------------------------------------------------------------
再說2個很是經常使用的把 就是大家必定會用到的,一個是好比登陸註冊或者修改密碼這,把錯誤信息輸出,對吧,怎麼把錯誤信息輸出到頁面呢
就是利用model裏的rules規則裏的message了,若是不符合規則,則會將message顯示到頁面中了,view中怎麼顯示呢 ,這麼顯示
<?php echo $form->error(UserModel,'username')?>這樣就能夠將rules裏的規則 用到用戶名那了,其餘的字段以此類推哦,都是 model配置對應字段的message,前臺根據model裏對應的字段名 在前臺進行輸出。
還有個常見的就是判斷2次輸入的密碼是否相同 這個再每一個系統裏基本都有,怎麼驗證呢 ,view裏不變 引入error就行,
model須要動一下 ,這麼寫
寫到rules裏仍是 意思是 password2 和 password1 相比較必須相同,不然message提示 確認密碼必須一致。
最後再說個 自定義的model
好比說判斷原密碼 是否正確,這個就要走數據庫了,這裏就要用到自定義方法了
在model裏仍是寫在rules方法裏
array('username',check_pwd);
而後下面就寫個check_pwd方法被
public function check_pwd(){
$userInfo=$this->find('username=:name',array(':name'=>Yii::app()->user->name)) //通常修改密碼都是登陸後修改因此這裏的name指的是當前登陸用戶的用戶名,根據用戶名查詢當前用戶的密碼是多少。
if ($this->password!=$userInfo->password){ $this->password就是用戶輸入的原密碼了 $userinfo->password就是數據庫查出來得當前用戶的密碼了,一判斷 完事
$this->addError('password','原密碼錯誤');
}
}
最後 我把 yii 的model 裏的rules一些規則附上,大家遇到相對應的驗證 直接拿來用下:
規則列表 in: 確保數據在一個預先指定的值的範圍以內。 lengths 確保數據的長度在一個指定的範圍以內。 match: 確保數據能夠匹配一個正則表達式。 numerical: 確保數據是一個有效的數字。 required: 確保特性不爲空。 type: 確保特性是指定的數據類型。 unique: 確保數據在數據表的列中是惟一的。 url: 確保數據是一個有效的 URL。 boolean: 確保特性有一個布爾值。 captcha: 確保特性值等於 CAPTCHA 中顯示的驗證碼。 compare: 確保特性等於另外一個特性或常量。 email: 確保特性是一個有效的Email地址。 default: 指定特性的默認值。 exist: 確保特性值能夠在指定表的列中能夠找到。 file: 確保特性含有一個上傳文件的名字。 filter : 經過一個過濾器改變此特性。
這些要牢記哦 !
額 最後再多嘴一句哈,剛纔的model驗證每次都要刷新才能夠的,你能夠每次提交表單的時候試一下,看下驗證爲空或者 是否原密碼一致這些驗證以前,瀏覽器是否刷新了,確定是刷新了,怎麼讓他不刷新了,來吧 ,在view裏的小物件裏改下 ,在form開始的地方改下,改爲這樣:
<?php $form=$this->beginWidget('CActiveForm', array( 'id'=>'contact-form', 'enableClientValidation'=>true, 'clientOptions'=>array( 'validateOnSubmit'=>true, ), )); ?>
切記開啓前端js不刷新頁面驗證的時候,要保證controller用render否則沒法引入組件相關的js庫