thinkphp3.x中display方法及show方法的用法实例


Posted in PHP onMay 19, 2016

本文实例讲述了thinkphp3.x中display方法及show方法的用法。分享给大家供大家参考,具体如下:

通过前面的文章在了解了控制器和模型操作后,我们开始熟悉视图部分,ThinkPHP中的视图主要就是指模板文件和模板引擎,本篇首先了解下模板文件以及是如何进行渲染输出的。

一、模板定义

为了对模板文件更加有效的管理,ThinkPHP对模板文件进行目录划分,默认的模板文件定义规则是:

模板目录/[分组名/][模板主题/]模块名/操作名+模板后缀

模板目录默认是项目下面的Tpl, 当定义分组的情况下,会按照分组名分开子目录,新版模板主题默认是空(表示不启用模板主题功能),

模板主题功能是为了多模板切换而设计的,如果有多个模板主题的话,可以用DEFAULT_THEME参数设置默认的模板主题名。

在每个模板主题下面,是以项目的模块名为目录,然后是每个模块的具体操作模板文件,例如:

User模块的add操作 对应的模板文件就应该是:

Tpl/User/add.html

模板文件的默认后缀是.html,也可以通过TMPL_TEMPLATE_SUFFIX来配置成其他的。例如,我们可以配置:

'TMPL_TEMPLATE_SUFFIX'=>'.tpl'

定义后,User模块的add操作 对应的模板文件就变成是:

Tpl/User/add.tpl

如果项目启用了模块分组功能(假设User模块属于Home分组),那么默认对应的模板文件可能变成 :

Tpl/Home/User/add.html

分组模式下面,如果觉得目录结构太深,可以通过设置TMPL_FILE_DEPR参数来配置简化模板的目录层次,例如设置:

'TMPL_FILE_DEPR'=>'_'

默认的模板文件就变成了:

Tpl/Home/User_add.html

正是因为系统有这样一种模板文件自动识别的规则,所以给我们的模板渲染输出带来了简化。

二、模板渲染

模板定义后就可以通过display和show方法来渲染输出。其中display方法需要我们有定义模板文件,而show方法则是直接渲染内容输出。

最常用的是display方法,调用格式:

第一种:

display('[主题:][模块:][操作]'[,'字符编码'][,'输出类型'])

第二种:

display('完整的模板文件名'[,'字符编码'][,'输出类型'])

下面是一个最典型的用法,不带任何参数:

$this->display();

表示系统会按照默认规则自动定位模板文件,所以通常display方法无需带任何参数即可输出对应的模板,这是模板输出的最简单的用法。

如果没有按照模板定义规则来定义模板文件,或者我需要调用其他模块下面的某个模板,可以使用:

$this->display('edit');

表示调用当前模块下面的edit模板

$this->display('Member:read');

表示调用Member模块下面的read模板。

如果我们使用了模板主题功能,那么也可以支持跨主题调用,使用:

$this->display('theme:User:edit');

表示调用theme主题下面的User模块的edit模板。

这种方式的渲染输出不需要写模板文件的路径和后缀,确切地说,这里面的模块和操作并不一定需要有对应的模块或者操作,只是一个目录名称和文件名称而已,例如,你的项目里面可能根本没有Public模块,更没有Public模块的menu操作,但是一样可以使用

$this->display('Public:menu');

输出这个模板文件。理解了这个,模板输出就清晰了。

display方法支持在渲染输出的时候指定输出编码和类型,例如:

$this->display('read', 'utf-8', 'text/xml');

表示输出XML页面类型(配合你的应用需求可以输出很多类型)。

事情总有特例,如果模板目录是自定义的,或者根本不需要按模块进行分目录存放,那么默认的display渲染规则就不能处理,这个时候,我们就需要使用另外一种方式来应对,直接传入模板文件名即可,例如:

$this->display('./Public/menu.html');

这种方式需要指定模板路径和后缀,这里的Public目录是位于当前项目入口文件位置下面。如果是其他的后缀文件,也支持直接输出,例如:

$this->display('./Public/menu.tpl');

只要./Public/menu.tpl是一个实际存在的模板文件。

要注意模板文件位置是相对于项目的入口文件,而不是模板目录。

