鍍金池/ 教程/ PHP/ Yii Framework 開發(fā)教程(11) UI 組件 ActiveForm 示例
Yii Framework 開發(fā)教程(16) UI 組件 StarRating 示例
Yii Framework 開發(fā)教程(2) Yii Web 應(yīng)用基礎(chǔ)
Yii Framework 開發(fā)教程(19) UI 組件 TreeView 示例
Yii Framework 開發(fā)教程(39) Zii 組件-Slider 示例
Yii Framework 開發(fā)教程(45) Zii 組件-Selectable 示例
Yii Framework 開發(fā)教程(44) Zii 組件-Resizable 示例
Yii Framework 開發(fā)教程(8) 使用 FormModel
Yii Framework 開發(fā)教程(42) Zii 組件-Draggable 示例
Yii Framework 開發(fā)教程(18) UI 組件 TextHighlighter 示例
Yii Framework 開發(fā)教程(32) Zii 組件-GridView 示例
Yii Framework 開發(fā)教程(30) Zii 組件-ListView 示例
Yii Framework 開發(fā)教程(9) UI 組件 Widget 概述
Yii Framework 開發(fā)教程(17) UI 組件 TabView 示例
Yii Framework 開發(fā)教程(24) 數(shù)據(jù)庫-DAO 示例
Yii Framework 開發(fā)教程(25) 數(shù)據(jù)庫-Query Builder 示例
Yii Framework 開發(fā)教程(21) UI 組件 自定義 Captcha 示例
Yii Framework 開發(fā)教程(38) Zii 組件-ProgressBar 示例
Yii Framework 開發(fā)教程(20) UI 組件 Captcha 示例
Yii Framework 開發(fā)教程(14) UI 組件 MaskedTextField 示例
Yii Framework 開發(fā)教程(22) UI 組件 Zii 組件簡介
Yii Framework 開發(fā)教程(31) Zii 組件-DetailView 示例
Yii Framework 開發(fā)教程(33) Zii 組件-Accordion 示例
Yii Framework 開發(fā)教程(36) Zii 組件-DatePicker 示例
Yii Framework 開發(fā)教程(6) CComponent 組件
Yii Framework 開發(fā)教程(37) Zii 組件-Dialog 示例
Yii Framework 開發(fā)教程(26) 數(shù)據(jù)庫-Active Record 示例
Yii Framework 開發(fā)教程(29) Zii組件-Menu 示例
Yii Framework 開發(fā)教程(46) Zii 組件-Sortable 示例
Yii Framework 開發(fā)教程(10) UI 組件 自定義組件
Yii Framework 開發(fā)教程(11) UI 組件 ActiveForm 示例
Yii Framework 開發(fā)教程(43) Zii 組件-Droppable 示例
Yii Framework 開發(fā)教程(27) 數(shù)據(jù)庫-關(guān)聯(lián) Active Record 示例
Yii Framework 開發(fā)教程(47) 主題 Theme 示例
Yii Framework 開發(fā)教程(48) 多國語言示例
Yii Framework 開發(fā)教程(35) Zii 組件-Button 示例
Yii Framework 開發(fā)教程(3) 為應(yīng)用添加日志
Yii Framework 開發(fā)教程(23) 數(shù)據(jù)庫-概述
Yii Framework 開發(fā)教程(12) UI 組件 ClipWidget 示例
Yii Framework 開發(fā)教程(41) Zii 組件-Tabs 示例
Yii Framework 開發(fā)教程(34) Zii 組件-AutoComplete 示例
Yii Framework 開發(fā)教程(40) Zii 組件-SliderInput 示例
Yii Framework 開發(fā)教程(5) URL 管理
Yii Framework 開發(fā)教程(4) Hangman 猜單詞游戲?qū)嵗?/span>
Yii Framework 開發(fā)教程(15) UI 組件 MultiFileUpload 示例
Yii Framework 開發(fā)教程(7) 使用 CHtml 創(chuàng)建 Form
Yii Framework 開發(fā)教程(28) Data Provider 簡介
Yii Framework 開發(fā)教程(1) 第一個應(yīng)用 Hello World
Yii Framework 開發(fā)教程(13) UI 組件 ContentDecorator 示例

Yii Framework 開發(fā)教程(11) UI 組件 ActiveForm 示例

Contents

  1. 創(chuàng)建 DataModel
  2. 定義 Action
  3. 定義 View

前面在介紹Yii Framework 開發(fā)教程(7) 使用CHtml 創(chuàng)建FormYii 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 中處理表單時,通常需要以下步驟:

  1. 創(chuàng)建用于表現(xiàn)所要收集數(shù)據(jù)字段的模型類。
  2. 創(chuàng)建一個控制器動作,響應(yīng)表單提交。
  3. 在視圖腳本中創(chuàng)建與控制器動作相關(guān)的表單。

創(chuàng)建 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 靜態(tài)定義了可供用戶選擇的禮物種類和食品種類。這里要注意的是 firstName,lastName 是必填的,而 $favouriteGift 和 $favouriteDinner 設(shè)為可以安全復(fù)制的,這些由 Model 的 rules 來定義。

定義Action

修改 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)的模型特性。

定義View

首先是定義 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" />

本例下載