YII框架分析笔记7:挂件widget
来源:互联网 发布:acl审计软件 编辑:程序博客网 时间:2024/06/11 18:44
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;}上面是直接加载挂件方法,通过第三个参数来决定是返回内容还是直接输出内容,widget是通过CWidgetFactory来创建。
以网站常见的面包屑导航为例,下面是视图文件中的代码
$this->breadcrumbs=array('Users',);$this->widget('zii.widgets.CBreadcrumbs', array('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(); ?>代码中beginContent($view=null,$data=array())其实是对beginWidget('CContentDecorator',array('view'=>$view, 'data'=>$data))再次封装,创建内容装饰挂件CContentDecorator,把主视图传进去,
与widget()的不同点是通过$this->_widgetStack[]=$widget和$widget=array_pop($this->_widgetStack)),应用栈来操作挂件,在两个方法中间的内容通过php内容输出缓冲函数捕获,所有上面代码的作用是将<div id="content"><?php echo $content; ?></div>以变量($content)的方式传给main.php中。
- YII框架分析笔记7:挂件widget
- 【Yii】挂件widget
- Yii框架的挂件的使用
- Yii框架分析之widget与action的关系
- widget挂件怎么使用
- yii 自定义挂件
- YII框架分析笔记6:视图
- YII框架分析笔记8:CDataProvider
- YII框架分析笔记9:url路由
- YII框架分析笔记10:日志
- YII框架分析笔记11:模块module
- YII框架分析笔记12:主题管理
- YII框架分析笔记13:单元测试
- YII框架分析笔记6:视图
- YII框架分析笔记11:模块module
- YII框架分析笔记1:YII执行流程
- YII框架分析笔记1:YII执行流程
- YII框架分析笔记1:YII执行流程
- The 10 Minute Test Plan
- 《JAVA编程思想》(一)
- 50 Most Frequently Used UNIX / Linux Commands (With Examples)
- 立体效果的渐进条的绘制方法
- ( IDE ) || ( !IDE ) 来选择程序员的等级
- YII框架分析笔记7:挂件widget
- 话说JAVA SOCKET同步点对点聊天程序实例 1.0
- VS2010包含windows.h时winsock2.h出现"fd_set":struct类型重定义
- listview实现上一页下一页
- Android数据存储之ContentProvider存储数据
- poll服务端程序例子
- VS2010环境下Winpcap配置方法
- 宽屏玩魔兽,注册表编写
- Java学习从入门到精通