还有一种情况是,你需要获取渲染模板的输出内容,就可以使用fetch方法,fetch方法的用法和display基本一致,区别就在于fetch方法渲染后不是直接输出,而是返回渲染后的内容,例如:

$content = $this->fetch('Member:edit');

使用fetch方法获取渲染内容后,你可以进行过滤和替换等操作,用于对模板输出的复杂需求。

如果你没有定义任何模板文件,或者把模板内容存储到数据库中的话,你就需要使用show方法来渲染输出了,show方法的调用格式:

show('渲染内容'[,'字符编码'][,'输出类型'])

例如,

$this->show($content);

也可以指定编码和类型:

$this->show($content, 'utf-8', 'text/xml');

show方法中的内容也可以支持模板解析。

三、模板赋值

我们知道了如何渲染模板输出,但是如果要在模板中输出变量,必须在在控制器中把变量传递给模板,提供了assign方法对模板变量赋值,无论何种变量类型都统一使用assign赋值。

$this->assign('name',$value);
//下面的写法是等效的:
//$this->name = $value;

assign方法必须在display和show方法之前调用,并且系统只会输出设定的变量,其它变量不会输出(系统变量可以通过特殊的标签输出,可以无需赋值模板变量),一定程度上保证了变量的安全性。

赋值后,就可以在模板文件中输出变量了,如果使用的是内置模板的话,就可以这样输出:

{$name}

如果要同时输出多个模板变量,可以使用下面的方式:

$array['name'] = 'thinkphp'; 
$array['email'] = 'liu21st@gmail.com'; 
$array['phone'] = '12335678'; 
$this->assign($array);

这样,就可以在模板文件中同时输出name、email和phone三个变量。

模板变量的输出根据不同的模板引擎有不同的方法,我们在后面会专门讲解内置模板引擎的用法。如果你使用的是PHP本身作为模板引擎的话 ,就可以直接在模板文件里面输出了:

<?php echo $name.'['.$email.''.$phone.']';?>

如果采用内置的模板引擎,可以使用:

{$name} [ {$email} {$phone} ]

输出同样的内容。

关于更多的模板标签使用,我们会在后面模板标签中详细讲解。

四、模板替换

在进行模板输出之前,系统还可以对渲染的模板结果进行一些模板的特殊字符串替换操作,也就是实现了模板输出的替换和过滤。这个机制可以使得模板文件的定义更加方便,默认的替换规则有:

../Public: 会被替换成当前项目的公共模板目录 通常是 /项目目录/Tpl/当前主题/Public/

__TMPL__: 会替换成项目的模板目录 通常是 /项目目录/Tpl/当前主题/

(注:为了部署安全考虑,../Public和__TMPL__不再建议使用)

__PUBLIC__:会被替换成当前网站的公共目录 通常是 /Public/

__ROOT__: 会替换成当前网站的地址(不含域名)

__APP__: 会替换成当前项目的URL地址 (不含域名)

__GROUP__:会替换成当前分组的URL地址 (不含域名)

__URL__: 会替换成当前模块的URL地址(不含域名)

__ACTION__:会替换成当前操作的URL地址 (不含域名)

__SELF__: 会替换成当前的页面URL

注意这些特殊的字符串是严格区别大小写的,并且这些特殊字符串的替换规则是可以更改或者增加的,我们只需要在项目配置文件中配置TMPL_PARSE_STRING就可以完成。如果有相同的数组索引,就会更改系统的默认规则。例如:

'TMPL_PARSE_STRING' =>array( 
  '__PUBLIC__' => '/Common', // 更改默认的/Public 替换规则 
  '__JS__' => '/Public/JS/', // 增加新的JS类库路径替换规则 
  '/Uploads' => '/Uploads', // 增加新的上传路径替换规则 
)

有了模板替换规则后,页面上所有的__PUBLIC__ 字符串都会被替换,那如果确实需要输出__PUBLIC__ 字符串到模板呢,我们可以通过增加替换规则的方式,例如:

'TMPL_PARSE_STRING' =>array( 
  '--PUBLIC--' => '__PUBLIC__', // 采用新规则输出/Public字符串 
)

这样增加替换规则后,如果我们要输出__PUBLIC__ 字符串,只需要在模板中添加--PUBLIC--,其他替换字符串的输出方式类似。

五、总结

