ThinkPHP内置了一个性能卓越的
模板引擎,是一个使用了
XML标签库
技术的编译型模板引擎,支持两种类型的模板标签,使用了动态编译和缓存技术,而且支持自
定义标签库,利用该模板引擎可以方便地定义模板
文件,从而达到快速
开发的目的。
ThinkPHP内置模板引擎的的模板标签有两种类型:第一种是普通标签,类似于
Smarty的模板标签,在功能方面作了部分简化,增强了显示功能,弱化了逻辑控制功能;第二种是XML标签库形式,该模板技术是新版(0.8版本以上才支持)新增的标签技术,有效地借鉴了Java的标签库技术,在控制功能和各方面都比较强大,而且允许自定义标签库,是新版ThinkPHP系统引入和推荐的模板标签技术。两种标签方式的结合使用,可以让您的模板定义功能相当强大。
ThinkPHP架构的设计中模板和程序完全分离,一套模板文件就是一个目录,模板是标准
html文件(可以配置成其它后缀,如.shtml,.xml等),可以单独预览。
总体上来说,ThinkPHP的模板引擎以使用方便为第一考虑,因为谈到执行效率没有模板效率更高,因此,过多地增强模板引擎的功能并无益处(即使是编译型模板引擎),适可而止最好。
模板引擎的最重要的功能莫过于输出,如果加入过多的控制、甚至逻辑在里面恐怕不是明智之举,但是给模板引擎预留好接口,保证一定程度的扩展性才能满足以后不断增长的需求。本着这样的一个原则,我设计了ThinkPHP的模板引擎,希望不要有人抱怨ThinkPHP的模板引擎控制功能不够强大。
由于使用了模板动态缓存技术,在您第一次运行某个模块的某个操作时候,对应的模板文件就会被缓存,下次读取的时候,无论是模板文件修改或者是缓存文件被删除,
系统都会重新生成缓存文件。你可以设置模板缓存的有效时间间隔,如每隔10分钟重新读取模板文件。模板动态缓存只是让您免去每次重复编译模板的时间。
我们会分别讲述普通模版和XML模版的标签使用。
一、普通标签
ThinkPHP系统的普通模板标签以{ 和 } 作为开始和结束标识(支持在
项目配置文件中修改),并且在开始标记紧跟标签的定义,如果之间有空格或者换行则被视为非模板标签直接输出。
模板变量输出
ThinkPHP对模板变量的支持相当充分,除了可以输出正常变量外,还可以输出特殊变量和对输出变量使用函数定义(并支持多个函数)。
模板变量的标签格式为
格式:
{$varname|function1|function2=arg1,arg2,### }
说明:
{ 和 $ 符号之间不能有空格 ,后面参数的空格就没有问题
###表示模板变量本身的参数位置
支持多个函数,函数之间支持空格
支持函数屏蔽功能,在配置文件中可以配置禁止使用的函数列表
支持自定义函数,以后打算封装一些常用格式函数
支持变量解析缓存功能,重复变量字串不多次解析。
使用例子:
- {$webTitle|md5| strtoupper | substr=0,3 }
- {
$number|number_format=2 }
如果在应用Action中需要输出某个变量,使用下面的方法:
- $tpl = new Template();$tpl->assign('name','value');
系统只会输出设定的变量,其它变量不会输出,一定程度上保证了变量的安全性。
可以使用{$var['key'] }来输出数组变量,并且同样支持函数,如
- $info = array('name'=>'流年','company'=>'世纪流年');$tpl->assign('info',$info);
在模板文件中可以使用{$info['name'] }来输出数组变量。
同样,可以使用{$var.key }来输出对象属性变量,并且也支持函数。
除了常规变量的输出外,模板引擎还支持系统变量和系统常量、以及系统特殊变量的输出。它们的输出不需要作变量设定。
系统变量(依然支持函数使用和大小写、空格),以Think.打头,如
- {$Think.server.script_name } //输出$_SERVER变量{$Think.session.session_id|md5 } //输出$_SESSION变量{$Think.get.pageNumber } //输出$_GET变量{$Think.cookie.name } //输出$_COOKIE变量
系统常量
- {$Think.const.__FILE__ }
- {
$Think.const.MODULE_NAME }//或者直接使用{$Think.__FILE__ }- {
$Think.MODULE_NAME }
特殊变量 ,由ThinkPHP系统定义的常量
- {$Think.version } //版本{$Think.now } //现在时间{$Think.template|basename } //模板页面{$Think.LDELIM } //模板标签起始符号{$Think.RDELIM } //模板标签结束符号
模板注释
模板支持注释功能,该注释文字在最终页面不会显示,仅供模板制作人员参考和识别。
格式:
{/* 注释内容 */ } 或 {// 注释内容 }
说明:在显示页面的时候不会显示模板注释,仅供模板制作的时候参考。
注意{ 和注释标记之间不能有空格。
公共模板
当页面需要包含公共文件的时候,可以通过下面的模板标签
格式:
{include:Filename }
说明:Filename表示公共文件的名称(不包含后缀,因为模板文件后缀为可配置),Filename默认在当前目录下寻找,但是完全支持相对路径访问,例如,下面的格式都是正确的。{include:header } 和 {include:../public/header }。该标签可以出现在模板页面的任何位置,也就是说可以包含除了头部文件和尾部文件之外的一些公共文件,就看网站页面的设计了。建议的方式是首先让美工写在一个页面文件中,然后调试完毕后在分成多个文件来引用,因为一旦使用引用标签后,模板页面就不能直接浏览到实际的效果了。加载公共模板文件后,模板引擎会重新对该页面中的模板标签进行解析,有意思的是你还可以在公共模板中再次包含公共文件,但是一定要注意不能循环包含。例如,
在header.html文件中包含了menu文件
{include:menu }
在index.html文件中则包含了header和footer
{include:header }
这里是首页的内容
{include:footer }
在访问index操作方法的时候,模板首先读取index文件,并开始解析include:header,在解析header文件的过程中又遇到include:menu标签,又开始解析,解析完成后再解析include:footer标签,在经过几层的嵌套包含解析后index文件最终被解析成一个缓存模板文件。
而且,包含文件可以设置为变量,通过下面方式定义
{include

include } 其中$include为一个模板变量
VO标签
Vo对象是ThinkPHP框架中输出最多的对象,所以,专门定义了VO标签用于输出Vo对象。
格式:
{Vo: VoName| key | function }
说明:在页面中输出名称为VoName的Vo对象的属性key的值。
可以在模板中定义下面的标签来输出
- {vo:user|name }
- {
vo:user|email }- {
vo:user|joinTime|toDate='Y-m-d' }
其实,以上写法和下面的方法相同
- {$user.name }
- {
$user.email }- {
$user.joinTime|toDate='Y-m-d' }
VoList标签
格式:
{VoList: VoListName| Content }
说明:在页面中输出名称为VoName的VoList对象
其中Content中可以直接输出Vo的属性名称,方法是使用Vo属性名称作为变量,VoList中的变量不用再添加标签开始和结束标记。
如下面的例子:
- {voList : user | $username<br> };
在普通标签定义方式下,VoList标签的功能显得比较弱,而且在控制功能方面比较缺乏,下一篇会讲解模板的标签库定义方式。由于使用了XML定义方式,除了可以实现普通标签的所有功能外,还增强了不少模板功能,包括在控制功能方面的改进。