建立動作 =============== 有了模型,我們就可以開始撰寫用於操作此模型的邏輯了。 我們將此邏輯放在一個控制器的動作中。對登入表單的例子來講,相應的程式碼就是: ~~~ [php] public function actionLogin() { $model=new LoginForm; if(isset($_POST['LoginForm'])) { // 收集使用者輸入的資料 $model->attributes=$_POST['LoginForm']; // 驗證使用者輸入,並在判斷輸入正確後重新導向到前一頁 if($model->validate()) $this->redirect(Yii::app()->user->returnUrl); } // 顯示登入表單 $this->render('login',array('model'=>$model)); } ~~~ 如上所示,我們首先建立了一個 `LoginForm` 模型範例; 如果請求是一個 POST 請求(意味著這個登入表單被提交了),我們則使用提交的資料 `$_POST['LoginForm']` 填入 `$model` ;然後我們驗證此輸入,如果驗證成功,重定向使用者瀏覽器到之前需要身份驗證的頁面。 如果驗證失敗,或者此動作被初次訪問,我們則呈現 `login` 視圖,此視圖的內容我們在下一節中講解。 > Tip|提示: 在 `login` 動作中,我們使用 `Yii::app()->user->returnUrl` 取得之前需要身份驗證的頁面 URL。 元件 `Yii::app()->user` 是一種 [CWebUser] (或其子類) ,它表示使用者 Session 資訊(例如 使用者姓名,狀態)。更多詳情, 請參考 [驗證與授權](/doc/guide/topics.auth). 讓我們特別留意一下 `login` 動作中出現的下面的 PHP 語句: ~~~ [php] $model->attributes=$_POST['LoginForm']; ~~~ 正如我們在 [安全的特性賦值](/doc/guide/form.model#securing-attribute-assignments) 中所講的, 這行程式碼使用使用者提交的資料填入模型。 `attributes` 屬性由 [CModel] 定義,它接受一個名值對陣列並將其中的每個值賦給相應的模型特性。 因此如果 `$_POST['LoginForm']` 給了我們這樣的一個陣列,上面的那段程式碼也就等同於下面冗長的這段 (假設陣列中存在所有所需的特性): ~~~ [php] $model->username=$_POST['LoginForm']['username']; $model->password=$_POST['LoginForm']['password']; $model->rememberMe=$_POST['LoginForm']['rememberMe']; ~~~ > Note|注意: 為了使 `$_POST['LoginForm']` 傳遞給我們的是一個陣列而不是字串, 我們需要在命名表單域時遵守一個規範。具體的,對應於模型類 `C` 中的特性 `a` 的表單域,我們將其命名為 `C[a]` 。例如,我們可使用 `LoginForm[username]` 命名 `username` 特性相應的表單域。 現在剩下的工作就是建立 `login` 視圖了,它應該包含一個帶有所需輸入項的 HTML 表單。
$Id$