鍍金池/ 教程/ PHP/ Yii Framework 開發(fā)教程(10) UI 組件 自定義組件
Yii Framework 開發(fā)教程(16) UI 組件 StarRating 示例
Yii Framework 開發(fā)教程(2) Yii Web 應用基礎
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ù)庫-關聯(lián) Active Record 示例
Yii Framework 開發(fā)教程(47) 主題 Theme 示例
Yii Framework 開發(fā)教程(48) 多國語言示例
Yii Framework 開發(fā)教程(35) Zii 組件-Button 示例
Yii Framework 開發(fā)教程(3) 為應用添加日志
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) 第一個應用 Hello World
Yii Framework 開發(fā)教程(13) UI 組件 ContentDecorator 示例

Yii Framework 開發(fā)教程(10) UI 組件 自定義組件

在介紹 Yii 內(nèi)置 UI 組件之前,先介紹一下如何自定義組件,這樣也有助于理解 CWidget 的用法, 自定義組件就是重載 CWidget的init() 和 run() 方法。

    class MyWidget extends CWidget
    {
        public function init()
        {
            // 此方法會被 CController::beginWidget() 調(diào)用
        }

        public function run()
        {
            // 此方法會被 CController::endWidget() 調(diào)用
        }
    }

本例通過擴展 CInputWidget,定義一個值域輸入 UI 組件-RangeInputField,也就是允許用戶輸入兩個數(shù)字定義一個值域范圍。CInputWidget 支持使用 CModel 或者直接使用變量,RangeInputField 也保留了這一傳統(tǒng)。 RangeInputField 定義了三組屬性。 $attributeFrom 和 $attributeTo 用于 CModel,配合 CHtml 的 activeXXX 方法,activeXXX 可以自動生成文本框的標簽和文本框。 屬性$nameFrom,$nameTo,$valueFrom,$valueTo 程序員可以自行定義文本框的標簽。

按照 Yii 應用的缺省目錄結(jié)構,新創(chuàng)建的 RangeInputField 放在 protected/components 目錄下,因此創(chuàng)建 protected/components/RangeInputField.php

    class RangeInputField extends CInputWidget
    {
        public $attributeFrom;
        public $attributeTo;

        public $nameFrom;
        public $nameTo;

        public $valueFrom;
        public $valueTo;

        function run()
        {
            if($this->hasModel())
            {
                echo CHtml::activeTextField($this->model,
                    $this->attributeFrom);
                echo ' -> ';
                echo CHtml::activeTextField($this->model,
                    $this->attributeTo);
            }else
            {
                echo CHtml::textField($this->nameFrom,
                    $this->valueFrom);
                echo ' -> ';
                echo CHtml::textField($this->nameTo,
                    $this->valueTo);
            }
        }

        /**
         * @return boolean whether this widget
         * is associated with a data model.
         */
        protected function hasModel()
        {
            return $this->model instanceof CModel
                && $this->attributeFrom!==null
                && $this->attributeTo!==null;
        }
    }

這樣就自定義了一個新的 UI 組件 RangeInputField ,只重載了 run 方法, init 使用其父類中的方法。

下面就可以來測試這個新創(chuàng)建的自定義 UI 組件 RangeInputField, 我們使用 FormModel (使用 CModel)的方法來使用這個 UI 組件。

在 protected/models 下創(chuàng)建 RangeFrom.php

    class RangeForm extends CFormModel
    {
        public $from;
        public $to;

        function rules()
        {
            return array(
                array('from,to','numerical','integerOnly' =>true),
                array('from','compare','compareAttribute'=>'to',
                        'operator'=> '<=','skipOnError' => true),
            );
        }
    }

然后修改缺省 Controller 的缺省方法, protected/controllers/siteController.php 中 actionIndex 方法。

    public function actionIndex()
    {
        $success=false;
        $model=new RangeForm();

        if(!empty($_POST['RangeForm']))
        {
            $model->attributes=$_POST['RangeForm'];

            if($model->validate()) $success=true;

        }

        $this->render('index', array(
                'model' => $model,
                'success' => $success,
                ));
    }

創(chuàng)建對應的 View

    <!--?php if($success) : ?-->

    Success!

    <!--?php endif ?--></pre>
    <div class="form"><!--?php $form=$this--->beginWidget('CActiveForm'); ?>

     <!--?php echo $form--->errorSummary($model); ?>
    <div class="row"><!--?php $this--->widget('RangeInputField',array(
     'model'=>$model,
     'attributeFrom' => 'from',
     'attributeTo' => 'to',
     )) ?></div>
    <div class="row submit"></div>
    <!--?php $this--->endWidget(); ?></div>
    <pre>
    <!-- form -->

運行這個例子

http://wiki.jikexueyuan.com/project/yii-development-tutorial/images/10.1.jpg" alt="picture10.1" />

本例下載