- 1 第一个应用 Hello World
- 2 Yii Web 应用基础
- 3 为应用添加日志
- 4 Hangman 猜单词游戏实例
- 5 URL 管理
- 6 CComponent 组件
- 7 使用 CHtml 创建 Form
- 8 使用 FormModel
- 9 UI 组件 Widget 概述
- 10 UI 组件 自定义组件
- 11 UI 组件 ActiveForm 示例
- 12 UI 组件 ClipWidget 示例
- 13 UI 组件 ContentDecorator 示例
- 14 UI 组件 MaskedTextField 示例
- 15 UI 组件 MultiFileUpload 示例
- 16 UI 组件 StarRating 示例
- 17 UI 组件 TabView 示例
- 18 UI 组件 TextHighlighter 示例
- 19 UI 组件 TreeView 示例
- 20 UI 组件 Captcha 示例
- 21 UI 组件 自定义 Captcha 示例
- 22 UI 组件 Zii 组件简介
- 23 数据库-概述
- 24 数据库-DAO 示例
- 25 数据库-Query Builder 示例
- 26 数据库-Active Record 示例
- 27 数据库-关联 Active Record 示例
- 28 Data Provider 简介
- 29 Zii 组件-Menu 示例
- 30 Zii 组件-ListView 示例
- 31 Zii 组件-DetailView 示例
- 32 Zii 组件-GridView 示例
- 33 Zii 组件-Accordion 示例
- 34 Zii 组件-AutoComplete 示例
- 35 Zii 组件-Button 示例
- 36 Zii 组件-DatePicker 示例
- 37 Zii 组件-Dialog 示例
- 38 Zii 组件-ProgressBar 示例
- 39 Zii 组件-Slider 示例
- 40 Zii 组件-SliderInput 示例
- 41 Zii 组件-Tabs 示例
- 42 Zii 组件-Draggable 示例
- 43 Zii 组件-Droppable 示例
- 44 Zii 组件-Resizable 示例
- 45 Zii 组件-Selectable 示例
- 46 Zii 组件-Sortable 示例
- 47 主题 Theme 示例
- 48 多国语言示例
10 UI 组件 自定义组件
在介绍 Yii 内置 UI 组件之前,先介绍一下如何自定义组件,这样也有助于理解 CWidget 的用法, 自定义组件就是重载 CWidget 的 init() 和 run() 方法。
class MyWidget extends CWidget { public function init() { // 此方法会被 CController::beginWidget() 调用 } public function run() { // 此方法会被 CController::endWidget() 调用 } }
本例通过扩展 CInputWidget,定义一个值域输入 UI 组件-RangeInputField,也就是允许用户输入两个数字定义一个值域范围。CInputWidget 支持使用 CModel 或者直接使用变量,RangeInputField 也保留了这一传统。 RangeInputField 定义了三组属性。 $attributeFrom 和 $attributeTo 用于 CModel,配合 CHtml 的 activeXXX 方法,activeXXX 可以自动生成文本框的标签和文本框。 属性$nameFrom,$nameTo,$valueFrom,$valueTo 程序员可以自行定义文本框的标签。
按照 Yii 应用的缺省目录结构,新创建的 RangeInputField 放在 protected/components 目录下,因此创建 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 使用其父类中的方法。
下面就可以来测试这个新创建的自定义 UI 组件 RangeInputField, 我们使用 FormModel (使用 CModel) 的方法来使用这个 UI 组件。
在 protected/models 下创建 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, )); }
创建对应的 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 -->
运行这个例子
图片 10.1 picture10.1
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论