Yii 1.1 扩展 widget [ 1.1 版本 ]
本文的目录结构使用Yii Path Alias描述
视图层中有许多公共部分,这里面一部分完全公用的东西我们可以放在layout里面,然而还有一部分是有差异的,比如这一个栏目的sidebar和另一个栏目的sidebar就有可能不一样。这个时候怎么来处理呢?有的人会选择制作多个layout,在不同地方切换layout,但这样代码的重用性没有发挥出来,而且不够灵活。yii里面有一个很方便的机制来解决这一问题,那就是 —— widget,小部件是也。
yii里面有一些自带的widget,他们放在web.widgets
和zii.widgets
下面,比如有我们常用的CLinkPager
、CMenu
大家可以看一看。
要自己扩展widget,根据手册上的介绍,需要继承CWidget
,并且覆盖run()
方法。我们来开始扩展第一个widget:
创建widget存放目录:
在application
(默认是protected
)下创建目录widgets
,用来存放widget类,然后创建widgets.views
目录,用来存放widget的视图文件。创建widget类:
在application.widgets
下面创建一个名为TestWidget.php
的文件,命名没太大讲究,保证唯一性,见名知意即可。在里面加入以下代码:
class TestWidget extends CWidget
{
public $datetime = '';
public function run()
{
$datetime = empty($this->datetime) ? date('Y-m-d H:i:s') : $this->datetime;
$this->render('test', array('datetime'=>$datetime));
}
}
解释一下这段代码:按照规则,类名TestWidget
与文件名TestWidget.php
相同,类TestWidget
需要继承CWidget
,然后重写(rewrite)run()
方法,该方法会在widget被渲染是调用。在run()
方法里调用$this->render()
方法渲染test
视图,将变量$datetime
传递到视图(参见控制器的视图渲染)。可以在里面查询数据库,进行各种操作,将运算的结果传入视图。
- 创建视图文件:
在application.widgets.views
下创建视图文件test.php
,在里面加入代码:
now is <?php echo $datetime;?>
注:自己扩展的widget所需要渲染的视图需要放在application.widgets.views
下,以php为扩展名。可以在视图里使用render
传入的变量。
- 调用widget:
准备工作做好了,可以在视图里使用<?php $this->widget('application.widgets.TestWidget');?>
来调用widget。如果我们要对widget进行一些数据动态化的调用该怎么办呢?
还记得我们在类TestWidget
里面定义的成员属性$datetime
么?我们可以使用以下方法对其进行覆盖传值:
<?php $this->widget('application.widgets.TestWidget', array(
'datetime'=>'2015/1/19',
));?>
注意:需要进行传值必须定义成widget
类的成员属性,并且访问权限为public
你的widget输出了正确的结果么?祝你成功。
FatrBaby Chengdu
最后登录:2019-04-04
在线时长:57小时52分
- 粉丝31
- 金钱5457
- 威望45
- 积分6477
共 3 条评论
由于项目需要,YII 1.1整合smarty后,widget怎么用
扩展一个smarty的plugin.因为要自动执行widget类的run()方法。
如果我要给widgets传的参数很多,那岂不是要在widgets里定义很多public成员属性。有方法可以解决这个问题吗?
不需要手动定义的,CWidgetFactory中的createWidget方法已经通过遍历属性参数来定义widgets中的成员属性。
分享的简洁明了,很赞!