欢迎各位兄弟 发布技术文章

这里的技术是共享的

You are here

ThinkPHP3.1快速入门(8)视图

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

模板定义

为了对模板文件更加有效的管理,ThinkPHP对模板文件进行目录划分,默认的模板文件定义规则是:
模板目录/[分组名/][模板主题/]模块名/操作名+模板后缀
模板目录默认是项目下面的Tpl, 当定义分组的情况下,会按照分组名分开子目录,新版模板主题默认是空(表示不启用模板主题功能),模板主题功能是为了多模板切换而设计的,如果有多个模板主题的话,可以用DEFAULT_THEME参数设置默认的模板主题名。
在每个模板主题下面,是以项目的模块名为目录,然后是每个模块的具体操作模板文件,例如:
User模块的add操作 对应的模板文件就应该是:
  1. Tpl/User/add.html 
复制代码
 
模板文件的默认后缀的情况是.html,也可以通过TMPL_TEMPLATE_SUFFIX来配置成其他的。例如,我们可以配置:
  1. 'TMPL_TEMPLATE_SUFFIX'=>'.tpl'
复制代码
 
定义后,User模块的add操作 对应的模板文件就变成是:
  1. Tpl/User/add.tpl 
复制代码
 
如果项目启用了模块分组功能(假设User模块属于Home分组),那么默认对应的模板文件可能变成 :
  1. Tpl/Home/User/add.html 
复制代码
 
分组模式下面,如果觉得目录结构太深,可以通过设置TMPL_FILE_DEPR参数来配置简化模板的目录层次,例如设置:
  1. 'TMPL_FILE_DEPR'=>'_'
复制代码
 
默认的模板文件就变成了:
  1. Tpl/Home/User_add.html
复制代码
 
正是因为系统有这样一种模板文件自动识别的规则,所以给我们的模板渲染输出带来了简化。[-more-]

模板渲染

模板定义后就可以通过display和show方法来渲染输出。其中display方法需要我们有定义模板文件,而show方法则是直接渲染内容输出。
最常用的是display方法,调用格式:
第一种: display('[主题:][模块:][操作]'[,'字符编码'][,'输出类型'])
第二种: display('完整的模板文件名'[,'字符编码'][,'输出类型'])

下面是一个最典型的用法,不带任何参数:
  1. $this->display();
复制代码
 
表示系统会按照默认规则自动定位模板文件,所以通常display方法无需带任何参数即可输出对应的模板,这是模板输出的最简单的用法。
如果没有按照模板定义规则来定义模板文件,或者我需要调用其他模块下面的某个模板,可以使用:
  1. $this->display('edit'); 
复制代码
 
表示调用当前模块下面的edit模板
  1. $this->display('Member:read'); 
复制代码
 
表示调用Member模块下面的read模板。
如果我们使用了模板主题功能,那么也可以支持跨主题调用,使用:
  1. $this->display('theme:User:edit'); 
复制代码
 
表示调用theme主题下面的User模块的edit模板。
这种方式的渲染输出不需要写模板文件的路径和后缀,确切地说,这里面的模块和操作并不一定需要有对应的模块或者操作,只是一个目录名称和文件名称而已,例如,你的项目里面可能根本没有Public模块,更没有Public模块的menu操作,但是一样可以使用
  1. $this->display('Public:menu'); 
复制代码
 
输出这个模板文件。理解了这个,模板输出就清晰了。
display方法支持在渲染输出的时候指定输出编码和类型,例如:
也可以指定编码和类型:
  1. $this->display('read', 'utf-8', 'text/xml'); 
复制代码
 
表示输出XML页面类型(配合你的应用需求可以输出很多类型)。

事情总有特例,如果的模板目录是自定义的,或者根本不需要按模块进行分目录存放,那么默认的display渲染规则就不能处理,这个时候,我们就需要使用另外一种方式来应对,直接传入模板文件名即可,例如:
  1. $this->display('./Public/menu.html');
复制代码
 
