三、标签使用
变量输出
格式:{$varname|function1|function2=arg1,arg2,### }
使用例子:
{$webTitle|md5| strtoupper | substr=0,3}
{$number|number_format=2}
在模板文件中可以使用{$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文件最终被解析成一个缓存模板文件。而且,包含文件可以设置为变量,通过下面方式定义:
{includeinclude } 其中$include为一个模板变量。
XML标签
基本上,XML标签技术包含了普通模板有的功能,并且有了一些方面的增强和补充,更重要的一点是新的标签库技术更加具有扩展性。ThinkTemplate模板引擎内置了两个标签库实现:CX和Html。
要在模板页面中使用TagLib标签库功能,需要在开始时候使用taglib 标签导入需要使用的标签,防止以后标签库大量扩展后增加解析工作量,用法如下:
<tagLib name='cx,html' />
引入标签库后,就可以使用标签库定义的标签来定义模板了,例如:
//可以使用下面的模板标签定义。
<cx:vo name='user' property='name' />
<cx:volist id='user' name='userList' >
<cx:vo name='user' property='name' />
</cx:volist>
<html:select options='name' selected='value' />
标签库使用的时候忽略大小写,因此下面的方式一样有效:
<CX:VO NAME='user' property='name' />
实际上,ThinkPHP框架模板引擎会默认加载CX标签库,所以下面的方式效果相同:
<tagLib name='html' />
并且,默认加载的CX库可以不使用CX命名空间前缀,也就是说,
<vo name='user' property='name' /> 等效于 <cx:vo name='user' property='name' />
对于多重循环的定义也非常方便:
<volist name=”list” id=”vo”>
<sublist name=”vo.sub” id=”sub”>
{$sub.name}
</sublist>
</volist>
混合标签结合使用例子:
<volist id=”user” name=”userList”>
{$user.name}
{$use.age}
{$user.email}
</volist>
对于不太复杂的变量输出,建议多采用{$var} 方式,因为单纯从易用性方面而言,这种方式最简洁,而且功能也比较完善。
标签库标签定义
CX标签库
CX标签库主要用于输出ThinkPHP框架的变量、包含文件和实现一定控制判断。主要有:
include包含文件支持的标签属性有 file;
comment模板注释无标签属性;
iterate迭代因子输出,循环内可以结合 write 标签,支持的标签属性有 id | name | offset | length | empty;
write复杂变量输出,包括数组、对象,有函数支持,支持的标签属性有 name | property | key | format | function;
volist数据对象列表输出,循环内可以结合 vo 标签,支持的标签属性有 id | name | offset | length | empty;
vo数据对象输出,支持的标签属性有 name | property | format | function;
var变量输出,用于普通变量,支持的标签属性有 name | format | function;
equal判断是否相同,支持的标签属性有 name | property | key | value | function;
notequal判断是否不同;
present判断是否定义支持的标签属性有 name | property | key;
notpresent判断是否没有定义;
Html标签库
Html标签库主要用于实现一些Html标记的动态生成和变量封装,主要有:
select动态生成select列表;
checkbox动态生成checkbox;
radio动态生成radio;
link动态加载js或者css文件;
imageLink带有链接的图片;
imageBtn图片按钮;
mulitSelect多选组件;
list DataGrid组件;
四、总结
作为一个模板引擎的设计,本文只是做一个概要的原理描述和简单的使用,其中还有很多细节方面,例如优化解析效率、包含机制、安全考虑、特殊变量解析、异常处理等。更多关于ThinkTemplate的内容和标签用法可以参考ThinkPHP的在线手册中的相关部分(
http://thinkphp.cn ) 。
浏览更多精彩文章请点击下载《PHPer》
http://www.phpchina.com/phper/