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 相关文章推荐
最小化数据传输――在客户端存储数据
Oct 09 PHP
一周学会PHP(视频)Http下载
Dec 12 PHP
PHP控制网页过期时间的代码
Sep 28 PHP
Zend Studio (eclipse)使用速度优化方法
Mar 23 PHP
PHP 的异常处理、错误的抛出及回调函数等面向对象的错误处理方法
Dec 07 PHP
使用HMAC-SHA1签名方法详解
Jun 26 PHP
PHP字符串长度计算 - strlen()函数使用介绍
Oct 15 PHP
ThinkPHP3.1查询语言详解
Jun 19 PHP
php导入excel文件到mysql数据库的方法
Jan 14 PHP
将PHP从5.3.28升级到5.3.29时Nginx出现502错误
May 09 PHP
深入浅析PHP7.0新特征(五大新特征)
Oct 29 PHP
PHP fopen函数用法实例讲解
Feb 15 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
全国FM电台频率大全 - 31 新疆维吾尔族自治区
2020/03/11 无线电
利用php获取服务器时间的实现代码
2013/06/07 PHP
PHP中imagick函数的中文解释
2015/01/21 PHP
Yii 2.0中场景的使用教程
2017/06/02 PHP
PHP判断json格式是否正确的实现代码
2017/09/20 PHP
PHP PDOStatement::setFetchMode讲解
2019/02/03 PHP
PHP开发api接口安全验证操作实例详解
2020/03/26 PHP
js解析与序列化json数据(二)序列化探讨
2013/02/01 Javascript
js 输出内容到新窗口具体实现代码
2013/05/31 Javascript
javascript实现des解密加密全过程
2014/04/03 Javascript
高效的jquery数字滚动特效
2015/12/17 Javascript
以WordPress为例讲解jQuery美化页面Title的方法
2016/05/23 Javascript
浅谈js中的in-for循环
2016/06/28 Javascript
深入理解在JS中通过四种设置事件处理程序的方法
2017/03/02 Javascript
nodejs body-parser 解析post数据实例
2017/07/26 NodeJs
webpack+vue.js构建前端工程化的详细教程
2020/05/10 Javascript
Python实现图像几何变换
2015/07/06 Python
Python连接mysql数据库的正确姿势
2016/02/03 Python
Python Sqlite3以字典形式返回查询结果的实现方法
2016/10/03 Python
Python3使用PyQt5制作简单的画板/手写板实例
2017/10/19 Python
Python中如何使用if语句处理列表实例代码
2019/02/24 Python
pandas数据拼接的实现示例
2020/04/16 Python
Python3爬虫RedisDump的安装步骤
2021/02/20 Python
js实现移动端H5页面手指滑动刻度尺功能
2017/11/16 HTML / CSS
俄罗斯披萨、寿司和面食送货到家服务:2 Берега
2019/12/15 全球购物
C# .NET面试题
2015/11/28 面试题
毕业生物理教师求职信
2013/10/17 职场文书
机关门卫的岗位职责
2014/04/29 职场文书
个人剖析材料范文
2014/09/30 职场文书
2014年班务工作总结
2014/12/02 职场文书
横店影视城导游词
2015/02/06 职场文书
高中政治教师教学反思
2016/02/23 职场文书
餐厅营销的秘密:为什么老顾客会流水?
2019/08/08 职场文书
解析python中的jsonpath 提取器
2022/01/18 Python
使用MybatisPlus打印sql语句
2022/04/22 SQL Server
JS实现简单九宫格抽奖
2022/06/28 Javascript