模板指南
ThinkPHP内置了一个基于XML的性能卓越的模板引擎 ThinkTemplate,这是一个专门为ThinkPHP服务的内置模板引擎。ThinkTemplate是一个使用了XML标签库技术的编译型模板引擎,支持两种类型的模板标签,使用了动态编译和缓存技术,而且支持自定义标签库。其特点包括:
²  支持XML标签库和普通标签的混合定义;
²  支持直接使用PHP代码书写;
²  支持文件包含和布局模板;
²  支持多级标签嵌套;
²  一次编译多次运行,编译和运行效率非常高;
²  模板文件更新,自动更新模板缓存;
²  系统变量无需赋值直接输出;
²  支持多维数组的快速输出;
²  支持模板变量的默认值;
²  支持页面代码去除Html空白;
²  支持变量组合调节器和格式化功能;
²  允许定义模板禁用函数;
²  通过标签库方式扩展。
每个模板文件在执行过程中都会生成一个编译后的缓存文件,其实就是一个可以运行的PHP文件。模板缓存默认位于项目的Runtime/Cache目录下面,以模板文件的md5编码作为缓存文件名保存的,如果开启页面Trace功能的话,可以在Trace信息里面看到当前页面对应的模板缓存文件名。如果在模板标签的使用过程中发现问题,可以尝试通过查看模板缓存文件到问题所在。
内置的模板引擎支持普通标签和XML标签方式两种标签定义,分别用于不同的目的:普通标签主要用于输出变量和做一些基本的操作;XML标签除了包含了普通标签的所有功能外,还可以完成一些逻辑判断、控制和循环输出,但是在变量输出上,普通标签具有简洁明了的优势。
例如:{$name} 看起来比 <var name=”name” /> 更加容易使用,但是在控制和判断方面,XML标签却有着普通标签无法替代的作用。
这种方式的结合保证了模板引擎的简洁和强大的有效融合。
变量输出
我们已经知道了在Action中使用assign方法可以给模板变量赋值,赋值后怎么在模板文件中输出变量的值呢?
如果我们在Action中赋值了一个name模板变量:
$name = 'ThinkPHP';
$this->assign('name',$name);
使用内置的模板引擎输出变量,只需要在模版文件使用:
{$name}
模板编译后的结果就是
<?php echo($name);?>
最后运行的时候就可以在标签位置显示ThinkPHP的输出结果。
注意模板标签的{和$之间不能有任何的空格,否则标签无效。
普通标签默认开始标记是 {,结束标记是 }。也可以通过设置TMPL_L_DELIM和TMPL_R_DELIM进行更改。例如,我们在项目配置文件中定义:
'TMPL_L_DELIM'=>'<{',
'TMPL_R_DELIM'=>'}>',
那么,上面的变量输出标签就应该改成:
<{$name}>
后面的内容我们都以默认的标签定义
来说明。
assign方法里面的第一个参数才是模板文件中使用的变量名称。如果改成下面的代码:
$name = 'ThinkPHP';
$this->assign('name2',$name);
再使用{$name} 输出就无效了,必须使用 {$name2} 才能输出模板变量的值了。
如果我们需要把一个用户数据对象赋值给模板变量:
$User = M('name');
$user = $User->find(1);
$this->assign('user',$user);
也就是说$user其实是一个数组变量,我们可以使用下面的方式来输出相关的值:
{$user['name']} // 输出用户的名称
{$user['email']} // 输出用户的email地址
如果$user是一个对象而不是数组的话,
$User = M('name');
$User->find(1);
$this->assign('user',$User);
可以使用下面的方式输出相关的属性值:
{$user:name} // 输出用户的名称
{$user:email}  // 输出用户的email地址
为了方便模板定义,还可以支持点语法,例如,上面的
{$user['name']} // 输出用户的名称
{$user['email']} // 输出用户的email地址
可以改成
{$user.name}
{$ail}
因为点语法默认的输出是数组方式,所以上面两种方式是在没有配置的情况下是等效的。我们可以通过配置TMPL_VAR_IDENTIFY参数来决定点语法的输出效果,以下面的输出为例:
{$user.name}
如果TMPL_VAR_IDENTIFY设置为array,那么
{$user.name}和{$user['name']}等效,也就是输出数组变量。
如果TMPL_VAR_IDENTIFY设置为obj,那么
{$user.name}和{$user:name}等效,也就是输出对象的属性。
如果TMPL_VAR_IDENTIFY留空的话,系统会自动判断要输出的变量是数组还是对象,这种方式会一定程度上影响效率,而且只支持二维数组和两级对象属性。
如果是多维数组或者多层对象属性的输出,可以使用下面的定义方式:
{$user.sub.name}  // 使用点语法输出
或者使用
{$user['sub']['name']} // 输出三维数组的值
{$user:sub:name} // 输出对象的多级属性
使用函数
仅仅是输出变量并不能满足模板输出的需要,内置模板引擎支持对模板变量使用调节器和格式化功能,其实也就是提供函数支持,并支持多个函数同时使用。用于模板标签的函数可以是PHP内置函数或者是用户自定义函数,和smarty不同,用于模板的函数不需要特别的定义。
模板变量的函数调用格式为:
{$varname|function1|function2=arg1,arg2,### }
说明:
{ 和 $ 符号之间不能有空格 ,后面参数的空格就没有问题
###表示模板变量本身的参数位置
支持多个函数,函数之间支持空格
支持函数屏蔽功能,在配置文件中可以配置禁止使用的函数列表
支持变量缓存功能,重复变量字串不多次解析
使用例子:
{$webTitle|md5|strtoupper|substr=0,3}
编译后的PHP代码
就是:
<?php echo (substr(strtoupper(md5($webTitle)),0,3)); ?>
注意函数的定义和使用顺序的对应关系,通常来说函数的第一个参数就是前面的变量或者前一个函数使用的结果,如果你的变量并不是函数的第一个参数,需要使用定位符号,例如:
{$create_time|date="y-m-d",###}
编译后的PHP是:
<?php echo (date("y-m-d",$create_time)); ?>
函数的使用没有个数限制,但是可以允许配置TMPL_DENY_FUNC_LIST定义禁用函数列表,系统默认禁用了exit和echo函数,以防止破坏模板输出,我们也可以增加额外的定义,例如:
TMPL_DENY_FUNC_LIST=>"echo,exit,halt"
多个函数之间使用半角逗号分隔即可。
并且还提供了在模板文件中直接调用函数的快捷方法,无需通过模板变量,包括两种方式:
1、执行方法并输出返回值:
格式:{:function(…)}
例如,输出U方法的返回值:
{:U('User/insert')}
编译后的PHP代码是
<?php echo U('User/insert');?>
2、执行方法但不输出:
格式:{~function(…)}
例如,调用say_hello函数:
{~say_hello('ThinkPHP')}
编译后的PHP代码是:
<?php say_hello('ThinkPHP');?>
系统变量
除了常规变量的输出外,模板引擎还支持系统变量和系统常量、以及系统特殊变量的输出。它们的输出不需要事先赋值给某个模板变量。系统变量的输出必须以$Think. 打头,并且仍然可以支持使用函数。
1、系统变量:包括server、session、post、get、request、cookie
{$Think.server.script_name } // 输出$_SERVER变量
{$Think.session.session_id|md5 } // 输出$_SESSION变量
{$pageNumber } // 输出$_GET变量
{$kie.name }  // 输出$_COOKIE变量
支持输出$_SERVER、$_ENV、 $_POST、 $_GET、 $_REQUEST、$_SESSION和 $_COOKIE变量。后面的server、cookie、config不区分大小写,但是变量区分大小写。例如:
{$Think.server.script_name }和{$Think.SERVER.script_name }等效
SESSION 、COOKIE还支持二维数组的输出,例如:
{$Think.CONFIG.user.user_name}
{$Think.session.user.user_name}
系统不支持三维以上的数组输出,请使用下面的方式输出。
以上方式还可以写成:
{$_SERVER.script_name } // 输出$_SERVER变量
{$_SESSION.session_id|md5 } // 输出$_SESSION变量
{$_GET.pageNumber } // 输出$_GET变量
{$_COOKIE.name }  // 输出$_COOKIE变量
2、系统常量 :使用$st 输出
{$st.__SELF__ }
{$st.MODULE_NAME }
或者直接使用
{$Think.__SELF__ }
{$Think.MODULE_NAME }
3、特殊变量 :由ThinkPHP系统内部定义的常量
{$Think.version }  //版本
{$w } //现在时间
{$plate|basename } //模板页面
{$Think.LDELIM } //模板标签起始符号
{$Think.RDELIM } //模板标签
结束符号
4、配置参数 :输出项目的配置参数值
{$fig.db_charset}
输出的值和C('db_charset') 的返回结果是一样的。
也可以输出二维的配置参数,例如:
{$fig.user.user_name}
5、语言变量:输出项目的当前语言定义值
{$Think.lang.page_error}
输出的值和L('page_error')的返回结果是一样的。
快捷输出
为了使得模板定义更加简洁,系统还支持一些常用的变量输出快捷标签,包括:
{@var} //输出Session变量 和 {$Think.session.var} 等效
{#var} //输出Cookie变量 和 {$kie.var} 等效
{&var} //输出配置参数 和 {$fig.var} 等效
{%var} //输出语言变量 和 {$Think.lang.var} 等效
{.var} //输出GET变量 和 {$var} 等效
{^var} //输出POST变量 和{$Think.post.var} 等效
{*var} //输出常量和 {$st.var} 等效
如果需要输出二维数组,例如 要输出$_SESSION[‘var1’][‘var2’]的值 快捷输出可以使用:
{@var1.var2} 的方式
同理
{#var1.var2}
可以输出 $_COOKIE[‘var1’][‘var2’]的值。
必须注意的是:快捷输出的变量不支持函数的使用。
所以,下面的用法是错误的:
{#var|strlen}
默认值输出
如果输出的模板变量没有值,但是我们需要在显示的时候赋予一个默认值的话,可以使用default语法,格式:
{$变量|default="默认值"}
href标签怎么用
这里的default不是函数,而是系统的一个语法规则,例如:
{$user.nickname|default="这家伙很懒,什么也没留下"}
对系统变量的输出也可以支持默认值,例如:
{$Think.post.name|default="名称为空"}
因为快捷输出不支持使用函数,所以也不支持默认值,默认值支持Html语法。
包含文件
可以使用Include标签来包含外部的模板文件,使用方法如下:
1、 使用完整文件名包含
格式:<include file="完整模板文件名" />
例如:
<include file="./Tpl/default/Public/header.html" />
这种情况下,模板文件名必须包含后缀。使用完整文件名包含的时候,特别要注意文件包含指的是服务器端包含,而不是包含一个URL地址,也就是说file参数的写法是服务器端的路径,如果使用相对路径的话,是基于项目的入口文件位置。
2、包含当前模块的其他操作模板文件
格式:<include file="操作名" />
例如 导入当前模块下面的read操作模版:
<include file="read" />
操作模板无需带后缀。
3、 包含其他模块的操作模板
格式:<include file="模块名:操作名" />
例如,包含Public模块的header操作模版:
<include file="Public:header" />
4、包含其他模板主题的模块操作模板
格式:<include file="主题名@模块名:操作名" />
例如,包含blue主题的User模块的
read操作模版:
<include file="blue@User:read" />
5、 用变量控制要导入的模版
格式:<include file="$变量名" />
例如
<include file="$tplName" />
给$tplName赋不同的值就可以包含不同的模板文件,变量的值的用法和上面的用法相同。
6、使用快捷方式包含文件
格式:{include:模板文件规则}
其中的模板文件规则可以使用上面提到的5种方式。
注意:由于模板解析的特点,从入口模板开始解析,如果外部模板有所更改,模板引擎并不会重新编译模板,除非缓存已经过期。如果修改了包含的外部模板文件后,需要把模块的缓存目录清空,否则无法生效。
导入文件
传统方式的导入外部JS和CSS文件的方法是直接在模板文件使用:
<script type='text/javascript' src='/Public/Js/Util/Array.js'>
<link rel="stylesheet" type="text/css" href="/App/Tpl/default/Public/css/style.css" />
系统提供了专门的标签来简化上面的导入:
第一个是import标签 ,导入方式采用类似ThinkPHP的import函数的命名空间方式,例如:
<import type='js' file="Js.Util.Array" />
Type属性默认是js, 所以下面的效果是相同的:
<import file="Js.Util.Array" />
还可以支持多个文件批量导入,例如:
<import file="Js.Util.Array,Js.Util.Date" />
导入外部CSS文件必须指定type属性的值,例如:
<import type='css' file="Cssmon" />
上面的方式默认的import的起始路径是网站的Public目录,如果需要指定其他的目录,可以使用basepath属性,例如:
<import file="Js.Util.Array"  basepath="./Common" />
第二个是load标签,通过文件方式导入当前项目的公共JS或者CSS
例如:
<load href="../Public/Js/Common.js" />
<load href="../Public/Css/common.css" />
在href属性中可以使用特殊模板标签替换,例如:
<load href="__PUBLIC__/Js/Common.js" />
Load标签可以无需指定type属性,系统会自动根据后缀自动判断。
系统还提供了两个标签别名js和css 用法和load一致,例如:
<js href="__PUBLIC__/Js/Common.js" />
<css href="../Public/Css/common.css" />
另外,系统提供了普通标签的方式加载外部js和css文件。
{load: __PUBLIC__/Js/Common.js}
{load: ../Public/Css/common.css }
Volist标签
Volist标签主要用于在模板中循环输出数据集或者多维数组。
通常模型的select和findall方法返回的结果是一个二维数组,可以直接使用volist标签进行输出。
在Action中首先对模版赋值:
$User = M('User');
$list = $User->select();
$this->assign('list',$list);
在模版定义如下,循环输出用户的编号和姓名:
<volist name="list" id="vo">
{$vo.id}
{$vo.name}
</volist>
Volist标签的name属性表示模板赋值的变量名称,因此
不可随意在模板文件中改变。id表示当前的循环变量,可以随意指定,但确保不要和name属性冲突,例如:
<volist name="list" id="data">
{$data.id}
{$data.name}
</volist>
支持输出部分数据,例如输出其中的第5~15条记录
<volist name="list" id="vo" offset="5" length='10'>
{$vo.name}
</volist>
输出偶数记录
<volist name="list" id="vo" mod="2" >
<eq name="mod" value="1">{$vo.name}</eq>
</volist>
Mod属性还用于控制一定记录的换行,例如:
<volist name="list" id="vo" mod="5" >
{$vo.name}
<eq name="mod" value="4"><br/></eq>
</volist>
输出循环变量
<volist name="list" id="vo" key="k" >
{$k}.{$vo.name}
</volist>
如果没有指定key属性的话,默认使用循环变量i,例如:
<volist name="list" id="vo"  >
{$i}.{$vo.name}
</volist>
如果要输出数组的索引,可以直接使用key变量,和循环变量不同的是,这个key是由数据本身决定,而不是循环控制的,例如:
<volist name="list" id="vo"  >
{$key}.{$vo.name}
</volist>
volist还有一个别名iterate,用法和volist是一样。
Foreach标签
foreach标签也是用于循环输出
<foreach name="list" item="vo" >
{$vo.id}
{$vo.name}
</foreach>
Foreach标签相对比volist标签简洁,没有volist标签那么多的功能。优势是可以对对象进行遍历输出,而volist标签通常是用于输出数组。
Switch标签
模板引擎支持Switch标签,格式为:
<switch name="变量" >
<case value="值1">输出内容1</case>
<case value="值2">输出内容2</case>
<default  />默认情况
</switch>
使用方法如下:
<switch name="User.level">
<case value="1">value1</case>
<case value="2">value2</case>
<default />default
</switch>
其中name属性可以使用函数以及系统变量,例如:
<switch name="userId|abs">
<case value="1">admin</case>
<default />default
</switch>
对于case的value属性可以支持多个条件的判断,使用”|”进行分割,例如:
<switch name="pe">
<case value="gif|png|jpg">图像格式</case>
<default />其他格式
</switch>
表示如果$_GET["type"] 是gif、png或者jpg的话,就判断为图像格式。
也可以对case的value属性使用变量,例如:
<switch name="User.userId">
<case value="$adminId">admin</case>
<case value="$memberId">member</case>
<default />default
</switch>
使用变量方式的情况下,不再支持多个条件的同时判断。
比较标签
模板引擎提供了丰富的判断标签,比较标签的用法是:
<;比较标签 name="变量" value="值">内容</比较标签>
系统支持的比较标签以及所表示的含义分别是:
²  eq或者 equal:等于
²  neq 或者notequal:不等于
²  gt:大于
²  egt:大于等于
²  lt:

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。