- 须要继承基础类Widget;
- 模版定义不够灵活;
多层控制器是3.1版本开始引入的,利用该特性实现Widget功能远比之前的方式更简单更灵活,下面我们来了解下吧。
举个例子,我们在页面中实现一个分类显示的Widget,首先我们要实现我们首先定义一个Widget控制器层 CateWidget,如下:
class CateWidget extends Action {
public function menu(){
return 'menuWidget';
}
}看清楚了,CateWidget类没有继承Widget,而是继承Action,这就是和使用Widget扩展方式的最大区别。然后,我们在模版中通过R方法调用这个Widget(扩展Widget方式在模版中使用的是W方法),如果对R函数不了解的参考这里。
{:R('Cate/Menu','','Widget')} 执行后的输出结果是: menuWidget如果,CateWidget类的menu方法改成:
class CateWidget extends Action {
public function menu(){
echo 'menuWidget';
}
}模版中的用法则需要改成:{~R('Cate/Menu','','Widget')} 如果需要在调用Widget的时候 使用参数,可以这样定义:class CateWidget extends Action {
public function menu($id,$name){
echo $id.':'.$name;
}
}模版中的参数调用,使用:{:R('Cate/Menu',array(5,'thinkphp'),'Widget')} 则会输出 5:thinkphp来一个复杂一点的例子:
class CateWidget extends Action {
public function menu(){
$menu = M('Cate')->getField('id,title');
$this->assign('menu',$menu);
$this->display('Cate:menu');
}
}CateWiget类渲染了一个模版文件Tpl/Cate/menu.html,调用模版的灵活也是使用这种方式实现Widget的区别(Widget扩展方式中需要调用renderFile方法渲染模版)。在menu.html模版文件中的用法:
<foreach name="menu" item="title">
{$key}:{$title}
</foreach> 最佳答案