YII中Widget使用技巧

用过博客系统Wordpress的同学都知道,Wordpress的界面上可以定制很多Widget小控件。比如挂个日历,挂个top20等等。Widget的好处就是实现了前端UI的复用。比如首页,文章页想添加一个小控件,直接引用就行。觉得控件样式不好看只需要修改一次即可。今天说下Yii框架如何实现Widget的功能。

Yii框架中因为Layouts布局文件已经相当强大,Widget能实现的功能他都能做到,所以Widget很少被用到。这里就会产生一些思想斗争,比如Widget该不该用?Layouts已经正常在跑了需不需要换到Widget?Widget可是会增加多次函数调用,多写了大量逻辑,确定要用?

起初我也不知道如何去抉择,换成Widget的话使得逻辑更清晰,但是代码的速度肯定受影响。就像面向对象让代码的结构更清晰,但是牺牲了速度,虽然函数的调用开销可以忽略不计。(在用户量没有到Facebook这种级别谈PHP的执行效率都是耍流氓)。所以不用思考太多了,通过Widget让代码更清晰。

网站的设计所有header与footer是一样的,所以写在Layouts布局文件中设置就行。但是“访问量最多的20篇文章”在网站中很多地方都有用到。此时Widget可以出场了。Yii框架对Widget支持非常棒,代码也非常简单。项目中的目录结构如下:

一.在项目目录下新建一个文件夹Widget
你可以放在项目的任何地方,不一定像我一样新建文件夹。

二.在配置文件中import Widget目录。
必须要让框架能找到Widget目录,找不到的话没法调用……

1
2
3
'import'=>array(  
'application.widget.\*'
),

三.在Widget目录下新建SlideWidget.php类文件。

1
2
3
4
5
6
7
8
9
10
//类名必须Widget结尾,必须继承CWidget  
class SlideWidget extends CWidget {

public $slideId="";
public function run() {
$this->render('slide',array(
"id"=>$this->slideId,
));
}
}

四.在Widget目录下新建views目录,并在views目录下新建试图文件slide.php
这个不难理解,相当于自己在大项目中开了个小项目!

五.调用Widget

1
<?php $this->widget('SlideWidget',array('slideId'=>$slideId)); ?>

调用就是如此简单,注意传递的参数在SlideWidget类中是以属性的方式调用的。详情可看在第三部中的$slideId变量。