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
Oct 09 PHP
PHP 字符截取 解决中文的截取问题,不用mb系列
Sep 29 PHP
php文件上传表单摘自drupal的代码
Feb 15 PHP
php数组编码转换示例详解
Mar 11 PHP
ThinkPHP模板输出display用法分析
Nov 26 PHP
Zend Framework分页类用法详解
Mar 22 PHP
PHP安全下载文件的方法
Apr 07 PHP
PHP 搜索查询功能实现
Nov 29 PHP
Laravel如何友好的修改.env配置文件详解
Jun 07 PHP
PHP实现APP微信支付的实例讲解
Feb 10 PHP
PHP实现的大文件切割与合并功能示例
Apr 10 PHP
Laravel 登录后清空COOKIE的操作方法
Oct 14 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使用glob函数快速查询指定目录文件的方法
2014/11/15 PHP
actionscript与javascript的区别
2011/05/25 Javascript
jquery ajax例子返回值详解
2012/09/11 Javascript
基于jquery自己写tab滑动门(通用版)
2012/10/30 Javascript
javascript使用call调用微信API
2014/12/15 Javascript
JavaScript学习笔记之定时器
2015/01/22 Javascript
简介JavaScript中的getSeconds()方法的使用
2015/06/10 Javascript
全面总结Javascript对数组对象的各种操作
2017/01/22 Javascript
Angular 4 指令快速入门教程
2017/06/07 Javascript
three.js中文文档学习之通过模块导入
2017/11/20 Javascript
详解Vue组件插槽的使用以及调用组件内的方法
2018/11/13 Javascript
Vue项目中使用jquery的简单方法
2019/05/16 jQuery
JavaScript回调函数callback用法解析
2020/01/14 Javascript
Vue this.$router.push(参数)实现页面跳转操作
2020/09/09 Javascript
[50:45]2018DOTA2亚洲邀请赛 4.6 淘汰赛 VP vs TNC 第一场
2018/04/10 DOTA
Python中设置变量访问权限的方法
2015/04/27 Python
python显示生日是星期几的方法
2015/05/27 Python
python fabric实现远程部署
2017/01/05 Python
Python3.6日志Logging模块简单用法示例
2018/06/14 Python
python看某个模块的版本方法
2018/10/16 Python
用python给自己做一款小说阅读器过程详解
2019/07/11 Python
Python3远程监控程序的实现方法
2019/07/15 Python
pycharm安装及如何导入numpy
2020/04/03 Python
django models里数据表插入数据id自增操作
2020/07/15 Python
如何使用Django Admin管理后台导入CSV
2020/11/06 Python
CSS3实现文本垂直排列的方法
2018/07/10 HTML / CSS
CSS3动画特效在活动页中的应用
2020/01/21 HTML / CSS
美国著名珠宝品牌之一:Jared The Galleria Of Jewelry
2016/10/01 全球购物
iHerb中文官网:维生素、保健品和健康产品
2018/11/01 全球购物
日本最佳原创设计品牌:Felissimo(芬理希梦)
2019/03/19 全球购物
Stutterheim瑞典:瑞典高级外套时装品牌
2019/06/24 全球购物
Bed Bath & Beyond加拿大官网:购买床上用品、浴巾、厨房电器等
2019/10/04 全球购物
入团者的自我评价分享
2013/12/02 职场文书
《掌声》教学反思
2014/02/23 职场文书
党校毕业个人总结
2015/02/28 职场文书
Java 常见的限流算法详细分析并实现
2022/04/07 Java/Android