ThinkPHP3.1的Widget新用法


Posted in PHP onJune 19, 2014

ThinkPHP3.0版本的Widget对Action和View的支持力度是相对不够的,仅能够实现基本的模板渲染输出。而3.1版本的发布带来的多层MVC功能,给我们实现Widget的方式带来了新的思路,且看是如何实现吧。

由于ThinkPHP3.1增加了对多层MVC的支持,因此3.1版本可以支持多层的控制器功能,由此我们就可以在控制器层再增加一层:Widget层。

首先,还是在项目的Lib目录下面创建一个Widget目录,并且创建一个TestWidget类(Lib/Widget/TestWidget.class.php)如下:

class TestWidget extends Action{
  public function hello($name=''){
    echo ("hello,".$name."!");
  }
 }

我们看到TestWidget和之前的区别是没有继承Widget类,而是直接继承了Action类,这就代表着在TestWidget中可以直接调用Action的方法,包括对模板的渲染输出。

定义完成后,我们怎么调用这个Widget呢?用W方法肯定行不通了,这次需要R方法出场了。
R方法的作用是远程调用模块的操作,但是3.1赋予了它新的作用,可以支持调用所有控制器层的操作方法,所以,我们可以在模板中这样来调用Widget:

{:R('Test/hello',array('ThinkPHP'),'Widget')}

就可以实现在页面中的某个区域输出:

hello,ThinkPHP!

由于除了Action控制器之外的其他控制器层是无法直接通过URL访问的,所以这个Widget方法只能通过R方法在内部调用才可以。

你可以在TestWidget类中调用Model来输出其他数据,如果需要渲染自身的模板,则可以直接调用display方法就行了。

class TestWidget extends Action{
  public function hello($name=''){
    $this->assign('name',$name);
    $this->display('Test:hello');
  }
 }

我们在项目的Tpl/Test/ 目录下面创建一个hello(Tpl/Test/hello.html)模板文件,添加输出:

Hello,{$name}!

如果你希望和之前的Widget一样,把模板文件放到当前目录下面,则可以使用:

class TestWidget extends Action{
  public function hello($name=''){
    $this->assign('name',$name);
    $this->display(dirname(__FILE__).'/Test/hello.html');
  }
 }

这个时候,你就可以把刚才定义的hello模板文件放入Widget/Test/ 目录下面了。

PHP 相关文章推荐
用PHP实现的生成静态HTML速度快类库
Mar 31 PHP
一道关于php变量引用的面试题
Aug 08 PHP
php基于base64解码图片与加密图片还原实例
Nov 03 PHP
php修改文件上传限制方法汇总
Apr 07 PHP
从wamp到xampp的升级之路
Apr 08 PHP
WordPress网站性能优化指南
Nov 18 PHP
解析WordPress中函数钩子hook的作用及基本用法
Dec 22 PHP
在Mac OS上自行编译安装Apache服务器和PHP解释器
Dec 24 PHP
PHP数组内存利用率低和弱类型详细解读
Aug 10 PHP
基于swoole实现多人聊天室
Jun 14 PHP
laravel通用化的CURD的实现
Dec 13 PHP
PHP的imageTtfText()函数深入详解
Mar 03 PHP
ThinkPHP3.1新特性之命名范围的使用
Jun 19 #PHP
ThinkPHP3.1新特性之Action参数绑定
Jun 19 #PHP
ThinkPHP3.1新特性之多层MVC的支持
Jun 19 #PHP
php定界符
Jun 19 #PHP
php获取网页中图片、DIV内容的简单方法
Jun 19 #PHP
PHP两种去掉数组重复值的方法比较
Jun 19 #PHP
PHP封装的一个支持HTML、JS、PHP重定向的多功能跳转函数
Jun 19 #PHP
You might like
解决CodeIgniter伪静态失效
2014/06/09 PHP
Yii2框架引用bootstrap中日期插件yii2-date-picker的方法
2016/01/09 PHP
php连接mysql数据库最简单的实现方法
2019/09/24 PHP
List the Codec Files on a Computer
2007/06/18 Javascript
ext jquery 简单比较
2010/04/07 Javascript
jqTransform form表单美化插件使用方法
2012/07/05 Javascript
jquery增加时编辑jqGrid(实例代码)
2013/11/08 Javascript
IE6中链接A的href为javascript协议时不在当前页面跳转
2014/06/05 Javascript
js处理php输出时间戳对不上号的解决方法
2014/06/20 Javascript
jQuery遮罩层效果实例分析
2016/01/14 Javascript
jQuery插件ImageDrawer.js实现动态绘制图片动画(附源码下载)
2016/02/25 Javascript
全面解析jQuery $(document).ready()和JavaScript onload事件
2016/06/08 Javascript
JS实用的带停顿的逐行文本循环滚动效果实例
2016/11/23 Javascript
基于JavaScript实现随机颜色输入框
2016/12/10 Javascript
js实现一个简单的数字时钟效果
2017/03/29 Javascript
jsonp跨域请求详解
2017/07/13 Javascript
vue绑定设置属性的多种方式(5)
2017/08/16 Javascript
VUE项目中加载已保存的笔记实例方法
2019/09/14 Javascript
用Python的urllib库提交WEB表单
2009/02/24 Python
python实现将元祖转换成数组的方法
2015/05/04 Python
R语言 vs Python对比:数据分析哪家强?
2017/11/17 Python
python字符串的方法与操作大全
2018/01/30 Python
判断python字典中key是否存在的两种方法
2018/08/10 Python
python中嵌套函数的实操步骤
2019/02/27 Python
css3media响应式布局实例
2016/07/08 HTML / CSS
HTML5+WebSocket实现多文件同时上传的实例
2016/12/29 HTML / CSS
美国最大网上鞋店:Zappos
2016/07/25 全球购物
新锐科技Java程序员面试题
2016/07/25 面试题
专业实习自我鉴定
2013/10/29 职场文书
房地产项目建议书
2014/03/12 职场文书
C++程序员求职信
2014/05/07 职场文书
学校安全管理责任书
2014/07/23 职场文书
行政工作试用期自我评价
2014/09/14 职场文书
民主评议党员登记表自我评价
2014/10/20 职场文书
赢在中国观后感
2015/06/02 职场文书
欢迎新生标语2015
2015/07/16 职场文书