【Yii】挂件widget
来源:互联网 发布:c语言课程设计小论文 编辑:程序博客网 时间:2024/06/11 16:25
widget好处是方面重用和灵活移动。CWidget是所有的widge父类,同时它又是是CBaseController的子类,CWidget提供了类似CController中的一些方法,但render()方法渲染的时候不带layout,而且渲染的时候$this指得是CWidget对象,而不是CController对象,CController对象可以通过其中的getController()方法获取,用其子类中需要对init()和run()方法重载以定制不同的挂件。
CBaseController提供widget()方法以及beginWidget()、endWidget()方法加载挂件。
- public function widget($className,$properties=array(),$captureOutput=false)
- {
- if($captureOutput)
- {
- ob_start();
- ob_implicit_flush(false);
- $widget=$this->createWidget($className,$properties);
- $widget->run();
- return ob_get_clean();
- }
- else
- {
- $widget=$this->createWidget($className,$properties);
- $widget->run();
- return $widget;
- }
- }
- public function createWidget($className,$properties=array())
- {
- $widget=Yii::app()->getWidgetFactory()->createWidget($this,$className,$properties);
- $widget->init();
- return $widget;
- }
以网站常见的面包屑导航为例,下面是视图文件中的代码
- $this->breadcrumbs=array(
- <span style="white-space:pre"> </span>'Users',
- );
- $this->widget('zii.widgets.CBreadcrumbs', array(
- <span style="white-space:pre"> </span>'links'=>$this->breadcrumbs,
- ));
通过CBaseController的widget()方法,创建CBreadcrumbs挂件,初始化后,执行run()方法渲染内容。
- /**
- * Renders the content of the portlet.
- */
- public function run()
- {
- if(empty($this->links))
- return;
- echo CHtml::openTag($this->tagName,$this->htmlOptions)."\n";
- $links=array();
- if($this->homeLink===null)
- $links[]=CHtml::link(Yii::t('zii','Home'),Yii::app()->homeUrl);
- else if($this->homeLink!==false)
- $links[]=$this->homeLink;
- foreach($this->links as $label=>$url)
- {
- if(is_string($label) || is_array($url))
- $links[]=CHtml::link($this->encodeLabel ? CHtml::encode($label) : $label, $url);
- else
- $links[]='<span>'.($this->encodeLabel ? CHtml::encode($url) : $url).'</span>';
- }
- echo implode($this->separator,$links);
- echo CHtml::closeTag($this->tagName);
- }
另外一个多级布局例子来说明beginWidget()、endWidget()的用法。在脚手架生成的代码中,layout下的column1中的代码
- <?php $this->beginContent('//layouts/main'); ?>
- <div id="content">
- <?php echo $content; ?>
- </div><!-- content -->
- <?php $this->endContent(); ?>
与widget()的不同点是通过$this->_widgetStack[]=$widget和$widget=array_pop($this->_widgetStack)),应用栈来操作挂件,在两个方法中间的内容通过php内容输出缓冲函数捕获,所有上面代码的作用是将<div id="content"><?php echo $content; ?></div>以变量($content)的方式传给main.php中
0 0
- 【Yii】挂件widget
- YII框架分析笔记7:挂件widget
- widget挂件怎么使用
- yii 自定义挂件
- zhphp framework (十四) widget 挂件
- Yii----Widget
- 对widget(挂件技术)的一点看法
- Yii框架的挂件的使用
- yii创建widget
- Yii之widget
- yii widget使用
- Yii之widget
- yii widget使用
- yii widget 调用过程
- Yii中自定义Widget
- Yii之widget专题
- Yii 1.1 扩展 widget
- thinkPHP下的widget挂件原理与使用方法
- Codeforces Round #245 (Div. 2) D
- SQL相关知识复习,比较难的几个查询
- 【Yii】视图
- 敌兵布阵 线段树入门第一题
- C语言中内存的动态分配与释放(多维动态数组构建)
- 【Yii】挂件widget
- Java文件删除所有注释 工具+eclipse批量替换(亲测好使)
- 【Yii】CDataProvider
- 如何在java环境下使用feature option(如何添加FeatureOption.xxx)
- leetcode第一刷_Generate Parentheses
- WindowEvent
- 【Yii】url路由
- 虚拟地球原理与实现
- 编程语言系列(二)--C++语言基础知识点总结