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连mysql和oracle数据库性能比较
Oct 09 PHP
PHP5新特性: 更加面向对象化的PHP
Nov 18 PHP
PHP中的extract的作用分析
Apr 09 PHP
PHP实时显示输出
Oct 02 PHP
深入eAccelerator与memcached的区别详解
Jun 06 PHP
分享一个Laravel好用的Cache宏
Mar 02 PHP
php的mail函数发送UTF-8编码中文邮件时标题乱码的解决办法
Oct 20 PHP
PHP读取文件的常见几种方法
Nov 03 PHP
thinkPHP5.0框架配置格式、加载解析与读取方法
Mar 17 PHP
php实现数组纵向转横向并过滤重复值的方法分析
May 29 PHP
php简单实现单态设计模式的方法分析
Jul 28 PHP
TP5框架实现自定义分页样式的方法示例
Apr 05 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
php 判断访客是否为搜索引擎蜘蛛的函数代码
2011/07/29 PHP
Laravel 模型使用软删除-左连接查询-表起别名示例
2019/10/24 PHP
JQuery 选择器、过滤器介绍
2011/02/14 Javascript
兼容主流浏览器的iframe自适应高度js脚本
2014/01/10 Javascript
基于OL2实现百度地图ABCD marker的效果
2015/10/01 Javascript
谈谈JavaScript中的几种借用方法
2016/08/09 Javascript
利用JQuery实现datatables插件的增加和删除行功能
2017/01/06 Javascript
jquery.tableSort.js表格排序插件使用方法详解
2020/08/12 Javascript
angular2+node.js express打包部署的实战
2017/07/27 Javascript
JavaScript 声明私有变量的两种方式
2021/02/05 Javascript
[53:15]Newbee vs Pain 2018国际邀请赛小组赛BO2 第二场 8.16
2018/08/17 DOTA
python类继承用法实例分析
2014/10/10 Python
Python生成器定义与简单用法实例分析
2018/04/30 Python
Python装饰器的执行过程实例分析
2018/06/04 Python
Python设计模式之桥接模式原理与用法实例分析
2019/01/10 Python
Python 保存矩阵为Excel的实现方法
2019/01/28 Python
人工神经网络算法知识点总结
2019/06/11 Python
django2笔记之路由path语法的实现
2019/07/17 Python
基于多进程中APScheduler重复运行的解决方法
2019/07/22 Python
使用PyWeChatSpy自动回复微信拍一拍功能的实现代码
2020/07/02 Python
MoviePy常用剪辑类及Python视频剪辑自动化
2020/12/18 Python
HTML5制作酷炫音频播放器插件图文教程
2014/12/30 HTML / CSS
印尼最大的婴儿用品购物网站:Orami
2017/09/28 全球购物
NFL墨西哥官方商店:Tienda NFL
2017/11/28 全球购物
我能否用void** 指针作为参数, 使函数按引用接受一般指针
2013/02/16 面试题
销售业务实习自我鉴定
2013/09/23 职场文书
机电一体化自荐信
2013/12/10 职场文书
班级德育工作实施方案
2014/02/21 职场文书
副乡长群众路线教育实践活动个人对照检查材料
2014/09/19 职场文书
幽灵公主观后感
2015/06/09 职场文书
Python中os模块的简单使用及重命名操作
2021/04/17 Python
SQL实现LeetCode(180.连续的数字)
2021/08/04 MySQL
MongoDB日志切割的三种方式总结
2021/09/15 MongoDB
python数据可视化使用pyfinance分析证券收益示例详解
2021/11/20 Python
基于Python实现一个春节倒计时脚本
2022/01/22 Python
Redis 限流器
2022/05/15 Redis