点击这里给我发消息 点击这里给我发消息

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

添加时间:2013-12-6
    相关阅读: 设计 开发 程序 HTML PHP 框架 VC
 

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

本例比较简单,没有使用这些复杂的校验,只要求FirstName,LastName非空,这是由DataModel中的rules 的 required 来定义的。

<center class="form">    
<?php $form=$this->beginWidget('CActiveForm'); ?>    

    <?php echo $form->errorSummary($model); ?>    

    <center class="row">    
        <?php echo $form->label($model,'firstName'); ?>    
        <?php echo $form->textField($model,'firstName') ?>    
    </center>    

    <center class="row">    
        <?php echo $form->label($model,'lastName'); ?>    
        <?php echo $form->textField($model,'lastName') ?>    
    </center>    

    <p>Choose your Christmas Gift</p>    
    <center class="row">    
         <?php echo $form->radioButtonList($model,'favouriteGift',    
         DataModel::$gifts) ?>    

    </center>    

   <p>Choose your Christmas dinner</p>    
    <center class="row">    
         <?php echo $form->checkBoxList($model,'favouriteDinner',    
         DataModel::$meals) ?>    

    </center>    

    <center class="row submit">    
        <?php echo CHtml::submitButton('Submit'); ?>    
    </center>    

<?php $this->endWidget(); ?>    
</center><!-- form -->View Choice 就更简单,显示用户选择结果:

<?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>运行结果如下:

 

咨询热线:020-85648757 85648755 85648616 0755-27912581 客服:020-85648756 0755-27912581 业务传真:020-32579052
广州市网景网络科技有限公司 Copyright◎2003-2008 Veelink.com. All Rights Reserved.
广州商务地址:广东省广州市黄埔大道中203号(海景园区)海景花园C栋501室
= 深圳商务地址:深圳市宝源路华丰宝源大厦606
研发中心:广东广州市天河软件园海景园区 粤ICP备05103322号 工商注册