定界符
{% ... %}
{{ ... }}
代码
{% for item in list %}
<tr>
<td>{{ item.id }}</td>
<td>{{ item.username }}</td>
<td>{{ item.email }}</td>
<td>{{ item.statusAlias() }}</td>
<td>{{ item.created_at|date('Y-m-d') }}</td>
<td>
<a href="{{ url('admin/user/update', {'id': item.id }) }}">编辑</a>
<a class="pfinal-confirm" href="{{ url('admin/user/delete', {'id': item.id }) }}">删除</a>
</td>
</tr>
{% endfor %}
注释
{# 这是注释 #}
变量
1.id 为PHP赋值变量,则模板中可以使用 {{ id }}
2.arr 为PHP中数组,则模板中可以使用 {{ arr.id }} 或者 {{ arr['id'] }}
3.obj 为PHP赋值对象,则模板中可以使用 {{ obj. bar }}也可以直接调用类中的方法,如 {{ foo.getName }} 或当有参数传递
时使用 {{ foo.getName(p1, p2, p3) }}
注意:
当模版中使用{{ foo.bar }}时,PHP会做如下判断来检测对应变量的值:
检测foo是否是数组,并且bar是一个有效的KEY
如果foo为对象,则检测bar是否为有效的属性
如果foo为对象,但bar不是一个有效的属性,则检测bar是否为有效方法
如果foo为对象,但bar不是一个有效的方法,则检测getBar是否为有效方法
如果foo为对象,但getBar不是有效方法,则检测isBar是否为有效方法
如果没有,则返回null
变量赋值
1.{% set id=1 %}
2.{% set arr=[1,2,3] %}
3.{% set obj={'name':'san'} %}
数组遍历
-- 按数组value遍历:
{% for value in foo %}
{{ value }}
{% endfor %}
-- 按数组key遍历:
{% for key in foo|keys %}
{{ key }}
{% endfor %}
-- 按key,value遍历
{% for key, value in foo %}
{{ key}}:{{value }}
{% endfor %}
-- 如果 foo 非数组,还可以使用else语句,如:
{% for key, value in foo %}
{{ key}}:{{value }}
{% else %}
foo is Not a Array
{% endfor %}
条件语句
-- 需要使用 or 和 and 代替 ||、&&
{% if a == '1' or b == '2' %}
a = 1 or b = 2
{% endif %}
-- 判断变量是否定义
{% if var is not defined %}
{# do something #}
{% endif %}
-- 是否为NULL
{% if var is null %}
{# do something #}
{% endif %}
-- 是否为false
{% if var is sameas(false) %}
{# do something #}
{% endif %}
控制结构
判断语句
{% if aaa %}
xxx
{% elseif bb %}
yyy
{% else %}
zzz
循环语句
{% for %}
xxx
{% endfor %}
包含模板
{% include %}
模板继承
{% extends %}
定义代码块或覆盖代码块
{% block xxx %} 或 {% block %} xxx {% endblock %}
过滤器
过滤器用来修饰数据,各过滤器可以用竖线分隔进行链式调用,用括号传递参数,也可以将过滤器当成单独的函数来用,形式如下:
{% filter 过滤器名 %}
待处理的数据
{% endfilter %}
1.batch:将数组按指定的个数分割成更小的数组。如:
{{[1,2,3,4,5]|batch(2,'demo') }}
运行的结果:
[[1,2],[3,4],[5,'demo']]
2.date_modify: 修改时间, 常与date联用。如:
{{ ''|date_modify('+3 days')|date('Y-m-d') }}
显示后3天的时间
3.default: 当所修饰的数据不存在或为空时,提供默认值。如
{{ ''|default('没有数据') }}
4.escape: 将字符串安全地处理成合法的指定数据 默认的为html
5.first: 返回数组的第一个元素或字符串的第一个字符。如:
{{ {a:1,b:2,c:3}|first }}
结果为: 1
6.last: 返回数组的最后一个元素或字符串的最后一个字符.如:
{{ {a:1,b:2,c:3}|last }}
结果为: 3
7.replace: 替换一个字符串中的指定内容. 如
{{ '%s1 love %s2' |replace({'%s1':'dou','%s2':'demo'}) }}
结果为
dou love demo
PHP函数的过滤器
abs:取绝对值
nl2be:将字符串里的\n替换
join: 将数组的各个元素按指定分隔符组成字符串
sort: 对数组排序
trim: 去除字符串首尾的指定字符 默认为空格
date: 格式化时间,可处理与strtotime兼容的字符串
reverse: 反转一个数组或字符串
slice: 截取数组或字符串的一部分
keys: 将数组的全部键名提取成一个数组,等同于array_keys
merge:合并两数组,近似于array_merge。如{{ 数组1|merge(数组2)}}
length: 返回数组元素
的个数或字符串的长度,等同于count和s†rlen的结合体
capitalize: 将字符串的首字母大写,等同于 ucfirst
title: 将字符串中每个单词的首字母大写,等同于 ucwords
lower: 将字符串所有字母全部变成小写,等同于 strtolower
upper: 将字符串所有字母全部变成大写,等同于 strtoupper
split: 将字符串分割成数组,等同于urlencode
striptags: 去除字符串中的HTML/PHP标记,等同于strip_tags
url_encode: 编码连接字符串,等同于urlencode
json_encode: 编码JSON格式,等同于json_encode
macro标签
macro(宏标签)类似于其他语言中的函数,常用于填充html标签,比如用来渲染
{% macro input(name,value,type.size) %}
{% macro input(name, value, type, size) %}
<input type="{{ type|default('text') }}" name="{{ name }}" value="{{ value|e }}" size="{{ size|default(20) }}" />
{% endmacro %}
{% endmacro %}
macro与函数的不同之处在于:
参数的默认值是通过macro块内部的 default过滤器来定义的,参数总是可选的。另外,就跟php函数一样,macro内部是无法使用外部的变量的。但你可以传递一个特殊变量_context作为参数来获取整个内容。macro可以被定义在任何的模板内,但在你使用之前需要使用 imported
{#// 导入 forms.html 然后 取个别保叫做 forms #}
{% import "forms.html" as forms %} #}
{#// 然后就可以像下面那样使用了 #}
<p>{{ forms.input('username') }}</p>
<p>{{ forms.input('password', null, 'password') }}</p>
{#// 如果你要在定义macro的模板里使用,就不需要imported 可以使用特殊变量_self #}
<p>{{ _self.input('username') }}</p>
如果你要定义一个macro里 包含另一个macro,并且两个macro在同一个文件里,可以使用特殊变量_self
{% macro input(name, value, type, size) %}
<input type="{{ type|default('text') }}" name="{{ name }}" value="{{ value|e }}" size="{{ size|default(20) }}" />
{% endmacro %}
{% macro wrapped_input(name, value, type, size) %}
<div class="field">
{{ _self.input(name, value, type, size) }}
</div>
{% endmacro %}