这种方式需要指定模板路径和后缀,这里的Public目录是位于当前项目入口文件位置下面。如果是其他的后缀文件,也支持直接输出,例如:
  1. $this->display('./Public/menu.tpl');
复制代码
 
只要./Public/menu.tpl是一个实际存在的模板文件。
要注意模板文件位置是相对于项目的入口文件,而不是模板目录。
还有一种情况是,你需要获取渲染模板的输出内容,就可以使用fetch方法,fetch方法的用法和display基本一致,区别就在于fetch方法渲染后不是直接输出,而是返回渲染后的内容,例如:
  1. $content = $this->fetch('Member:edit');
复制代码
 
使用fetch方法获取渲染内容后,你可以进行过滤和替换等操作,用于对模板输出的复杂需求。


如果你没有定义任何模板文件,或者把模板内容存储到数据库中的话,你就需要使用show方法来渲染输出了,show方法的调用格式:
show('渲染内容'[,'字符编码'][,'输出类型'])
例如,
  1. $this->show($content);
复制代码
 
也可以指定编码和类型:
  1. $this->show($content, 'utf-8', 'text/xml'); 
复制代码
 
show方法中的内容也可以支持模板解析。

模板赋值

我们知道了如何渲染模板输出,但是如果要在模板中输出变量,必须在在控制器中把变量传递给模板,提供了assign方法对模板变量赋值,无论何种变量类型都统一使用assign赋值。
  1. $this->assign('name',$value);
  2.  // 下面的写法是等效的
  3. $this->name = $value;
复制代码
 
assign方法必须在display和show方法之前调用,并且系统只会输出设定的变量,其它变量不会输出(系统变量可以通过特殊的标签输出,可以无需赋值模板变量),一定程度上保证了变量的安全性。
赋值后,就可以在模板文件中输出变量了,如果使用的是内置模板的话,就可以这样输出:
  1. {$name}
复制代码
 
如果要同时输出多个模板变量,可以使用下面的方式:
  1. $array['name']    =    'thinkphp';
  2. $array['email']    =    'liu21st@gmail.com';
  3. $array['phone']    =    '12335678';
  4. $this->assign($array);
复制代码
 
这样,就可以在模板文件中同时输出name、email和phone三个变量。
模板变量的输出根据不同的模板引擎有不同的方法,我们在后面会专门讲解内置模板引擎的用法。如果你使用的是PHP本身作为模板引擎的话 ,就可以直接在模板文件里面输出了:
  1. <?php echo $name.'['.$email.''.$phone.']';
复制代码
 
