前面在介紹Yii Framework 開發教程(7) 使用CHtml 創建Form和Yii Framework 開發教程(8) 使用FormModel 已經對 CActiveForm做了簡要的介紹。過幾天就是聖誕節了,這裡幫助聖誕老人做個調查表,調查每個人希望得到的聖誕節禮物和聖誕 大餐想吃的食品:-)。
這裡共享一部分代碼,做為後續例子的框架,基本上是復制Hello World的例子,添加了一個空 的DataModel,使用缺省的Controller(SiteController)和缺省的Action(actionIndex),使用缺省的配置文件,代碼下載。
通過HTML表單收集用戶數據是Web程序開發的主要工作之一。除了表單設計外, 開發者還需要將現存的或默認的數據填 充到表單,驗證用戶輸入, 對無效的輸入顯示適當的錯誤信息,保存輸入到持久性存儲器。Yii通過其 MVC 結構極大地簡化了 此工作流程。
在 Yii 中處理表單時,通常需要以下步驟:
創建用於表現所要收集數據字段的模型類。
創建一 個控制器動作,響應表單提交。
在視圖腳本中創建與控制器動作相關的表單。
創建DataModel
class DataModel extends CFormModel { public $firstName; public $lastName; public $favouriteGift; public $favouriteDinner; public function rules() { return array( array('firstName, lastName', 'required'), array('favouriteGift,favouriteDinner', 'safe') ); } static $gifts=array( '1'=>'iPad', '2'=>'Remote control helicopter', '3'=>'60 inch 3D LED TV', '4'=>'Holy Bible', ); static $meals=array( '1'=>'Egg', '2'=>'Ham', '3'=>'Chicken', '4'=>'Pork', '5'=>'Beer', '6'=>'Coke', '7'=>'Wine', ); }
firstName,lastName 用於記載用戶姓名,$favouriteGift和$favouriteDinner 記載用戶的禮物和食品名稱。 $gifts,$meals靜態定義了可供用戶選擇的禮物種類和食品種類。這裡要注意的是firstName,lastName是必填的,而 $favouriteGift和$favouriteDinner 設為可以安全復制的,這些由Model的rules來定義。
定義Action
修改 SiteController 的Action方法:
public function actionIndex() { $model=new DataModel(); if(!emptyempty($_POST['DataModel'])) { $model->attributes=$_POST['DataModel']; if($model->validate()) { $this->render('choice', array( 'model' => $model, )); return; } } $this->render('index', array( 'model' => $model, )); }
這裡定義了兩個View,index 用於獲取用戶輸入,choice 顯示用戶選擇結果。$model->attributes=$_POST ['DataModel']; 正如我們在 安全的特性賦值 中所講的, 這行代碼使用用戶提交的數據填充模型。 attributes 屬性 由 CModel定義,它接受一個名值對數組並將其中的每個值賦給相應的模型特性。
定義View
首先是定義index.php ,本例使用CActiveForm,CActiveForm同時提供客戶端及服務器端無縫的、一致的驗證。
<?php $form = $this- >beginWidget('CActiveForm', array( 'id'=>'user-form', 'enableAjaxValidation'=>true, 'enableClientValidation'=>true, 'focus'=>array($model,'firstName'), )); ?>