Contents
前面在介紹Yii Framework 開發(fā)教程(7) 使用CHtml 創(chuàng)建Form 和 Yii Framework 開發(fā)教程(8) 使用FormModel 已經(jīng)對 CActiveForm 做了簡要的介紹。過幾天就是圣誕節(jié)了,這里幫助圣誕老人做個調(diào)查表,調(diào)查每個人希望得到的圣誕節(jié)禮物和圣誕大餐想吃的食品:-)。
這里共享一部分代碼,做為后續(xù)例子的框架,基本上是復(fù)制 Hello World 的例子,添加了一個空的 DataModel,使用缺省的 Controller(SiteController)和缺省的 Action(actionIndex),使用缺省的配置文件,代碼下載。
通過 HTML 表單收集用戶數(shù)據(jù)是 Web 程序開發(fā)的主要工作之一。除了表單設(shè)計外, 開發(fā)者還需要將現(xiàn)存的或默認(rèn)的數(shù)據(jù)填充到表單,驗證用戶輸入, 對無效的輸入顯示適當(dāng)?shù)腻e誤信息,保存輸入到持久性存儲器。Yii 通過其 MVC 結(jié)構(gòu)極大地簡化了此工作流程。
在 Yii 中處理表單時,通常需要以下步驟:
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 靜態(tài)定義了可供用戶選擇的禮物種類和食品種類。這里要注意的是 firstName,lastName 是必填的,而 $favouriteGift 和 $favouriteDinner 設(shè)為可以安全復(fù)制的,這些由 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,
));
}
這里定義了兩個 View,index 用于獲取用戶輸入,choice 顯示用戶選擇結(jié)果。$model->attributes=$_POST[‘DataModel’]; 正如我們在 安全的特性賦值 中所講的, 這行代碼使用用戶提交的數(shù)據(jù)填充模型。 attributes 屬性由 CModel 定義,它接受一個名值對數(shù)組并將其中的每個值賦給相應(yīng)的模型特性。
首先是定義 index.php ,本例使用 CActiveForm,CActiveForm 同時提供客戶端及服務(wù)器端無縫的、一致的驗證。
<?php $form = $this->beginWidget('CActiveForm', array(
'id'=>'user-form',
'enableAjaxValidation'=>true,
'enableClientValidation'=>true,
'focus'=>array($model,'firstName'),
)); ?>
本例比較簡單,沒有使用這些復(fù)雜的校驗,只要求 FirstName,LastName 非空,這是由 DataModel 中的 rules 的 required 來定義的。
<div class="form">
<?php $form=$this->beginWidget('CActiveForm'); ?>
<?php echo $form->errorSummary($model); ?>
<div class="row">
<?php echo $form->label($model,'firstName'); ?>
<?php echo $form->textField($model,'firstName') ?>
</div>
<div class="row">
<?php echo $form->label($model,'lastName'); ?>
<?php echo $form->textField($model,'lastName') ?>
</div>
<p>Choose your Christmas Gift</p>
<div class="row">
<?php echo $form->radioButtonList($model,'favouriteGift',
DataModel::$gifts) ?>
</div>
<p>Choose your Christmas dinner</p>
<div class="row">
<?php echo $form->checkBoxList($model,'favouriteDinner',
DataModel::$meals) ?>
</div>
<div class="row submit">
<?php echo CHtml::submitButton('Submit'); ?>
</div>
<?php $this->endWidget(); ?>
</div><!-- form -->
View Choice 就更簡單,顯示用戶選擇結(jié)果:
<?php echo "Merry Christmas "; ?>
<?php echo $model->firstName . ' ' . $model->lastName . '.' ;?>
<p />
<p>You will be given
<?php
echo DataModel::$gifts[$model->favouriteGift];
?>
on Christmas Day.</p>
<p>And you will have
<?php
foreach($model->favouriteDinner as $dinner)
{
echo DataModel::$meals[$dinner] . ' ';
}
?>
for Christmas dinner.</p>
<p><?php echo CHtml::link('Start Again',array('index')); ?></p>
運(yùn)行結(jié)果如下:
http://wiki.jikexueyuan.com/project/yii-development-tutorial/images/11.1.jpg" alt="picture11.1" />
本例下載