thinkphp-模版的函数和运算符、模版的循环标签、模版的比较和定义标签
使用函数
模板官网API
https://www.kancloud.cn/manual/think-template/1286403
在模板中应用方法,比如控制器端先赋值一个密码的变量,模版区设置md5 加密操作;
return View::fetch('output', [
'password' => 123456
]);
<body>
{$password|md5}
</body>
查看项目根目录下runtime/temp/中的编译文件,会发现上面模板实际上执行了下面的代码
<?php echo htmlentities(md5($password)); ?>
如果在某个字符,你不需要进行HTML 实体转义htmlentities的话,可以单独使用raw 处理;
{$password|raw}
那么编译后,就会输出
<?php echo $password; ?>
系统还提供了一些固定的过滤方法,如下:
函数 说明
date 格式化时间{$time|date='Y-m-d'}
format 格式化字符串{$number|format='%x'}
upper 转换为大写
lower 转换为小写
first 输出数组的第一个元素
last 输出数组的最后一个元素
default 默认值
raw 不使用转义
示例
{$time|date='Y-m-d'}
{$number|format='%x'}
return View::fetch('output', [
'arr' => $arr,
// 相当于将对象的this传到模板中
'obj' => $this,
'password' => 123456,
'time' => time()
]);
// 对参数应用多种方法 并对时间格式化
{$password|md5|raw} -- {$time|date='Y-m-d'}
实际执行了
<?php echo md5($password); ?> -- <?php echo htmlentities(date('Y-m-d',!is_numeric($time)? strtotime($time) : $time)); ?>
如果函数中,需要多个参数调用,直接用逗号隔开即可;
比如从第一个字符开始,取3个字符
{$name|substr=0,3}
在模版中也支持多个函数进行操作,用|号隔开即可,函数从左到右依次执行;
{$password|md5|upper|substr=0,3}
你也可以在模版中直接使用PHP 的语法模式,该方法不会使用过滤转义:
{:md5( substr($arr.name, 0, 3) )}
注意开头语法必须是冒号 {:xxx(php要求的参数)}
运算符
在模版中的运算符有+、-、*、/、%、++、--等;
{$number + $number}
如果模版中有运算符,部分函数不支持;
{$number + $number|default='没有值'} // 不支持
模版也可以实现三元运算,包括其它写法;
{$name ? '正确' : '错误'} //$name 为true 返回正确,否则返回错误
{$name ?= '真'} //$name 为true 返回真
{$Request.get.name ?? '不存在'} //??用于系统变量,没有值时输出 当有值的时候会直接输出值 没值时输出“不存在”
{$name ?: '不存在'} //?:用于普通变量,有值时候输出值,没有值时输出 ‘不存在’
三元运算符也支持运算后返回布尔值判断;
{$a == $b ? '真' : '假'}
模版的循环标签
foreach 循环
控制前端先通过模型把相应的数据列表给筛选出来;在模版端使用对称的标签{foreach}...{/foreach}实现循环;
注意:这里对象调用时:用->符号或用.符号均可正确实现数据显示;对象推荐使用->
控制器中
namespace app\controller;
use app\model\User;
use think\facade\View;
$list = User::select();
return View::fetch('loop', [
'list' => $list
]);
新建view/show/loop.html模板
<body>
<table border="1" align="center" width="700">
<tr>
<th>编号</th>
<th>姓名</th>
<th>性别</th>
<th>邮箱</th>
<th>价格</th>
<th>时间</th>
</tr>
{foreach $list as $key => $obj}
<tr>
<td>{$key} : {$obj.id} 或 {$obj->id}</td>
<td>{$obj->username}</td>
<td>{$obj->gender}</td>
<td>{$obj->email}</td>
<td>{$obj->price}</td>
<td>{$obj->create_time}</td>
</tr>
{/foreach}
</table>
</body>
最终输出
编号 | 姓名 | 性别 | 邮箱 | 价格 | 时间 |
---|---|---|---|---|---|
0 : 19 或 19 | 蜡笔小新 | 男 | xiaoxin@163.com | 60.00 | 2016-06-27 16:45:26 |
1 : 20 或 20 | 路飞 | 男 | lufei@163.com | 70.00 | 2023-12-14 16:55:56 |
2 : 21 或 21 | 黑崎一护 | 男 | yihu@163.com | 80.00 | 2016-07-27 17:22:16 |
3 : 24 或 24 | 小明 | 男 | xiaoming@163.com | 90.00 | 2016-08-27 23:50:52 |
volist 循环
一般情况foreach就够用了,volist提供了更多处理信息的能力。
volist 也是将查询得到的数据集通过循环的方式进行输出;
{volist name="list" id="obj"}
<tr>
<td>{$key} : {$obj.id} 或 {$obj->id}</td>
<td>{$obj->username}</td>
<td>{$obj->gender}</td>
<td>{$obj->email}</td>
<td>{$obj->price}</td>
<td>{$obj->create_time}</td>
</tr>
{/volist}
与foreach的值比较下,看看name与id分别代表什么。
volist 中的name 属性表示数据总集,id 属性表示当前循环的数据单条集;
使用offset 属性和length 属性从第4 条开始显示5 条,这里下标从0 开始;
{volist name="list" id="obj" offset="3" length="5"}
可以使用eq 标签,来实现奇数或偶数的筛选数据;
{volist name="list" id="obj" mod="2"}
{eq name="mod" value="0"}
<tr>
<td>{$key} : {$obj.id} 或 {$obj->id}</td>
<td>{$obj->username}</td>
<td>{$obj->gender}</td>
<td>{$obj->email}</td>
<td>{$obj->price}</td>
<td>{$obj->create_time}</td>
</tr>
{/eq}
{/volist}
value=0代表输出偶数行,value=1那么则会输出奇数行
通过编译文件可以理解,mod=2 表示索引除以2 得到的余数是否等于0 或1;如果余数(value)设置为0,那么输出的即偶数,如果设置为1,则输出的是奇数;当然,切换到其它数字,也会有更多的排列效果;
编译后源码参考
<?php if(is_array($list) || $list instanceof \think\Collection || $list instanceof \think\Paginator): $i = 0; $__LIST__ = $list;if( count($__LIST__)==0 ) : echo "" ;else: foreach($__LIST__ as $key=>$obj): $mod = ($i % 2 );++$i;if($mod == '1'): ?>
使用empty 属性,可以当没有任何数据的时候,实现输出指定的提示;
$list = User::where('id', 1011)->select();
return View::fetch('loop', [
'list' => $list
]);
{volist name="list" id="obj" empty="没有数据"}
就会直接显示“没有数据”
使用key='k',让索引从1 开始计算,不指定就用{$i},指定后失效;
{volist name="list" id="obj" key="k"}
<tr>
<td>{$k} : {$obj.id} 或 {$obj->id}</td>
</tr>
{/volist}
for 循环
常用于纯数字循环
{for start="1" end="100"}
{$i}
{/for}
默认就是$i
{for start="1" end="100" name="i" step="2" comparison='lt'}
{$i}
{/for}
其中可以使用name进行$i变量的指定
step=2代表步长,从1开始每次加2
comparison='lt'代表是正向还是逆向,正向未1->100,逆向则为100->1,逆向则传入gt
注意,逆向的同时,start和end的值也要改,以及step需要为负数
{for start="100" end="1" name="o" step="-2" comparison='gt'}
{$o}
{/for}
最终输出:100 98 96 94 92 90 88 86 84 82 80 78 76 74...16 14 12 10 8 6 4 2
模版的比较和定义标签
比较标签
{eq}..{/eq}标签,比较两个值是否相同,相同即输出包含内容;
控制器中
return View::fetch('eq', [
'name' => 'wu'
]);
模板中
{eq name="name" value="wu"}
相等
{/eq}
其中“name” 是传递来的name对应的值,value是要比较的值,就是比较'name'=>wu 与value-wu值是否一样。
{eq name="$name" value="wu"}
相等
{/eq}
如果value对应的值也是个变量的话
return View::fetch('eq', [
'name' => 'wu',
'name2' => 'bin'
]);
{eq name="$name" value="$name2"}
相等
{/eq}
这时候,value对应的值必须要加$符号。此时编译出来的原生语句,可以参考学习。
<?php if($name == $name2): ?>
相等
<?php endif; ?>
这一组标签也支持else 操作,标签为:{else/};
{eq name="$name" value="$name2"}
相等
{else/}
不相等
{/eq}
{eq}标签有一个别名标签:{equal},效果是一样的,所有比较标签如下;
标签 | 含义 |
---|---|
eq equal | 等于 |
neq notequal | 不等于 |
gt | 大于 |
egt | 大于等于 |
lt | 小于 |
elt | 小于等于 |
heq | 恒等于 |
nheq | 不恒等于 |
所有的标签都可以统一为{compare}标签使用,增加一个type 方法指定即可;
{compare name="name" value="wu" type='eq'}
两个值相等
{/compare}
定义标签
如果你想在模版文件中去定义一个变量,可以使用{assgin}标签;
{assign name="var" value="123"}
输出自定义的变量:{$var}
也支持变量value='$name'
在模板中定义一个自定义的常量
{define name="PI" value="3.14"}
输出自定义的常量:{$Think.const.PI}
有时,实在不知道在模版中怎么进行编码时,可以采用{php}标签进行原生编码;
总结一下,目前使用原生PHP的方法有3种
1、不使用模板引擎,直接在控制器中require(),缺点是传参不规范
2、装模板引擎,使用engine(),只限制在一定区域内传参
3、使用{php}标签,部分区域使用原生代码
{php}
echo 123;
{/php}
要注意的是:原生编码就是PHP 编码,不能再使用模版引擎的特殊编码方式;比如{eq},{$user.name}这些标签语法均不支持;
标签之间,是支持嵌套功能的,比如从列表中找到“樱桃小丸子”;
{foreach $list as $key => $obj}
{eq name="obj->username" value="樱桃小丸子"}
<tr>
<td>{$key} : {$obj.id} 或 {$obj->id}</td>
<td>{$obj->username}</td>
<td>{$obj->gender}</td>
<td>{$obj->email}</td>
<td>{$obj->price}</td>
<td>{$obj->create_time}</td>
</tr>
{/eq}
{/foreach}