volt 模板引擎介紹
簡介
Volt 是一個用C編寫的超快的并且對設(shè)計師友好的模板語言。基本用法
下面介紹一些基礎(chǔ)用法:開始與結(jié)束標記
Volt模板在不同的場景使用不同的開始和結(jié)束標記:變量(Variables)
變量有三種:字符變量、對象變量、數(shù)組變量過濾器(Filters)
輸出變量的時候可以通過為變量添加過濾器來過濾/格式化變量以下是Volt模板內(nèi)置的過濾器列表:
過濾器 | 描述 |
---|---|
trim | 刪除左右兩側(cè)多余的字符 |
left_trim | 刪除左側(cè)多余的字符 |
right_trim | 刪除右側(cè)多余的字符 |
striptags | 刪除變量中的html標記 |
slashes | 在字符串中的單引號(')、雙引號(")、反斜線()與 NUL字符前加上反斜線 |
stripslashes | 去除字符串中的轉(zhuǎn)義反斜線 |
capitalize | 將字符串中每個單詞的首字母轉(zhuǎn)換為大寫 |
lower | 將變量中的字符轉(zhuǎn)換為小寫 |
upper | 將變量中的字符轉(zhuǎn)換為大寫 |
length | 計算字符長度或數(shù)組與對象的數(shù)量 |
nl2br | 在字符串所有新行之前插入 HTML 換行標記 |
sort | 對數(shù)組進行排序并保持索引關(guān)系 |
keys | 返回數(shù)組的所有鍵值 |
join | 將一個數(shù)組分割為字符串 |
format | 把格式化的字符串寫入變量中(sprintf) |
json_encode | 對變量進行 JSON 編碼 |
json_decode | 對 JSON 格式的字符串進行解碼 |
abs | 取絕對值 |
url_encode | 編碼 URL 字符串 |
default | 為變量設(shè)置一個默認值(如果變量為空或未設(shè)置) |
convert_encoding | 轉(zhuǎn)換字符編碼 |
① 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編碼轉(zhuǎn)換為UTF-7?#} {{?"abasds"|convert_encoding("UTF-7",?"EUC-JP")?}}
注釋(Comments)
在{# 和 #} 之間的內(nèi)容在輸出的時候?qū)⒈缓雎?,只作為注釋?nèi)容在源碼中展示
在源碼中輸入以下內(nèi)容:
輸入: {#?這里是注釋?#}abcd
輸出:abcd
流程控制
① 循環(huán)語句for{%?endfor?%}
輸出:??Value:1? ?Value:2
③ for循環(huán)與else/elsefor連用(當data中的元素個數(shù)為0時,else/elsefor語句將被執(zhí)行)
用法示例:
{%?set?data?=?[]?%}
{%?for?name,value?in?data?%} ??Value:?{{?value?}} {%?else?%} 暫無內(nèi)容 {%?endfor?%}
{%?for?name,value?in?data?%} ??Value:?{{?value?}} {%?elsefor?%}暫無內(nèi)容 {%?endfor?%}
④ break
break語句用于跳出循環(huán)
用法示例:
輸入:
{%?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?%}
循環(huán)上下文(Loop Context)
循環(huán)上下文關(guān)鍵字 loop 在for循環(huán)中可用,使用它,你可以方便的進行一些判斷和計數(shù)操作。 我們可以把它看做是一個循環(huán)計數(shù)器,用它來記錄元素在當前循環(huán)中的位置。 loop中主要包含以下可用屬性:
變量 | 描述 |
---|---|
loop.index | 當前元素在從1開始計數(shù)的循環(huán)計數(shù)器中的位置 |
loop.index0 | 當前元素在從0開始計數(shù)的循環(huán)計數(shù)器中的位置 |
loop.revindex | 當前元素在逆向從1開始計數(shù)的循環(huán)計數(shù)器中的位置 |
loop.revindex0 | 當前元素在逆向從0開始計數(shù)的循環(huán)計數(shù)器中的位置 |
loop.first | 是否是循環(huán)中的第一個元素 |
loop.last | 是否是循環(huán)中的最后一個元素 |
loop.length | 循環(huán)中的元素個數(shù) |
用法示例:
① 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
② 如果表達式結(jié)果無需輸出顯示,則可以在前面加上do操作符
輸入:{%?do?(1?+?1)?*?2?%}
輸出:此時只會執(zhí)行表達式,不會有任何輸出
運算符
運算符主要包括算術(shù)運算符、比較運算符、邏輯運算符合其它運算符
算術(shù)運算符
操作符 | 作用 | 示例 |
---|---|---|
+ | 加法操作 | {{ a+b }} |
- | 減法操作 | {{ a-b }} |
* | 乘法操作 | {{ a*b }} |
/ | 除法操作 | {{ a/b }} |
% | 取余操作 | {{ a%b }} |
比較運算符
操作符 | 作用 |
---|---|
== | 等于(元素值相同) |
!= | 不等于 |
<> | 不等于 |
> | 大于 |
< | 小于 |
<= | 小于等于 |
>= | 大于等于 |
=== | 全等于(元素值和類型都相同) |
!== | 不全等于(元素值和類型至少有一樣不同) |
邏輯運算符
操作符 | 作用 |
---|---|
or | 或 |
and | 且 |
not | 非 |
(expr) | 表達式 |
其它運算符
操作符 | 作用 |
---|---|
~ | 連接兩個操作數(shù) |
| | 為最左側(cè)變量增加過濾器 |
.. | 創(chuàng)建一個包含指定范圍單元的數(shù)組 |
is | 等于 |
in | 檢查表達式是否包含在其他表達式中 |
is not | 不等于 |
a ? b : c | 三目運算 |
++ | 自增 |
-- | 自減 |
① ~
用法示例:
{#?連接兩個字符串并去除最右側(cè)的?'-'?字符??#} {%?set?prop?=?''?%} {%?set?property?=?['a','b','c']?%} {%?for?item?in?property?%} ????{%?set?prop?=?prop~item['val']~'-'?%} {%?endfor?%} {{?prop|right_trim('-')?}} {#?輸出:a-b-c??#}
② . .
用法示例:
{#?創(chuàng)建一個包含指定范圍單元的數(shù)組?#}
{%?for?index?in?0..2?%} ????{{?index?}} {%?endfor?%} {#?輸出:0?1?2??#}
③ a?b:c
用法示例:
{#?三目運算:a為真則執(zhí)行b否則執(zhí)行c?#} {%?set?a=true?%} {{?a???'true?'?:?'false?'?}} {%?set?a='2'?%} {{?a???'true?'?:?'false?'?}} {%?set?a=''?%} {{?a???'true?'?:?'false?'?}} {#?輸出:true?true?false?#}
函數(shù)
方法名 | 作用 |
---|---|
content | 將在此之前輸出的內(nèi)容包含進來 |
get_content | content方法的別名 |
partial | 在當前模板中動態(tài)調(diào)取一個代碼片段 |
super | 獲?。ㄤ秩荆└改0逯械膬?nèi)容 |
time | 返回當前的 Unix 時間戳 |
date | 格式化輸出一個本地時間/日期 |
dump | 輸出一個或多個表達式的結(jié)構(gòu)信息,包括表達式的類型與值。數(shù)組將遞歸展開值,通過縮進顯示其結(jié)構(gòu)。 |
① 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 | 檢查變量是否為空(未定義、空字符串、空數(shù)組、0、null、false等均認為為空) |
even | 檢查變量值是否是偶數(shù) |
odd | 檢查變量值是否是奇數(shù) |
numeric | 檢查變量值是否是數(shù)字 |
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?%}
五星網(wǎng)站內(nèi)置對象用法
UTCDateTime
五星網(wǎng)站中所有的時間類型字段存儲格式均為UTCDateTime對象類型
UTCDateTime對象主要包含以下幾個方法:
toDateTime
用法示例:
{{?value['addtime'].toDateTime().format('Y-m-d?H:i:s')?}}
?