通過前面的學習,我們瞭解了Yii Web應用的基本組成部分,也會編寫像Hangman猜單詞遊戲這樣簡單的應用。在第一個例子 Yii Framework 開發簡明教程(1) 第一個應用Hello World 我們介紹了Yii Web應用採用MVC模型,也說明了本教程目的是通過不 同的視角(主要是通過開發Windows應用C++,C#程式員的角度)協助Windows 案頭應用或ASP.Net程式員較快的掌握PHP Yii Framework應用程式架構。
前面我們介紹了通過CHtml建立View(整頁模式Form),通過CController來處理使用者提交事件 ,和Windows 案頭應用或ASP.Net做個類比, Yii 中視圖View (HTML Form) 類似於WinForm或是Asp.Net 的Page。 控制類 Controller類似Windows案頭應用或Asp.Net的事件處理(Code-Behind)類。不同的是Asp.Net和Windows 案頭應用可以為UI中各 個UI組件,比如文字框,按鈕定義Id,然後為不同的UI組件添加事件處理。PHP應用或是Yii應用沒有對應的機制可以為定義在 HTML Form中的UI組件定義一個Id,並為UI組件定義事件處理。 然而Yii 架構提供了CFormModel 可以支援類似的功能,簡單的 說,通過CFormModel,可以為HTML Form 中的UI小工具定義變數,並且可以在其控制類Controller中訪問這些變數。每個Yii View(Form)一般都提供一個“提交”按鈕(Submit Button),使用者點擊這個“提交按鈕”觸發CController對象對應的 actionXXX 方法,在actionXXX 方法中可以通過CFormModel來訪問HTML Form的UI組件的值。
前面教程中說過Yii中的模 型(Model)是 CModel 或其子類的執行個體。模型用於保持資料以及與其相關的商務邏輯,
Yii 實現了兩種類型的模型:表 單模型和 Active Record。二者均繼承於相同的基類 CModel。
表單模型是 CFormModel 的執行個體。表單模型用於保持從用 戶的輸入擷取的資料。 這些資料經常被擷取,使用,然後丟棄。例如,在一個登入頁面中, 我們可以使用表單模型用於表示由 終端使用者提供的使用者名稱和密碼資訊。更多詳情,請參考 使用表單。本篇介紹CFormModel的用法,
Active Record (AR) 是一種用於通過物件導向的風格抽象化資料庫訪問的設計模式。 每個 AR 對象是一個CActiveRecord 或其子類的執行個體。代表數 據表中的一行。 行中的欄位對應 AR 對象中的屬性。更多關於 AR 的細節請閱讀 Active Record. 後面介紹資料庫使用時再介 紹。
本篇使用一個簡單的登入介面來介紹FormModel的用法,本例下載。
1. 定義模型類
下面我們建立了一個 LoginForm (protected/models/LoginForm.php) 模型類用於在一個登入頁中收集使用者的輸入。 由於登 錄資訊只被用於驗證使用者,並不需要儲存,因此我們將 LoginForm 建立為一個 表單模型。
class LoginForm extends CFormModel { public $username; public $password; public $rememberMe=false; }
2. 聲明驗證規則
一旦使用者提交了他的輸入,模型被填充,我們就需要在使用前確保使用者的輸入是有效。 這是通過將使用者的輸入和一系列規則執行驗證實現的。我們在 rules() 方法中指定這些驗證規則, 此方法應返回一個規則配置 數組。
class LoginForm extends CFormModel { public $username; public $password; public $rememberMe=false; private $_identity; public function rules() { return array( array('username, password', 'required'), array('rememberMe', 'boolean'), array('password', 'authenticate'), ); } public function authenticate($attribute,$params) { $this->_identity=new UserIdentity($this->username, $this->password); if(!$this->_identity->authenticate()) $this->addError('password','錯誤的使用者名稱或密碼。'); } }
上述代碼指定:username 和 password 為必填項, password 應被驗證(authenticated),rememberMe 應該是一 個布爾值。
rules() 返回的每個規則必須是以下格式:
array('AttributeList', 'Validator', 'on'=>'ScenarioList', ...附加選項)