通過前面的學習,我們了解了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', ...附加選項)