您的位置:首页 > 编程语言 > PHP开发

Yii 1.1 扩展 widget

2016-09-12 13:59 176 查看
http://www.yiichina.com/tutorial/334

本文的目录结构使用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输出了正确的结果么?祝你成功。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: