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反弹shell实现代码
Apr 22 PHP
PHP 采集心得技巧
May 15 PHP
php中mysql模块部分功能的简单封装
Sep 30 PHP
php中json_decode()和json_encode()的使用方法
Jun 04 PHP
深入PHP empty(),isset(),is_null()的实例测试详解
Jun 06 PHP
ThinkPHP文件上传实例教程
Aug 22 PHP
PHP中soap的用法实例
Oct 24 PHP
php使用文本统计访问量的方法
May 12 PHP
浅谈PHP中try{}catch{}的使用方法
Dec 09 PHP
yii框架无限极分类的实现方法
Apr 08 PHP
PHP框架Laravel中使用UUID实现数据分表操作示例
May 30 PHP
PHP扩展安装方法步骤解析
Nov 24 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
通过文字传递创建的图形按钮
2006/10/09 PHP
PHP中的string类型使用说明
2010/07/27 PHP
ThinkPHP调用common/common.php函数提示错误function undefined的解决方法
2014/08/25 PHP
php使用curl下载指定大小的文件实例代码
2017/09/30 PHP
详解如何实现Laravel的服务容器的方法示例
2019/04/15 PHP
jquery.cookie.js 操作cookie实现记住密码功能的实现代码
2011/04/27 Javascript
javascript实现tabs选项卡切换效果(自写原生js)
2013/03/19 Javascript
jQuery获取Radio,CheckBox选择的Value值(示例代码)
2013/12/12 Javascript
javascript中字符串的定义示例代码
2013/12/19 Javascript
js加载读取内容及显示与隐藏div示例
2014/02/13 Javascript
js实现二级菜单渐隐显示
2015/11/03 Javascript
jQuery移动页面开发中的触摸事件与虚拟鼠标事件简介
2015/12/03 Javascript
详解jQuery同步Ajax带来的UI线程阻塞问题及解决办法
2017/08/09 jQuery
jQuery Ajax向服务端传递数组参数值的实例代码
2017/09/03 jQuery
Angular 作用域scope的具体使用
2017/12/11 Javascript
vue基于Echarts的拖拽数据可视化功能实现
2020/12/04 Vue.js
全面解析js中的原型,原型对象,原型链
2021/01/25 Javascript
Vue实现todo应用的示例
2021/02/20 Vue.js
[02:19]DOTA2女子战队FOX视频专访:希望更多美眉一起加入
2013/10/15 DOTA
Python基本数据类型详细介绍
2014/03/11 Python
基于python 字符编码的理解
2017/09/02 Python
书单|人生苦短,你还不用python!
2017/12/29 Python
python Spyder界面无法打开的解决方法
2018/04/27 Python
简单谈谈python基本数据类型
2018/09/26 Python
Python类的继承super相关原理解析
2020/10/22 Python
简单总结CSS3中视窗单位Viewport的常见用法
2016/02/04 HTML / CSS
将HTML5 Canvas的内容保存为图片借助toDataURL实现
2013/05/20 HTML / CSS
HTML5移动端手机网站开发流程
2016/04/25 HTML / CSS
美国香薰蜡烛品牌:PADDYWAX
2018/10/06 全球购物
购买原创艺术品:Zatista
2019/11/09 全球购物
大学生的网络创业计划书
2013/12/26 职场文书
西式婚礼证婚词
2014/01/12 职场文书
中学生英语演讲稿
2014/04/26 职场文书
2014年医院后勤工作总结
2014/12/06 职场文书
美甲店的创业计划书模板
2019/08/23 职场文书
微信小程序调用python模型
2022/04/21 Python