上一篇文章介绍过模板继承。我们在使用模板继承时会遇到一个问题:公共模板没有对应的控制器,如果公共模板局部的数据需要是动态的,比如顶部的菜单、底部的友情链接等等,这将无法实现。
为了解决这个问题,Thinkphp提供一个非常有用的功能:Widget扩展。它可以很好的解决上面的问题,下面介绍下具体操作步骤:
1.创建扩展类文件
在当前应用目录中创建 Widget 目录,然后在Widget目录中创建扩展文件,比如 CategoryWidget.class.php (注意文件名的格式 后面必须是Widget.class.php);编辑该文件,这里我们测试制作一个显示导航的扩展:
<?php namespace Home\Widget; use Think\Controller; class CategoryWidget extends Controller{ public function showCate(){ $category = M("category"); $categorys = $category->select(); $this->assign("categorys",$categorys); $this->display("Public:nav"); } }
注意:$this->display("Public:nav"); 这里是将内容传给扩展的模板文件,示例指的是View/Public/nav.html模板
2.创建扩展模板文件
在应用下 View目录下创建扩展目录 Public(名字个自定义),然后在扩展目录中创建扩展模板 nav.html。注意如果View目录中有多种主题,扩展目录应该放在相应的主题目录中。
创建好以后,编辑模板。这个模板只是为了显示扩展文件中传入的数据,因此只是一个片段,并不是完整的模板页面。如下面:
<foreach name="categorys" item="category"> <div class="nav">{$category.title}</div> </foreach>
以上就完成扩展的创建。
3.调用扩展
制作好的扩展,我们在模板文件的任何地方调用。
调用格式是 {:W("Category/showCate")}
其中的参数Category是扩展类名,showCate是方法名。