如果采用内置的模板引擎,可以使用:
  1. {$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就可以完成。如果有相同的数组索引,就会更改系统的默认规则。例如:
  1. 'TMPL_PARSE_STRING'  =>array(
  2.      '!-PUBLIC-!' => '/Common', // 更改默认的!-PUBLIC-! 替换规则
  3.      '__JS__' => '/Public/JS/', // 增加新的JS类库路径替换规则
  4.      '__UPLOAD__' => '/Uploads', // 增加新的上传路径替换规则
  5.  )
复制代码
 
有了模板替换规则后,页面上所有的!-PUBLIC-! 字符串都会被替换,那如果确实需要输出!-PUBLIC-! 字符串到模板呢,我们可以通过增加替换规则的方式,例如:
  1. 'TMPL_PARSE_STRING'  =>array(
  2.      '--PUBLIC--' => '!-PUBLIC-!', // 采用新规则输出!-PUBLIC-!字符串
  3.  )
复制代码
 
这样增加替换规则后,如果我们要输出!-PUBLIC-! 字符串,只需要在模板中添加--PUBLIC--,其他替换字符串的输出方式类似。

总结

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

来自 
http://www.thinkphp.cn/info/147.html

peizhouyu02月18日
不错,加油!
sk8112904月11日
唉本人php基础不牢,感觉学框架好难啊。
回复lenvip08月15日
有感
回复lenvip08月15日
哪里有视频 可看呢?
折戟沉沙2015年02月06日
asdas
bilzat2015年02月03日
很好的教程!!!
天道酬勤6512014年08月27日
感觉很不错哦!
friendwrite2014年08月21日
慢慢学,加油
changup2014年08月21日
连着好几个主题都没有动手了,tp还是挺好的一个框架;
hyb200420042014年08月12日
模板可不可以是用word文档,就是.doc格式
绝世尘封2014年08月06日
头疼啊。。。。。不过还是要学 加油
shl10043177312014年06月30日
我只是一个路人,走了就忘记了 需要示例
utanbo2014年04月16日
mark
javcof2014年03月03日
ThinkPHP3.1快速入门(8)视图 Pass
潇潇雨2013年12月30日
完整的项目
Xmaster2013年12月20日
2min看完了,5min之后忘完了。不知道怎么做实验去加深记忆
回复javcof2014年03月03日
动手code,这样绝对映像深刻。
回复javcof2014年03月03日
动手code,这样绝对映像深刻。
回复javcof2014年03月03日
动手code,这样绝对映像深刻。
lini4942013年12月18日
不错。
尹落壹2013年12月07日
看不懂。。。
xieguoen2013年11月22日
也希望能改善下教程,没有例子虽然能看懂,但却不够理解,然后记不住
tp849137402013年09月09日
学习了
tingyuxuan2013年08月25日
!-Public-!: 会被替换成当前项目的公共模板目录 通常是 /项目目录/Tpl/当前主题/Public/
!-TMPL-!: 会替换成项目的模板目录 通常是 /项目目录/Tpl/当前主题/
(注:为了部署安全考虑,!-Public-!和!-TMPL-!不再建议使用)
!-PUBLIC-!:会被替换成当前网站的公共目录 通常是 /Public/
!-ROOT-!: 会替换成当前网站的地址(不含域名)
!-APP-!: 会替换成当前项目的URL地址 (不含域名)
!-GROUP-!:会替换成当前分组的URL地址 (不含域名)
!-URL-!: 会替换成当前模块的URL地址(不含域名)
!-ACTION-!:会替换成当前操作的URL地址 (不含域名)
!-SELF-!: 会替换成当前的页面URL
----------------------------------------------------------------------------------
经验证这些都是错误的:模板中无法替换这些。修改成这样的方可正确
----------------------------------------------------------------------------------
__PUBLIC__:会被替换成当前网站的公共目录 通常是 /Public/
__ROOT__: 会替换成当前网站的地址(不含域名)
__APP__: 会替换成当前项目的URL地址 (不含域名)
__GROUP__:会替换成当前分组的URL地址 (不含域名)
__URL__: 会替换成当前模块的URL地址(不含域名)
__ACTION__:会替换成当前操作的URL地址 (不含域名)
__SELF__: 会替换成当前的页面URL
回复xieguoen2013年09月04日
you are right
回复yemao2013年10月17日
擦,还真是。
回复xieguoen2013年11月22日
回复 yemao :
回复6098101642013年12月07日
谢谢你的提醒
回复lairdutemps2014年04月24日
恩,我一看还以为我out了, 一直是用__的!
回复xieguoen2013年09月04日
you are right
回复yemao2013年10月17日
擦,还真是。
回复xieguoen2013年11月22日
回复 yemao :
回复6098101642013年12月07日
谢谢你的提醒
回复lairdutemps2014年04月24日
恩,我一看还以为我out了, 一直是用__的!
回复xieguoen2013年09月04日
you are right
回复yemao2013年10月17日
擦,还真是。
回复xieguoen2013年11月22日
回复 yemao :
回复6098101642013年12月07日
谢谢你的提醒
回复lairdutemps2014年04月24日
恩,我一看还以为我out了, 一直是用__的!
albertluo2013年08月07日
敢自称是官方教程,不是一般人
utanbo2014年04月16日
mark
javcof2014年03月03日
ThinkPHP3.1快速入门(8)视图 Pass
潇潇雨2013年12月30日
完整的项目
Xmaster2013年12月20日
2min看完了,5min之后忘完了。不知道怎么做实验去加深记忆
lini4942013年12月18日
不错。
尹落壹2013年12月07日
看不懂。。。
xieguoen2013年11月22日
也希望能改善下教程,没有例子虽然能看懂,但却不够理解,然后记不住
tp849137402013年09月09日
学习了
tingyuxuan2013年08月25日
!-Public-!: 会被替换成当前项目的公共模板目录 通常是 /项目目录/Tpl/当前主题/Public/
!-TMPL-!: 会替换成项目的模板目录 通常是 /项目目录/Tpl/当前主题/
(注:为了部署安全考虑,!-Public-!和!-TMPL-!不再建议使用)
!-PUBLIC-!:会被替换成当前网站的公共目录 通常是 /Public/
!-ROOT-!: 会替换成当前网站的地址(不含域名)
!-APP-!: 会替换成当前项目的URL地址 (不含域名)
!-GROUP-!:会替换成当前分组的URL地址 (不含域名)
!-URL-!: 会替换成当前模块的URL地址(不含域名)
!-ACTION-!:会替换成当前操作的URL地址 (不含域名)
!-SELF-!: 会替换成当前的页面URL
----------------------------------------------------------------------------------
经验证这些都是错误的:模板中无法替换这些。修改成这样的方可正确
----------------------------------------------------------------------------------
__PUBLIC__:会被替换成当前网站的公共目录 通常是 /Public/
__ROOT__: 会替换成当前网站的地址(不含域名)
__APP__: 会替换成当前项目的URL地址 (不含域名)
__GROUP__:会替换成当前分组的URL地址 (不含域名)
__URL__: 会替换成当前模块的URL地址(不含域名)
__ACTION__:会替换成当前操作的URL地址 (不含域名)
__SELF__: 会替换成当前的页面URL
albertluo2013年08月07日
敢自称是官方教程,不是一般人
utanbo2014年04月16日
mark
javcof2014年03月03日
ThinkPHP3.1快速入门(8)视图 Pass
潇潇雨2013年12月30日
完整的项目
Xmaster2013年12月20日
2min看完了,5min之后忘完了。不知道怎么做实验去加深记忆
lini4942013年12月18日
不错。
尹落壹2013年12月07日
看不懂。。。
xieguoen2013年11月22日
也希望能改善下教程,没有例子虽然能看懂,但却不够理解,然后记不住
tp849137402013年09月09日
学习了
tingyuxuan2013年08月25日
!-Public-!: 会被替换成当前项目的公共模板目录 通常是 /项目目录/Tpl/当前主题/Public/
!-TMPL-!: 会替换成项目的模板目录 通常是 /项目目录/Tpl/当前主题/
(注:为了部署安全考虑,!-Public-!和!-TMPL-!不再建议使用)
!-PUBLIC-!:会被替换成当前网站的公共目录 通常是 /Public/
!-ROOT-!: 会替换成当前网站的地址(不含域名)
!-APP-!: 会替换成当前项目的URL地址 (不含域名)
!-GROUP-!:会替换成当前分组的URL地址 (不含域名)
!-URL-!: 会替换成当前模块的URL地址(不含域名)
!-ACTION-!:会替换成当前操作的URL地址 (不含域名)
!-SELF-!: 会替换成当前的页面URL
----------------------------------------------------------------------------------
经验证这些都是错误的:模板中无法替换这些。修改成这样的方可正确
----------------------------------------------------------------------------------
__PUBLIC__:会被替换成当前网站的公共目录 通常是 /Public/
__ROOT__: 会替换成当前网站的地址(不含域名)
__APP__: 会替换成当前项目的URL地址 (不含域名)
__GROUP__:会替换成当前分组的URL地址 (不含域名)
__URL__: 会替换成当前模块的URL地址(不含域名)
__ACTION__:会替换成当前操作的URL地址 (不含域名)
__SELF__: 会替换成当前的页面URL
albertluo2013年08月07日
敢自称是官方教程,不是一般人

普通分类: