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 相关文章推荐
模拟OICQ的实现思路和核心程序(一)
Oct 09 PHP
在WIN98下以apache模块方式安装php
Oct 09 PHP
PHP下几种删除目录的方法总结
Aug 19 PHP
php adodb操作mysql数据库
Mar 19 PHP
提高define性能的php扩展hidef的安装和使用
Jun 14 PHP
php中函数前加&符号的作用分解
Jul 08 PHP
php实现粘贴截图并完成上传功能
May 17 PHP
PHP+HTML+JavaScript+Css实现简单爬虫开发
Mar 28 PHP
PHP实现的简单对称加密与解密方法实例小结
Aug 28 PHP
Laravel框架基于中间件实现禁止未登录用户访问页面功能示例
Jan 17 PHP
PHP设计模式之观察者模式定义与用法分析
Apr 04 PHP
Laravel框架模型的创建及模型对数据操作示例
May 07 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
简单介绍下 PHP5 中引入的 MYSQLI的用途
2007/03/19 PHP
PHP+FFMPEG实现将视频自动转码成H264标准Mp4文件
2014/09/24 PHP
PHP开发中常用的十个代码样例
2016/02/02 PHP
checkbox 复选框不能为空
2009/07/11 Javascript
javascript中的继承实例代码
2011/04/27 Javascript
推荐40款强大的 jQuery 导航插件和教程(上篇)
2012/09/14 Javascript
如何动态的导入js文件具体该怎么实现
2014/01/14 Javascript
JS自调用匿名函数具体实现
2014/02/11 Javascript
jQuery的3种请求方式$.post,$.get,$.getJSON
2014/03/28 Javascript
谷歌浏览器不支持showModalDialog模态对话框的解决方法
2014/09/22 Javascript
js读写json文件实例代码
2014/10/21 Javascript
JavaScript插件化开发教程 (一)
2015/01/27 Javascript
使用JavaScript开发IE浏览器本地插件实例
2015/02/18 Javascript
Js实现自定义右键行为
2015/03/26 Javascript
JavaScript操作XML文件之XML读取方法
2015/06/09 Javascript
EasyUI中在表单提交之前进行验证
2016/07/19 Javascript
微信小程序实战之轮播图(3)
2017/04/17 Javascript
抖音上用记事本编写爱心小程序教程
2019/04/17 Javascript
js中的this的指向问题详解
2019/08/29 Javascript
JS写滑稽笑脸运动效果
2020/05/28 Javascript
[03:41]DOTA2上海特锦赛小组赛第三日recap精彩回顾
2016/02/28 DOTA
[02:46]完美世界DOTA2联赛PWL DAY4集锦
2020/11/03 DOTA
python通过imaplib模块读取gmail里邮件的方法
2015/05/08 Python
Python下rrdtool模块的基本使用方法
2015/11/13 Python
django基础之数据库操作方法(详解)
2017/05/24 Python
python3 selenium 切换窗口的几种方法小结
2018/05/21 Python
python 猴子补丁(monkey patch)
2019/06/26 Python
Python 数据可视化pyecharts的使用详解
2019/06/26 Python
Python with语句用法原理详解
2020/07/03 Python
贪睡宠物用品:Snoozer Pet Products
2020/02/04 全球购物
法律六进活动方案
2014/03/13 职场文书
体育之星事迹材料
2014/05/11 职场文书
实习公司领导推荐函
2014/05/21 职场文书
个人求职意向书
2015/05/11 职场文书
开学典礼校长致辞
2015/07/29 职场文书
CentOS MySql8 远程连接实战
2022/04/19 MySQL