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实现文件下载代码分享
Aug 19 PHP
php生成随机数的三种方法
Sep 10 PHP
php实现插入排序
Mar 29 PHP
php中smarty模板条件判断用法实例
Jun 11 PHP
示例详解Laravel重置密码代码重构
Aug 10 PHP
PHP文件管理之实现网盘及压缩包的功能操作
Sep 20 PHP
Laravel学习教程之model validation的使用示例
Oct 23 PHP
ecshop添加菜单及权限分配问题
Nov 21 PHP
详解php用static方法的原因
Sep 12 PHP
laravel框架添加数据,显示数据,返回成功值的方法
Oct 11 PHP
laravel model 两表联查示例
Oct 24 PHP
Centos7安装swoole扩展操作示例
Mar 26 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防止表单重复提交的几种常用方法汇总
2014/08/19 PHP
php遍历替换目录下文件指定内容的方法
2016/11/10 PHP
PHP文件上传、客户端和服务器端加限制、抓取错误信息、完整步骤解析
2017/01/12 PHP
php设计模式之观察者模式定义与用法经典示例
2019/09/19 PHP
理解 JavaScript 预解析
2009/10/25 Javascript
jQuery左侧大图右侧小图焦点图幻灯切换代码分享
2015/08/19 Javascript
jQuery实现带水平滑杆的焦点图动画插件
2016/03/08 Javascript
关于JSON.parse(),JSON.stringify(),jQuery.parseJSON()的用法
2016/06/30 Javascript
js获取浏览器高度 窗口高度 元素尺寸 偏移属性的方法
2016/11/21 Javascript
基于jQuery实现选项卡效果
2017/01/04 Javascript
vue.js实现含搜索的多种复选框(附源码)
2017/03/23 Javascript
layui实现tab的添加拒绝重复的方法
2019/09/04 Javascript
基于Vue+ElementUI的省市区地址选择通用组件
2019/11/20 Javascript
在vant 中使用cell组件 定义图标该图片和位置操作
2020/11/02 Javascript
Python中使用copy模块实现列表(list)拷贝
2015/04/14 Python
搭建Python的Django框架环境并建立和运行第一个App的教程
2016/07/02 Python
Python selenium如何设置等待时间
2016/09/15 Python
Python常见格式化字符串方法小结【百分号与format方法】
2016/09/18 Python
python snownlp情感分析简易demo(分享)
2017/06/04 Python
Python实现修改IE注册表功能示例
2018/05/10 Python
python实现反转部分单向链表
2018/09/27 Python
Python正则匹配判断手机号是否合法的方法
2020/12/09 Python
pip安装py_zipkin时提示的SSL问题对应
2018/12/29 Python
树莓派与PC端在局域网内运用python实现即时通讯
2019/06/22 Python
用Cython加速Python到“起飞”(推荐)
2019/08/01 Python
Selenium基于PIL实现拼接滚动截图
2020/04/10 Python
Python 如何批量更新已安装的库
2020/05/26 Python
Pytest测试框架基本使用方法详解
2020/11/25 Python
宝拉珍选美国官网:Paula’s Choice美国
2018/01/07 全球购物
英国领先的在线高尔夫商店:Gamola Golf
2019/11/16 全球购物
农民入党思想汇报
2014/01/03 职场文书
电气工程自动化求职信
2014/03/14 职场文书
秋季开学典礼主持词
2014/03/19 职场文书
工作会议简报
2015/07/20 职场文书
2015年学校办公室主任工作总结
2015/07/20 职场文书
HttpClient实现表单提交上传文件
2022/08/14 Java/Android