Yii Framework 开发教程(11) UI 组件 ActiveForm示例

来源:互联网 发布:网络剧余罪第一季 编辑:程序博客网 时间:2024/06/06 00:44


前面在介绍Yii Framework 开发教程(7) 使用CHtml 创建Form和Yii Framework 开发教程(8) 使用FormModel 已经对CActiveForm做了简要的介绍。过几天就是圣诞节了,这里帮助圣诞老人做个调查表,调查每个人希望得到的圣诞节礼物和圣诞大餐想吃的食品:-)。

这里共享一部分代码,做为后续例子的框架,基本上是复制Hello World的例子,添加了一个空的DataModel,使用缺省的Controller(SiteController)和缺省的Action(actionIndex),使用缺省的配置文件,代码下载。

通过HTML表单收集用户数据是Web程序开发的主要工作之一。除了表单设计外, 开发者还需要将现存的或默认的数据填充到表单,验证用户输入, 对无效的输入显示适当的错误信息,保存输入到持久性存储器。Yii通过其 MVC 结构极大地简化了此工作流程。

在 Yii 中处理表单时,通常需要以下步骤:

  1. 创建用于表现所要收集数据字段的模型类。
  2. 创建一个控制器动作,响应表单提交。
  3. 在视图脚本中创建与控制器动作相关的表单。

创建DataModel

[php] view plaincopyprint?
  1. class DataModel extends CFormModel  
  2. {  
  3.     public $firstName;  
  4.     public $lastName;  
  5.   
  6.     public $favouriteGift;  
  7.   
  8.     public $favouriteDinner;  
  9.   
  10.     public function rules()  
  11.     {  
  12.         return array(  
  13.             array('firstName, lastName''required'),  
  14.             array('favouriteGift,favouriteDinner''safe')  
  15.   
  16.             );  
  17.     }  
  18.   
  19.     static $gifts=array(  
  20.         '1'=>'iPad',  
  21.         '2'=>'Remote control helicopter',  
  22.         '3'=>'60 inch 3D LED TV',  
  23.         '4'=>'Holy Bible',  
  24.         );  
  25.   
  26.     static $meals=array(  
  27.         '1'=>'Egg',  
  28.         '2'=>'Ham',  
  29.         '3'=>'Chicken',  
  30.         '4'=>'Pork',  
  31.         '5'=>'Beer',  
  32.         '6'=>'Coke',  
  33.         '7'=>'Wine',  
  34.         );  
  35. }  

firstName,lastName 用于记载用户姓名,$favouriteGift和$favouriteDinner 记载用户的礼物和食品名称。$gifts,$meals静态定义了可供用户选择的礼物种类和食品种类。这里要注意的是firstName,lastName是必填的,而$favouriteGift和$favouriteDinner 设为可以安全复制的,这些由Model的rules来定义。

定义Action

修改SiteController 的Action方法:

[php] view plaincopyprint?
  1. public function actionIndex()  
  2. {  
  3.   
  4.     $model=new DataModel();  
  5.   
  6.     if(!empty($_POST['DataModel']))  
  7.     {  
  8.         $model->attributes=$_POST['DataModel'];  
  9.   
  10.         if($model->validate())  
  11.         {  
  12.             $this->render('choice'array(  
  13.                 'model' => $model,  
  14.   
  15.                 ));  
  16.             return;  
  17.         }  
  18.   
  19.     }  
  20.   
  21.     $this->render('index'array(  
  22.             'model' => $model,  
  23.   
  24.             ));  
  25. }  

这里定义了两个View,index 用于获取用户输入,choice 显示用户选择结果。$model->attributes=$_POST['DataModel']; 正如我们在 安全的特性赋值 中所讲的, 这行代码使用用户提交的数据填充模型。 attributes 属性由 CModel定义,它接受一个名值对数组并将其中的每个值赋给相应的模型特性。

定义View

首先是定义index.php ,本例使用CActiveForm,CActiveForm同时提供客户端及服务器端无缝的、一致的验证。

[php] view plaincopyprint?
  1. <?php $form = $this->beginWidget('CActiveForm'array(  
  2.     'id'=>'user-form',  
  3.     'enableAjaxValidation'=>true,  
  4.     'enableClientValidation'=>true,  
  5.     'focus'=>array($model,'firstName'),  
  6. )); ?>  

本例比较简单,没有使用这些复杂的校验,只要求FirstName,LastName非空,这是由DataModel中的rules 的 required 来定义的。
[php] view plaincopyprint?
  1. <div class="form">  
  2. <?php $form=$this->beginWidget('CActiveForm'); ?>  
  3.   
  4.     <?php echo $form->errorSummary($model); ?>  
  5.   
  6.     <div class="row">  
  7.         <?php echo $form->label($model,'firstName'); ?>  
  8.         <?php echo $form->textField($model,'firstName') ?>  
  9.     </div>  
  10.   
  11.     <div class="row">  
  12.         <?php echo $form->label($model,'lastName'); ?>  
  13.         <?php echo $form->textField($model,'lastName') ?>  
  14.     </div>  
  15.   
  16.     <p>Choose your Christmas Gift</p>  
  17.     <div class="row">  
  18.          <?php echo $form->radioButtonList($model,'favouriteGift',  
  19.          DataModel::$gifts) ?>  
  20.   
  21.     </div>  
  22.   
  23.    <p>Choose your Christmas dinner</p>  
  24.     <div class="row">  
  25.          <?php echo $form->checkBoxList($model,'favouriteDinner',  
  26.          DataModel::$meals) ?>  
  27.   
  28.     </div>  
  29.   
  30.     <div class="row submit">  
  31.         <?php echo CHtml::submitButton('Submit'); ?>  
  32.     </div>  
  33.   
  34. <?php $this->endWidget(); ?>  
  35. </div><!-- form -->  

View Choice 就更简单,显示用户选择结果:
[php] view plaincopyprint?
  1. <?php echo "Merry Christmas "; ?>  
  2. <?php echo $model->firstName . ' ' . $model->lastName . '.' ;?>  
  3. <p />  
  4. <p>You will be given  
  5.     <?php  
  6.         echo DataModel::$gifts[$model->favouriteGift];  
  7.     ?>  
  8. on Christmas Day.</p>  
  9.   
  10. <p>And you will have  
  11.     <?php  
  12.         foreach($model->favouriteDinner as $dinner)  
  13.         {  
  14.             echo DataModel::$meals[$dinner] . ' ';  
  15.         }  
  16.     ?>  
  17. for Christmas dinner.</p>  
  18.   
  19. <p><?php echo CHtml::link('Start Again',array('index')); ?></p>  

运行结果如下:
201212123001本例下载
0 0