通过本篇的学习,我们大概掌握了如何定义模板文件和进行模板渲染输出,以及如何赋值模板变量,后面我们将会学习如何在模板文件中使用标签来简化你的书写。

PHP 相关文章推荐
自动跳转中英文页面
Oct 09 PHP
PHP 实例化类的一点摘记
Mar 23 PHP
IIS php环境配置PHP5 MySQL5 ZendOptimizer phpmyadmin安装与配置
Nov 18 PHP
php数组对百万数据进行排除重复数据的实现代码
Jun 08 PHP
php常用Output和ptions/Info函数集介绍
Jun 19 PHP
PHP命名空间(namespace)的动态访问及使用技巧
Aug 18 PHP
推荐几款用 Sublime Text 开发 Laravel 所用到的插件
Oct 30 PHP
PHP简单字符串过滤方法示例
Sep 04 PHP
php获取当前url地址的方法小结
Jan 10 PHP
php头像上传预览实例代码
May 02 PHP
thinkPHP框架动态配置用法实例分析
Jun 14 PHP
php变量与字符串的增删改查操作示例
May 07 PHP
thinkphp3.x连接mysql数据库的方法(具体操作步骤)
May 19 #PHP
thinkphp3.x自定义Action、Model及View的简单实现方法
May 19 #PHP
thinkPHP实现递归循环栏目并按照树形结构无限极输出的方法
May 19 #PHP
php处理json格式数据经典案例总结
May 19 #PHP
CI框架整合smarty步骤详解
May 19 #PHP
PHP QRCODE生成彩色二维码的方法
May 19 #PHP
PHP下载文件的函数实例代码
May 18 #PHP
You might like
PHP 5.0对象模型深度探索之类的静态成员
2008/03/27 PHP
php编写一个简单的路由类
2011/04/13 PHP
PHP中extract()函数的定义和用法
2012/08/17 PHP
PHP防盗链代码实例
2014/08/27 PHP
thinkphp的URL路由规则与配置实例
2014/11/26 PHP
使用xampp搭建运行php虚拟主机的详细步骤
2015/10/21 PHP
php简单截取字符串代码示例
2016/10/19 PHP
PHP5.6新增加的可变函数参数用法分析
2017/08/25 PHP
js程序中美元符号$是什么
2008/06/05 Javascript
各浏览器中querySelector和querySelectorAll的实现差异分析
2012/05/23 Javascript
Javascript学习笔记之 对象篇(四) : for in 循环
2014/06/24 Javascript
JavaScript类的写法
2016/09/17 Javascript
Vue.js一个文件对应一个组件实践
2016/10/27 Javascript
jQuery滑动到底部加载下一页数据的实例代码
2017/05/22 jQuery
jquery获取链接地址和跳转详解(推荐)
2017/08/15 jQuery
vue如何进行动画的封装
2018/09/26 Javascript
图文讲解vue的v-if使用方法
2019/02/11 Javascript
JS用最简单的方法实现四舍五入
2019/08/27 Javascript
JS在Array数组中按指定位置删除或添加元素对象方法示例
2019/11/19 Javascript
js生成1到100的随机数最简单的实现方法
2020/02/07 Javascript
收集的几个Python小技巧分享
2014/11/22 Python
讲解Python的Scrapy爬虫框架使用代理进行采集的方法
2016/02/18 Python
Python爬虫实现百度图片自动下载
2018/02/04 Python
Python实现的多叉树寻找最短路径算法示例
2018/07/30 Python
Python实现的IP端口扫描工具类示例
2019/02/15 Python
python实现回旋矩阵方式(旋转矩阵)
2019/12/04 Python
django框架ModelForm组件用法详解
2019/12/11 Python
Marks & Spencer爱尔兰:英国马莎百货
2016/04/20 全球购物
办公自动化毕业生求职信
2014/03/09 职场文书
环境工程专业自荐信范文
2014/03/18 职场文书
中班幼儿评语大全
2014/04/30 职场文书
食品工程专业求职信
2014/06/15 职场文书
运动会广播稿200米(5篇)
2014/10/15 职场文书
大学生违纪检讨书300字
2014/10/25 职场文书
2019大学生暑期实习心得总结
2019/08/21 职场文书
Go语言实现Base64、Base58编码与解码
2021/07/26 Golang