ThinkPHP 模板语法¶
ThinkTemplate使用了xml标签库技术的编译型模板引擎,支持两种类型的模板标签,使用了动态编译和缓存技术,而且支持自定义标签库。
每个模板文件在执行过程中都会生成一个编译后的缓存文件,其实就是一个可以运行的PHP文件。模板缓存默认位于项目的 Runtime/Cache
目录下面,以模板文件的md5编码作为缓存文件名保存的,如果开启页面Trace功能的话,可以在Trace信息里面看到当前页面对应的模板缓存文件名。如果在模板标签的使用过程中发现问题,可以尝试通过查看模板缓存文件找到问题所在。
内置的模板引擎支持普通标签和xml标签方式两种标签定义,分别用于不同的目的:普通标签主要用于输出变量和做一些基本的操作;xml 标签除了包含了普通标签的所有功能外,还可以完成一些逻辑判断、控制和循环输出,但是在变量输出上,普通标签具有简洁明了的优势。
例如:{$name}
看起来比 <var name=”name” />
更加容易使用,但是在控制和判断方面,xml标签却有着普通标签无法替代的作用。
这种方式的结合保证了模板引擎的简洁和强大的有效融合。
路径¶
传参示例 | 说明 | 获取模板路径 |
---|---|---|
view() |
默认模板的地址 | app/index/view/index/index.html |
view(‘upload’) |
修改文件 | app/index/view/index/upload.html |
view(‘public/upload’) |
修改目录 | app/index/view/ipublic/upload.html |
view(’./index’) |
入口文件同级的模板文件 | public/index.html |
view(’./html/index’) |
入口文件同级的模板文件 | public/html/index.html |
注意:如果命名为index.html
,首先会访问public/index.html
,即入口文件的index.html
)
模板渲染
示范:
1) 使用assign和fetch
2)使用display返回字符串
{
之间不能有空格
可修改变量前后标识符
3)变量赋值(四种)
系统提供的路径常量有:
可自行在config目录中替换,替换函数为:
变量输出¶
我们已经知道了在Action中使用assign方法可以给模板变量赋值,赋值后怎么在模板文件中输出变量的值呢?
如果我们在Action中赋值了一个name模板变量:
注意模板标签的{
和$
之间不能有任何的空格,否则标签无效。普通标签默认开始标记是 {
,结束标记是 }
。也可以通过设置TMPL_L_DELIM和TMPL_R_DELIM进行更改。例如,我们在项目配置文件中定义:
<{$name}>
后面的内容我们都以默认的标签定义来说明。assign方法里面的第一个参数才是模板文件中使用的变量名称。如果改成下面的代码:
再使用{$name}
输出就无效了,必须使用 {$name2}
才能输出模板变量的值了。如果我们需要把一个用户数据对象赋值给模板变量:
也就是说$user
其实是一个数组变量,我们可以使用下面的方式来输出相关的值:
如果$user
是一个对象而不是数组的话,
为了方便模板定义,还可以支持点语法,例如,上面的
点语法默认的输出是数组方式,所以上面两种方式是在没有配置的情况下是等效的。我们可以通过配置TMPL_VAR_IDENTIFY参数来决定点语法的输出效果。
如果是多维数组或者多层对象属性的输出,可以使用下面的定义方式:{$user.sub.name} // 使用点语法输出
或者使用{$user['sub']['name']} // 输出三维数组的值
, {$user:sub:name} // 输出对象的多级属性
模板函数
仅仅是输出变量并不能满足模板输出的需要,内置模板引擎支持对模板变量使用调节器和格式化功能,其实也就是提供函数支持,并支持多个函数同时使用。用于模板标签的函数可以是PHP内置函数或者是用户自定义函数,和smarty不同,用于模板的函数不需要特别的定义。
模板变量的函数调用格式为:{$varname|function1|function2=arg1,arg2,### }
说明:
1. {
和 $
符号之间不能有空格 ,后面参数的空格就没有问题
2. ###
表示模板变量本身的参数位置
3. 支持多个函数,函数之间支持空格
4. 支持变量缓存功能,重复变量字串不多次解析
使用例子:{$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
支持输出 $_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}
以上方式还可以写成:
2、系统常量 :使用 $Think.const
输出
3、特殊变量 :由ThinkPHP系统内部定义的常量
4、配置参数 :输出项目的配置参数值 {$Think.config.db_charset}
输出的值和 C('db_charset')
的返回结果是一样的。也可以输出二维的配置参数,例如:{$Think.config.user.user_name}
5、语言变量:输出项目的当前语言定义值 {$Think.lang.page_error}
输出的值和 L('page_error')
的返回结果是一样的。
默认值输出
如果输出的模板变量没有值,但是我们需要在显示的时候赋予一个默认值的话,可以使用default语法,格式:
{$变量|default="默认值"}
, 这里的default不是函数,而是系统的一个语法规则,例如:{$user.nickname|default="这家伙很懒,什么也没留下"}
对系统变量的输出也可以支持默认值,例如: {$Think.post.name|default="名称为空"}
模板布局¶
模版引入
可以使用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赋不同的值就可以包含不同的模板文件,变量的值的用法和上面的用法相同。
模板继承
{extend name="common/base" /}
被继承的文件预留坑位, 继承后可以重写
继承后可以保留原有内容
layout布局
开启布局配置 config.php
app/index/view/layout.html
预留坑位 {__CONTENT__}
导入文件
传统方式的导入外部JS和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="Css.common" />
上面的方式默认的import的起始路径是网站的Public目录,如果需要指定其他的目录,可以使用basepath属性,例如:<import file="Js.Util.Array" basepath="./Common" />
第二个是load标签,通过文件方式导入当前项目的公共JS或者CSS
例如:
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中首先对模版赋值:
在模版定义如下,循环输出用户的编号和姓名:
Volist标签的name属性表示模板赋值的变量名称,因此不可随意在模板文件中改变。id表示当前的循环变量,可以随意指定,但确保不要和name属性冲突,例如:
支持输出部分数据,例如输出其中的第5~15条记录
输出偶数记录
Mod属性还用于控制一定记录的换行,例如:
输出循环变量
如果没有指定key属性的话,默认使用循环变量i,例如:
如果要输出数组的索引,可以直接使用key变量,和循环变量不同的是,这个key是由数据本身决定,而不是循环控制的,例如:
下拉列表时配合使用缺省项
在ThinkPHP中,使用volist实现下拉菜单项的填充,如果需要设置缺省项,
volist还有一个别名iterate,用法和volist是一样。
Foreach标签
foreach标签也是用于循环输出
Foreach标签相对比volist标签简洁,没有volist标签那么多的功能。优势是可以对对象进行遍历输出,而volist标签通常是用于输出数组。
for标签
php 代码:
volist循环
foreach循环
for循环
Switch 条件判断¶
模板引擎支持Switch标签,格式为:
使用方法如下:
其中name属性可以使用函数以及系统变量,例如:
对于case的value属性可以支持多个条件的判断,使用|
进行分割,例如:
表示如果$_GET["type"]
是gif、png或者jpg的话,就判断为图像格式。
也可以对case的value属性使用变量,例如:
使用变量方式的情况下,不再支持多个条件的同时判断。
比较标签¶
模板引擎提供了丰富的判断标签,比较标签的用法是:<比较标签 name="变量" value="值">内容<!--比较标签-->
系统支持的比较标签以及所表示的含义分别是:
1. eq
或者 equal
等于
2. neq
或者notequal
:不等于
3. gt
:大于
4. egt
:大于等于
5. lt
:小于
6. elt
:小于等于
7. heq
:恒等于
8. nheq
:不恒等于
他们的用法基本是一致的,区别在于判断的条件不同。例如,要求name变量的值等于value就输出,可以使用:<eq name="name" value="value">value</eq>
也可以支持和else标签混合使用:<eq name="name" value="value">相等<else/>不相等</eq>
当 name变量的值大于5就输出 <gt name="name" value="5">value</gt>
当name变量的值不小于5就输出<egt name="name" value="5">value</egt>
比较标签中的变量可以支持对象的属性或者数组,甚至可以是系统变量,举例说明:
当vo对象的属性(或者数组,或者自动判断)等于5就输出<eq name="vo.name" value="5">{$vo.name}</eq>
当vo对象的属性等于5就输出 <eq name="vo:name" value="5">{$vo.name}</eq>
当$vo['name']
等于5就输出<eq name="vo['name']" value="5">{$vo.name}</eq>
而且还可以支持对变量使用函数, 当vo对象的属性值的字符串长度等于5就输出<eq name="vo:name|strlen" value="5">{$vo.name}</eq>
变量名可以支持系统变量的方式,例如: <eq name="Think.get.name" value="value">相等<else/>不相等</eq>
通常比较标签的值是一个字符串或者数字,如果需要使用变量,只需要在前面添加$
标志:
当vo对象的属性等于$a
就输出 <eq name="vo:name" value="$a">{$vo.name}</eq>
所有的比较标签可以统一使用compare标签(其实所有的比较标签都是compare标签的别名),例如:当name变量的值等于5就输出<compare name="name" value="5" type="eq">value</compare>
其中type属性的值就是上面列出的比较标签名称
Range标签¶
Range标签用于判断某个变量是否在某个范围之内,包括in、notin和range三个标签。
可以使用in标签来判断模板变量是否在某个范围内,例如:<in name="id" value="1,2,3" >输出内容1</in>
如果判断不再某个范围内,可以使用:<notin name="id" value="1,2,3" >输出内容2</notin>
可以把上面两个标签合并成为: <in name="id" value="1,2,3" >输出内容1<else/>输出内容2</in>
Value属性的值可以使用变量,例如: <in name="id" value="$var" >输出内容1</in>
变量的值可以是字符串或者数组,都可以完成范围判断。
也可以直接使用range标签,替换in和notin的用法:<range name="id" value="1,2,3" type="in" >输出内容1</range>
其中type属性的值可以用in或者notin。
Defined标签¶
可以使用defined标签判断常量是否已经有定义,例如:<defined name="NAME">NAME常量已经定义</defined>
如果判断没有被定义,可以使用:<notdefined name="NAME">NAME常量未定义</notdefined>
可以把上面两个标签合并成为:<defined name="NAME">NAME常量已经定义<else /> NAME常量未定义</defined>
IF标签¶
如果觉得上面的标签都无法满足条件判断要求的话,我们还可以使用if标签来定义复杂的条件判断,例如:
在condition属性中可以支持eq等判断表达式 ,同上面的比较标签,但是不支持带有>, <
等符号的用法,因为会混淆模板解析。
除此之外,我们可以在condition属性里面使用php代码,例如:
condition属性可以支持点语法和对象语法,例如:自动判断user变量是数组还是对象
或者知道user变量是对象
标签嵌套¶
模板引擎支持标签的多层嵌套功能,可以对标签库的标签指定可以嵌套。系统内置的标签中,volist(及其别名iterate)、switch、if、elseif、else、foreach、compare(包括所有的比较标签)、(not)present、(not)empty、(not)defined等标签都可以嵌套使用。例如:
上面的标签可以用于输出双重循环。默认的嵌套层次是3级,所以嵌套层次不能超过3层,如果需要更多的层次可以指定TAG_NESTED_LEVEL配置参数。
使用PHP代码¶
Php代码可以和标签在模板文件中混合使用,可以在模板文件里面书写任意的PHP语句代码 ,包括下面两种方式:
第一种是使用php标签: <php>echo 'Hello,world!';</php>
第二种就是直接使用原始的php代码:<?php echo 'Hello,world!'; ?>
但是php标签或者php代码里面就不能再使用标签(包括普通标签和xml标签)
原样输出¶
可以使用literal标签来防止模板标签被解析,例如:
上面的if标签被literal标签包含,因此if标签里面的内容并不会被模板引擎解析,而是保持原样输出。 Literal标签可以用于页面的JS代码外面,确保JS代码中的某些用法和模板引擎不产生混淆。
模板注释¶
模板支持注释功能,该注释文字在最终页面不会显示,仅供模板制作人员参考和识别。格式:{/* 注释内容 */ }
或 {// 注释内容 }
说明:在显示页面的时候不会显示模板注释,仅供模板制作的时候参考。
注意{和注释标记之间不能有空格。
例如:
模板注释支持多行可以。模板注释在生成编译缓存文件后会自动删除,这一点和Html的注释不同。
凡本网注明"来源:XXX "的文/图/视频等稿件,本网转载出于传递更多信息之目的,并不意味着赞同其观点或证实其内容的真实性。如涉及作品内容、版权和其它问题,请与本网联系,我们将在第一时间删除内容!
作者:
来源: https://www.cnblogs.com/mr-amazing/p/3938805.html, ThinkPHP, ThinkPHP视图View模板语法