前面在介紹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'),
)); ?>