当前位置:首页文档模板语法volt 模板引擎介绍

volt 模板引擎介绍

更新时间:2019-12-10

简介

Volt 是一个用C编写的超快的并且对设计师友好的模板语言。
Volt 提供一组辅助工具有助于你以一种更简单的的方式编写页面模板。五星网站的页面及模板,都是基于volt模板引擎开发,它是网站页面模板构建的基础,熟练掌握模板引擎的语法结构,可以让你快速地构建自己的个性化网站。

基本用法

下面介绍一些基础用法:

开始与结束标记

Volt模板在不同的场景使用不同的开始和结束标记:
{% 和 %} 用于执行流程控制语句如if判断、for循环及赋值处理等
{{ 和 }} 用于在模板中输出变量、函数或表达式的执行结果。
{# 和 #} 用于输出注释内容

变量(Variables)

变量有三种:字符变量、对象变量、数组变量
字符变量赋值: {% set title = '我是标题' %}
访问字符变量:{{ title }}
对象变量赋值: {% set product = Object %}
通过foo.bar的形式访问变量属性: {{ product.name }}
 
数组的几种形式:
{# 创建简单数组 #}
{% set array = ['Apple', 1, 2.5, false, null] %}
{# 创建多维数组 #}
{% set array = [[1, 2], [3, 4], [5, 6]] %}
{# 创建关联数组 #}
{% set array = ['first': 1, 'second': 4/2, 'third': '3'] %}
通过foo['bar']的形式访问数组变量: {{ array[0] }}  {{ array['first'] }}

过滤器(Filters)

输出变量的时候可以通过为变量添加过滤器来过滤/格式化变量
操作符 | 用于为变量添加过滤器
{{ product.name|e }}
{{ product.name|striptags }}
{{ product.name|capitalize|trim }}

以下是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=' 小明 ' %} {{ name|trim }}
{# 传参数则为删除左右两侧参数中的字符串 #}

{% set name='aaa小明aaa' %} {{ name|trim('aaa') }}

输出:  小明 小明

② left_trim

输入: {% set name=' 小明 ' %} {{ name|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 }}
{% set data='小强' %} {{ data|length }}
{% set data='abcd' %} {{ 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
 
输入:
{% set data = ['one': 1, 'two': 2, 'three': 3] %}
{% for value in data %}     
Value: {{ value }}   
{% endfor %}
 
输出:
Value:1
Value:2
Value:3
 
输入:
{% for name, value in data %}    
 Name: {{ name }} 
Value: {{ value }}
{% endfor %}
 
输出:
Name: one Value:1
Name: two Value:2
Name: three Value:3
 
② for循环与if语句连用:
{% for name,value in data if value < 2 %}   
Value: {{ value }}

{% 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') }}