volt 模板引擎介绍
简介
Volt 是一个用C编写的超快的并且对设计师友好的模板语言。基本用法
下面介绍一些基础用法:开始与结束标记
Volt模板在不同的场景使用不同的开始和结束标记:变量(Variables)
变量有三种:字符变量、对象变量、数组变量过滤器(Filters)
输出变量的时候可以通过为变量添加过滤器来过滤/格式化变量以下是Volt模板内置的过滤器列表:
过滤器 | 描述 |
---|---|
trim | 删除左右两侧多余的字符 |
left_trim | 删除左侧多余的字符 |
right_trim | 删除右侧多余的字符 |
striptags | 删除变量中的html标记 |
slashes | 在字符串中的单引号(')、双引号(")、反斜线()与 NUL字符前加上反斜线 |
stripslashes | 去除字符串中的转义反斜线 |
capitalize | 将字符串中每个单词的首字母转换为大写 |
lower | 将变量中的字符转换为小写 |
upper | 将变量中的字符转换为大写 |
length | 计算字符长度或数组与对象的数量 |
nl2br | 在字符串所有新行之前插入 HTML 换行标记 |
sort | 对数组进行排序并保持索引关系 |
keys | 返回数组的所有键值 |
join | 将一个数组分割为字符串 |
format | 把格式化的字符串写入变量中(sprintf) |
json_encode | 对变量进行 JSON 编码 |
json_decode | 对 JSON 格式的字符串进行解码 |
abs | 取绝对值 |
url_encode | 编码 URL 字符串 |
default | 为变量设置一个默认值(如果变量为空或未设置) |
convert_encoding | 转换字符编码 |
① trim
输入:{% set name='aaa小明aaa' %} {{ name|trim('aaa') }}
输出: 小明 小明
② left_trim
③ right_trim
输入:{% set name=' 小明 ' %} {{ name|right_trim }} ④ striptags
输入:{% set name='小明' %} {{ name|striptags }}
输出:小明
⑤ slashes
输入:{% set name='"小明"' %} {{ name|slashes }}
输出:"小明"
⑥ capitalize
输入:{% set name='my name' %} {{ name|capitalize }}
输出:My Name
⑦ lower
输入: {% set name='MY Name' %} {{ name|lower }}
输出: my name
⑧ upper
输入:{% set name='my name 你好' %} {{ name|upper }}
输出:MY NAME 你好
⑨ length
{% set data=['小明','小红','小强'] %} {{ data|length }}
输出:3 2 4
⑩ nl2br
输入:{% set name='a b c' %} {{ name|nl2br }}
输出:a b c
⑪ sort
输入:{% set data=['a':3,'b':1,'c':2] %} {% set data=data|sort %} {{ dump(data) }}
输出:array(3) { ["b"]=> int(1) ["c"]=> int(2) ["a"]=> int(3) }
⑫ keys
输入:{% set data=['a':3,'b':1,'c':2] %} {% set data=data|keys %} {{ dump(data) }}
输出:array(3) { [0]=> string(1) "a" [1]=> string(1) "b" [2]=> string(1) "c" }
⑬ join
输入:{% set data=['a':3,'b':1,'c':2] %} {{ data|join(",") }}
输出:3,1,2
⑭ format
输入:{% set myname='xiaoming' %} {{ "My real name is %s"|format(myname) }}
输出:My real name is xiaoming
⑮ json_encode
用法示例:{% set encoded = data|json_encode %}
⑯ json_decode
用法示例:{% set decoded = '{"one":1,"two":2,"three":3}'|json_decode %}
⑰ abs
用法示例:
输入:{% set a = 2 %} {{ a|abs }} {% set a = -3 %} {{ a|abs }}
输出:2 3
⑱ url_encode
用法示例:
输入:{% set url = 'http://www.baidu.com' %} {{ url|url_encode }}
输出:http%3A%2F%2Fwww.baidu.com
⑲ default
用法示例:
输入:{% set name = '小红' %} {{ name|default('小明') }} {% set name = '' %} {{ name|default('小明') }}
输出:小红 小明
⑳ convert_encoding
用法示例: {# 从EUC-JP编码转换为UTF-7 #} {{ "abasds"|convert_encoding("UTF-7", "EUC-JP") }}
注释(Comments)
在{# 和 #} 之间的内容在输出的时候将被忽略,只作为注释内容在源码中展示
在源码中输入以下内容:
输入: {# 这里是注释 #}abcd
输出:abcd
流程控制
① 循环语句for{% endfor %}
输出: Value:1 Value:2
③ for循环与else/elsefor连用(当data中的元素个数为0时,else/elsefor语句将被执行)
用法示例:
{% set data = [] %}
{% for name,value in data %} Value: {{ value }} {% else %} 暂无内容 {% endfor %}
{% for name,value in data %} Value: {{ value }} {% elsefor %}暂无内容 {% endfor %}
④ break
break语句用于跳出循环
用法示例:
输入:
{% set data = ['one': 1, 'two': 2, 'three': 3] %} {% for name,value in data %} {% if name == 'two' %} {% break %} {% endif %} {{ value }} {% endfor %}
输出: 1
条件判断语句if
① if...else
{# 判断data变量是否为非空 #}
{% if data is not empty %} ... {% else %}
{% break %}
{% endif %}
② if
{# 判断index的值是否等于7 #} {% if index is 7 %} {% break %} {% endif %}
循环上下文(Loop Context)
循环上下文关键字 loop 在for循环中可用,使用它,你可以方便的进行一些判断和计数操作。 我们可以把它看做是一个循环计数器,用它来记录元素在当前循环中的位置。 loop中主要包含以下可用属性:
变量 | 描述 |
---|---|
loop.index | 当前元素在从1开始计数的循环计数器中的位置 |
loop.index0 | 当前元素在从0开始计数的循环计数器中的位置 |
loop.revindex | 当前元素在逆向从1开始计数的循环计数器中的位置 |
loop.revindex0 | 当前元素在逆向从0开始计数的循环计数器中的位置 |
loop.first | 是否是循环中的第一个元素 |
loop.last | 是否是循环中的最后一个元素 |
loop.length | 循环中的元素个数 |
用法示例:
① loop.index
输入:
{% set data= ['a','b','c'] %} {% for value in data %} {{ loop.index }} {% endfor %} {% for value in data %} {{ loop.index0 }} {% endfor %} {% for value in data %} {{ loop.revindex }} {% endfor %} {% for value in data %} {{ loop.revindex0 }} {% endfor %}
输出
1 2 3 0 1 2 3 2 1 2 1 0 {% set data = [['id':0,'name':'a'],['id':1,'name':'b'],['id':2,'name':'c']] %} {% for value in data %} {% if loop.first %} #IdName
{% endif %} {{ loop.index }}
{{ value['id'] }}
{{ value['name'] }}
{% if loop.last %} {% endif %} {% endfor %}
表达式(Expressions)
① volt模板引擎提供表达式支持,包括文字和常见操作符
输入: {{ (1 + 1) * 2 }}
输出:4
② 如果表达式结果无需输出显示,则可以在前面加上do操作符
输入:{% do (1 + 1) * 2 %}
输出:此时只会执行表达式,不会有任何输出
运算符
运算符主要包括算术运算符、比较运算符、逻辑运算符合其它运算符
算术运算符
操作符 | 作用 | 示例 |
---|---|---|
+ | 加法操作 | {{ a+b }} |
- | 减法操作 | {{ a-b }} |
* | 乘法操作 | {{ a*b }} |
/ | 除法操作 | {{ a/b }} |
% | 取余操作 | {{ a%b }} |
比较运算符
操作符 | 作用 |
---|---|
== | 等于(元素值相同) |
!= | 不等于 |
<> | 不等于 |
> | 大于 |
< | 小于 |
<= | 小于等于 |
>= | 大于等于 |
=== | 全等于(元素值和类型都相同) |
!== | 不全等于(元素值和类型至少有一样不同) |
逻辑运算符
操作符 | 作用 |
---|---|
or | 或 |
and | 且 |
not | 非 |
(expr) | 表达式 |
其它运算符
操作符 | 作用 |
---|---|
~ | 连接两个操作数 |
| | 为最左侧变量增加过滤器 |
.. | 创建一个包含指定范围单元的数组 |
is | 等于 |
in | 检查表达式是否包含在其他表达式中 |
is not | 不等于 |
a ? b : c | 三目运算 |
++ | 自增 |
-- | 自减 |
① ~
用法示例:
{# 连接两个字符串并去除最右侧的 '-' 字符 #} {% set prop = '' %} {% set property = ['a','b','c'] %} {% for item in property %} {% set prop = prop~item['val']~'-' %} {% endfor %} {{ prop|right_trim('-') }} {# 输出:a-b-c #}
② . .
用法示例:
{# 创建一个包含指定范围单元的数组 #}
{% for index in 0..2 %} {{ index }} {% endfor %} {# 输出:0 1 2 #}
③ a?b:c
用法示例:
{# 三目运算:a为真则执行b否则执行c #} {% set a=true %} {{ a ? 'true ' : 'false ' }} {% set a='2' %} {{ a ? 'true ' : 'false ' }} {% set a='' %} {{ a ? 'true ' : 'false ' }} {# 输出:true true false #}
函数
方法名 | 作用 |
---|---|
content | 将在此之前输出的内容包含进来 |
get_content | content方法的别名 |
partial | 在当前模板中动态调取一个代码片段 |
super | 获取(渲染)父模板中的内容 |
time | 返回当前的 Unix 时间戳 |
date | 格式化输出一个本地时间/日期 |
dump | 输出一个或多个表达式的结构信息,包括表达式的类型与值。数组将递归展开值,通过缩进显示其结构。 |
① super
用法示例:
{# main.volt #} Title
{% block content %}Table of contents{% endblock %} {# layout.volt #} {% extends "main.volt" %} {% block content %} {{ super() }} contents 2
{% endblock %}
渲染后输出: Title Table of contents contents 2
time
② time
用法示例: {% set now = time() %}
③ date
用法示例: {{ date('Y年m月d日 H:i:s',1496222729) }} {# 输出:2017年5月31日 17:25:29 #}
dump
④ dump
用法示例:
{% set data = ['one': 1, 'two': 2, 'three': 3] %}
{{ dump(data) }}
{# 输出:array(3) { ["one"]=> int(1) ["two"]=> int(2) ["three"]=> int(3) } #}
校验方法
方法名 | 作用 |
---|---|
defined | 检查变量是否被定义 |
empty | 检查变量是否为空(未定义、空字符串、空数组、0、null、false等均认为为空) |
even | 检查变量值是否是偶数 |
odd | 检查变量值是否是奇数 |
numeric | 检查变量值是否是数字 |
scalar | 检测变量是否是一个标量(标量变量是指那些包含了 integer、float、string 或 boolean的变量,而 array、object 和 resource 则不是标量。) |
iterable | 检查变量值是否可被迭代生成 |
divisibleby | 检查变量值是否可被整除 |
sameas | 检查变量值是否相同 |
type | 检查变量值是否是给定类型 |
① defined
用法示例:
{% if name is defined %}
The name variable is defined
{% endif %}
② empty
用法示例:
{% if name is empty %}
The name is null or isn't defined
{% endif %}
③ even
用法示例:
{% for key, name in ['Voltron', 'Astroy Boy', 'Bender'] %} {% if key is even %} {{ name }} {% endif %} {% endfor %}
④ odd
用法示例:
{% for key, name in ['Voltron', 'Astroy Boy', 'Bender'] %} {% if key is odd %} {{ name }} {% endif %} {% endfor %}
⑤ numeric
用法示例:
{% for key, name in ['Voltron', 'Astroy Boy', 'third': 'Bender'] %} {% if key is numeric %} {{ name }} {% endif %} {% endfor %}
⑥ scalar
用法示例:
输入:
{% set data = 'a' %} {% if data is scalar %} {{ 'True' }} {% endif %} {% set data = ['a','b'] %} {% if data is not scalar %} {{ 'True' }} {% endif %}
输出:True True
⑦ iterable
用法示例:
{% set data = [1: 'Voltron', 2: 'Astroy Boy'] %} {% if data is iterable %} {% for value in data %} {{ value }} {% endfor %} {% endif %}
⑧ divisibleby
用法示例:
{% set data = 10 %} {% if data is divisibleby(5) %} 10 can divisible by 5 {% endif %}
⑨ sameas
用法示例:
{% set world = "hello" %} {% if world is sameas("hello") %} {{ "it's hello" }} {% endif %}
⑩ type
用法示例:
{% set external = false %} {% if external is type('boolean') %} {{ "external is false or true" }} {% endif %}
五星网站内置对象用法
UTCDateTime
五星网站中所有的时间类型字段存储格式均为UTCDateTime对象类型
UTCDateTime对象主要包含以下几个方法:
toDateTime
用法示例:
{{ value['addtime'].toDateTime().format('Y-m-d H:i:s') }}