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 相关文章推荐
基于PHP常用函数的用法详解
May 10 PHP
php中session退出登陆问题
Feb 27 PHP
免费的ip数据库淘宝IP地址库简介和PHP调用实例
Apr 08 PHP
PHPThumb图片处理实例
May 03 PHP
php获取汉字拼音首字母的方法
Oct 21 PHP
Yii实现单用户博客系统文章详情页插入评论表单的方法
Dec 28 PHP
详解PHP归并排序的实现
Oct 18 PHP
PHP 芝麻信用接入的注意事项
Dec 01 PHP
phpinfo无法显示的原因及解决办法
Feb 15 PHP
Laravel实现ORM带条件搜索分页
Oct 24 PHP
PHP设计模式入门之状态模式原理与实现方法分析
Apr 26 PHP
php去除数组中为0的元素的实例分析
Nov 17 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分页函数
2006/07/08 PHP
社区(php&amp;&amp;mysql)四
2006/10/09 PHP
PHP has encountered an Access Violation 错误的解决方法
2010/01/17 PHP
支持数组的ADDSLASHES的php函数
2010/02/16 PHP
PHP中的strtr函数使用介绍(str_replace)
2011/10/20 PHP
PHP自动生成表单代码分享
2015/06/19 PHP
jQuery 打造动态渐变按钮 详细图文教程
2010/04/25 Javascript
JavaScript实现简单的时钟实例代码
2013/11/23 Javascript
使用时间戳解决ie缓存的问题
2014/08/20 Javascript
10条建议帮助你创建更好的jQuery插件
2015/05/18 Javascript
js+html5操作sqlite数据库的方法
2016/02/02 Javascript
prototype.js常用函数详解
2016/06/18 Javascript
js倒计时简单实现代码
2016/08/11 Javascript
JavaScript实现输入框与清空按钮联动效果
2016/09/09 Javascript
JavaScript高仿支付宝倒计时页面及代码实现
2016/10/21 Javascript
基于jQuery实现数字滚动效果
2017/01/16 Javascript
ES6下React组件的写法示例代码
2017/05/04 Javascript
vue组件挂载到全局方法的示例代码
2018/08/02 Javascript
原生JS实现简单的无缝自动轮播效果
2018/09/26 Javascript
vue src动态加载请求获取图片的方法
2018/10/17 Javascript
Next.js实现react服务器端渲染的方法示例
2019/01/06 Javascript
Javascript之高级数组API的使用实例
2019/03/08 Javascript
vue component 中引入less文件报错 Module build failed
2019/04/17 Javascript
js实现的格式化数字和金额功能简单示例
2019/07/30 Javascript
JavaScript碰撞检测原理及其实现代码
2020/03/12 Javascript
简单介绍Python中的readline()方法的使用
2015/05/24 Python
python sorted函数的小练习及解答
2019/09/18 Python
python 实现围棋游戏(纯tkinter gui)
2020/11/13 Python
css3.0 图形构成实例练习二
2013/03/19 HTML / CSS
CSS3的column-fill属性对齐列内容高度的用法详解
2016/07/01 HTML / CSS
英国奢侈品在线精品店:Hervia
2020/09/03 全球购物
新西兰最大的连锁超市:Countdown
2020/06/04 全球购物
大学生四年生活自我鉴定
2013/11/21 职场文书
喝酒驾驶检讨书
2014/10/01 职场文书
爱护环境卫生倡议书
2015/04/29 职场文书
幼儿园班级管理心得体会
2016/01/07 职场文书