前面教程已簡要介紹 CActiveForm。趁聖誕節將近,我們來幫聖誕老人做個調查表,蒐集大家想要的禮物與大餐。
共享部分代碼作為後續範例框架:複製 Hello World 專案,加入空的 DataModel,使用預設控制器與動作、預設配置檔。
透過 HTML 表單蒐集使用者資料是 Web 開發主要工作之一。除了表單設計,開發者還需將既有或預設資料填入表單、驗證使用者輸入、顯示錯誤訊息、儲存輸入至持久化儲存。Yii 透過 MVC 結構極大簡化此流程。
處理表單通常步驟:
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 靜態定義可選項目。姓名為必填,禮物與食品設為可安全複製(由 Model 的 rules 定義)。
修改 SiteController 的 Action 方法:
public function actionIndex() {
$model = new DataModel();
if (!empty($_POST['DataModel'])) {
$model->attributes = $_POST['DataModel'];
if ($model->validate()) {
$this->render('choice', array('model' => $model));
return;
}
}
$this->render('index', array('model' => $model));
}
定義兩個視圖:index 取得使用者輸入,choice 顯示選擇結果。$model->attributes = $_POST['DataModel'] 使用使用者提交資料填充模型,attributes 由 CModel 定義,接受鍵值對陣列並將值賦給對應模型屬性。
index.php 使用 CActiveForm,提供客戶端與伺服器端無縫、一致的驗證:
<?php $form = $this->beginWidget('CActiveForm', array(
'id' => 'user-form',
'enableAjaxValidation' => true,
'enableClientValidation' => true,
'focus' => array($model, 'firstName'),
)); ?>