前面在介紹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同時提供客戶端及伺服器端無縫的、一致的驗證。
>beginWidget('CActiveForm', array( 'id'=>'user-form', 'enableAjaxValidation'=>true, 'enableClientValidation'=>true, 'focus'=>array($model,'firstName'), )); ?>
本例比較簡單,沒有使用這些複雜的校驗,只要求FirstName,LastName非空,這是由DataModel中的rules 的 required 來定義的。
beginWidget('CActiveForm'); ?> errorSummary($model); ?> label($model,'firstName'); ?>textField($model,'firstName') ?> label($model,'lastName'); ?>textField($model,'lastName') ?> Choose your Christmas Gift radioButtonList($model,'favouriteGift',DataModel::$gifts) ?> Choose your Christmas dinner checkBoxList($model,'favouriteDinner',DataModel::$meals) ?> endWidget(); ?> View Choice 就更简单,显示用户选择结果: Christmas "; ?>firstName . ' ' . $model->lastName . '.' ;?> You will be givenecho DataModel::$gifts[$model->favouriteGift];?>on Christmas Day. And you will haveforeach($model->favouriteDinner as $dinner){echo DataModel::$meals[$dinner] . ' ';}?> for Christmas dinner.
運行結果如下:
vcyzzCgxMSkgVUnX6bz+IEFjdGl2ZUZvcm3KvsD9" src="/uploadfile/2016/0106/20160106062558152.png" />
以上是PHPPH)框架Yii .cn)!