ThinkPHP6 默认使用了 Think模板引擎,这是一种轻量级的模板引擎,旨在提高开发效率。它的主要特点是:
在模板中,你可以使用{}
来输出变量值
:
<p>{$name}</p>
这会将 $name 变量的值输出到页面上。你还可以进行修饰符操作,例如:
<p>{$name|default="默认值"}</p>
如果 $name 为空,显示 默认值。
控制结构
ThinkPHP6 的模板语法支持条件判断、循环等控制结构:
{if $age > 18}
<p>成年人</p>
{else}
<p>未成年人</p>
{/if}
可以使用php代码,例如:
{if strtoupper($user['name']) == 'THINKPHP' }ThinkPHP
{else /} other Framework
{/if}
{foreach $items as $item}
<p>{$item}</p>
{/foreach}
{for $i = 0; $i < 5; $i++}
<p>{$i}</p>
{/for}
{switch 变量 }
{case value1 }输出内容1{/case}
{case value2}输出内容2{/case}
{default /}默认情况
{/switch}
范围判断标签包括in/notin/between/notbetween
四个标签,都用于判断变量是否中某个范围。
用法: 假设我们中控制器中给id赋值为1:
$id = 1;
View::assign('id',$id);
我们可以使用in标签来判断模板变量是否在某个范围内,例如:
{in name="id" value="1,2,3"}
id在范围内
{/in}
最后会输出:id在范围内
。
如果判断不在某个范围内,可以使用notin标签:
{notin name="id" value="1,2,3"}
id不在范围内
{/notin}
最后会输出:id不在范围内
。
可以把上面两个标签合并成为:
{in name="id" value="1,2,3"}
id在范围内
{else/}
id不在范围内
{/in}
name属性还可以支持直接判断系统变量,例如:
{in name="Think.get.id" value="1,2,3"}
$_GET['id'] 在范围内
{/in}
value属性也可以使用变量,例如:
{in name="id" value="$range"}
id在范围内
{/in}
$range变量可以是数组,也可以是以逗号分隔的字符串。
value属性还可以使用系统变量,例如:
{in name="id" value="$Think.post.ids"}
id在范围内
{/in}
可以使用between标签来判断变量是否在某个区间范围内,可以使用:
{between name="id" value="1,10"}
输出内容1
{/between}
同样,也可以使用notbetween标签来判断变量不在某个范围内:
{notbetween name="id" value="1,10"}
输出内容2
{/notbetween}
也可以使用else标签把两个用法合并,例如:
{between name="id" value="1,10"}
输出内容1
{else/}
输出内容2
{/between}
present标签用于判断某个变量是否已经定义,用法:
{present name="name"}
name已经赋值
{/present}
如果判断没有赋值,可以使用:
{notpresent name="name"}
name还没有赋值
{/notpresent}
可以把上面两个标签合并成为:
{present name="name"}
name已经赋值
{else /}
name还没有赋值
{/present}
present标签的name属性可以直接使用系统变量,例如:
{present name="Think.get.name"}
$_GET['name']已经赋值
{/present}
empty标签用于判断某个变量是否为空,用法:
{empty name="name"}
name为空值
{/empty}
如果判断没有赋值,可以使用:
{notempty name="name"}
name不为空
{/notempty}
可以把上面两个标签合并成为:
{empty name="name"}
name为空
{else /}
name不为空
{/empty}
name属性可以直接使用系统变量,例如:
{empty name="Think.get.name"}
$_GET['name']为空值
{/empty}
DEFINED标签用于判断某个常量是否有定义,用法如下:
{defined name="NAME"}
NAME常量已经定义
{/defined}
name属性的值要注意严格大小写
如果判断没有被定义,可以使用:
{notdefined name="NAME"}
NAME常量未定义
{/notdefined}
可以把上面两个标签合并成为:
{defined name="NAME"}
NAME常量已经定义
{else /}
NAME常量未定义
{/defined}
我们可以对模板输出使用运算符,包括如下支持。
运算符 | 使用示例 |
---|---|
+ |
{$a+$b} |
- |
{$a-$b} |
* |
{$a*$b} |
/ |
{$a/$b} |
% |
{$a%$b} |
++ |
{$a++} 或{++$a} |
-- |
{$a--} 或{--$a} |
综合运算 | {$a+$b*10+$c} |
在使用运算符的时候,不再支持前面提到的函数过滤用法,例如:
{$user.score+10} //正确的
{$user['score']+10} //正确的
{$user['score']*$user['level']} //正确的
{$user['score']|myFun*10} //错误的
{$user['score']+myFun($user['level'])} //正确的
模板可以支持三元运算符,例如:
{$status? '正常' : '错误'}
{$info['status']? $info['msg'] : $info['error']}
{$info.status? $info.msg : $info.error }
还支持如下的写法:
{$name ?? '默认值'}
表示如果有设置$name
则输出$name
,否则输出默认值。
{$name?='默认值'}
表示$name为真时才输出默认值。
{$name ?: 'NO'}
表示如果$name
为真则输出$name
,否则输出NO。
{$a==$b ? 'yes' : 'no'}
前面的表达式为真输出yes,否则输出no, 条件可以是==、===、!=、!==、>=、<=
Php代码可以和标签在模板文件中混合使用,可以在模板文件里面书写任意的PHP语句代码 ,包括下面两种方式:
{php}echo 'Hello,world!';{/php}
我们建议需要使用PHP代码的时候尽量采用php标签,因为原生的PHP语法可能会被配置禁用而导致解析错误。
<?php
echo 'Hello,world!';
?>
注意:php标签或者php代码里面就不能再使用标签(包括普通标签和XML标签)了,因此下面的几种方式都是无效的:
{php}{eq name='name'value='value'}value{/eq}{/php}
Php标签里面使用了eq标签,因此无效
{php}if( {$user} != 'ThinkPHP' ) echo 'JIJINCMS' ;{/php}
Php标签里面使用了{$user}普通标签输出变量 ,因此无效。
{php}if( $user.name != 'ThinkPHP' ) echo 'JIJINCMS' ;{/php}
Php标签里面使用了$user.name点语法变量输出 ,因此无效。
简而言之,在PHP标签里面不能再使用PHP本身不支持的代码。
普通的模板变量需要首先赋值后才能在模板中输出,但是系统变量则不需要,可以直接在模板中输出,系统变量的输出通常以{$Request.(大小写一致) 打头,例如:
{$Request.server.script_name} // 输出$_SERVER['SCRIPT_NAME']变量
{$Request.session.user_id} // 输出$_SESSION['user_id']变量
{$Request.get.page} // 输出$_GET['page']变量
{$Request.cookie.name} // 输出$_COOKIE['name']变量
支持输出$_SERVER、$_ENV、$_POST、$_GET、$_REQUEST、$_SESSION和$_COOKIE变量。
$Request.方法名.参数
例如接收get传递的参数:
{$Request.param.name}
支持Request类的大部分方法,但只支持方法的第一个参数。
下面都是有效的输出:
// 调用Request对象的param方法 传入参数为name
{$Request.param.name}
// 调用Request对象的param方法 传入参数为user.nickname
{$Request.param.user.nickname}
// 调用Request对象的root方法
{$Request.root}
// 调用Request对象的root方法,并且传入参数true
{$Request.root.true}
// 调用Request对象的path方法
{$Request.path}
// 调用Request对象的module方法
{$Request.module}
// 调用Request对象的controller方法
{$Request.controller}
// 调用Request对象的action方法
{$Request.action}
// 调用Request对象的ext方法
{$Request.ext}
// 调用Request对象的host方法
{$Request.host}
// 调用Request对象的ip方法
{$Request.ip}
// 调用Request对象的header方法
{$Request.header.accept-encoding}
还可以输出常量
{$Think.const.PHP_VERSION}
或者直接使用
{$Think.PHP_VERSION}
仅用于输出ThinkPHP6.0+
中的配置参数使用:
{$Think.config.app.app_host}
{$Think.config.session.name}
仅用于输出ThinkPHP6.0+的语言变量使用:
{$Think.lang.page_error}
{$Think.lang.var_error}