利用多层控制器来实现Widget

浏览:19715 发布日期:2013/05/18 分类:技术分享 关键字: Widget 多层控制器
虽然框架本身提供了W方法用于在模版里面调用Widget,按照之前的模式Widget类(参考开发手册的Widget扩展)有一些不足,包括:
  • 须要继承基础类Widget;
  • 模版定义不够灵活;
今天我们要实现的是另外一种方式,利用多层控制器的方式实现(多层控制器的具体用法可以参考:3.1快速入门的控制器高级特性)。
多层控制器是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>
最佳答案
评论( 相关
后面还有条评论,点击查看>>