轉自 :http://pengbotao.cn/twig-template-language.htmlphp
Twig中有兩種定界符{% ... %} 和 {{ ... }} , 前一種用來執行語句,好比for循環、IF判斷、過濾等操做,後一種模版中用來顯示變量。css
Twig經常使用用法html
== != < > >= <= + - ~ * / // % ** | [] . .. and or not in is b-and b-or b-xor
部分符號的含義以下json
~:鏈接兩字符串,至關於 PHP 中的點號
//:整除
**:乘方,至關於 PHP 中的 ^
b-and、b-or、b-xor:按位與、按位或、按位異或
-:減法以及去除空白的簡寫用法,如 {{- 數據 }} => 去除左邊的空白、{{ 數據 -}} => 去除右邊的空白、{{- 數據 -}} => 去除兩邊的空白api
{# This is Twig Comment #}數組
foo 爲PHP賦值變量, 則模版中可使用 {{ foo }}
若是該變量爲數組或者對象,則可使用 {{ foo.bar }}來表示,也能夠直接調用類中的方法,如 {{ foo.getName }} 或當有參數傳遞時使用 {{ foo.getName(p1, p2, p3) }}安全
當模版中使用{{ foo.bar }}時,PHP會作以下判斷來檢測對應變量的值:
1. 檢測foo是不是數組,而且bar是一個有效的KEY
2. 若是foo爲對象,則檢測bar是否爲有效的屬性
3. 若是foo爲對象,但bar不是一個有效的屬性,則檢測bar是否爲有效方法
4. 若是foo爲對象,但bar不是一個有效的方法,則檢測getBar是否爲有效方法
5. 若是foo爲對象,但getBar不是有效方法,則檢測isBar是否爲有效方法
6. 若是沒有,則返回nullless
當foo爲數組時,模版也能夠這樣使用:{{ foo['bar'] }}dom
變量未定義默認值設置:
{{ var|default('var is not defined') }}函數
可以使用 {% set 變量名=變量值 %} 聲明變量,也可寫成 {% set 變量名 %} 變量值 {% endset %}
PHP 中非關聯數組被映射成 [元素1, 元素2, ...],關聯數組則被映射成 {鍵1: 值1, 鍵2: 值2, ...}
-- 按數組value遍歷:
1
2
3
|
{%
for
value in foo %}
{{ value }}
{%
endfor
%}
|
-- 按數組key遍歷:
1
2
3
|
{%
for
key in foo|keys %}
{{ key }}
{%
endfor
%}
|
-- 按key,value遍歷
1
2
3
|
{%
for
key, value in foo %}
{{ key}}:{{value }}
{%
endfor
%}
|
-- 若是 foo 非數組,還可使用else語句,如:
1
2
3
4
5
|
{%
for
key, value in foo %}
{{ key}}:{{value }}
{%
else
%}
foo is Not a Array
{%
endfor
%}
|
-- 也能夠直接帶條件,遍歷二維數組時比較有用,可用value.field來判斷:
1
2
3
|
{%
for
key, value in foo
if
value == 1%}
{{ key}}:{{value }}
{%
endfor
%}
|
循環體內部變量:
loop.index 循環的次數(從1開始)
loop.index0 循環的次數(從0開始)
loop.revindex 循環剩餘次數(最小值爲1)
loop.revindex0 循環剩餘次數(最小值爲0)
loop.first 當第一次循環的時候返回true
loop.last 當最後一次循環的時候返回true
loop.length 循環的總數
loop.parent 被循環的數組
-- 須要使用 or 和 and 代替 ||、&&
1
2
3
|
{%
if
a ==
'1'
or
b ==
'2'
%}
a = 1
or
b = 2
{%
endif
%}
|
-- 判斷變量是否認義
1
2
3
|
{%
if
var
is not defined %}
{#
do
something #}
{%
endif
%}
|
-- 是否爲NULL
1
2
3
|
{%
if
var
is null %}
{#
do
something #}
{%
endif
%}
|
-- 是否爲false
1
2
3
|
{%
if
var
is sameas(false) %}
{#
do
something %}
{%
endif
%}
|
1
2
3
4
5
6
7
8
9
|
{{
'{{'
}}
{% raw %}
<ul>
{%
for
item in seq %}
<li>{{ item }}</li>
{%
endfor
%}
</ul>
{% endraw %}
|
{% if aaa %} xxx {% elseif bbb %} yyy {% else %} zzz:判斷語句
{% for %} xxx {% endfor %}:迭代變量
{% do %}:沒什麼其餘含義,{% do 1+2 %} 等同於 {{ 1+2 }}
{% flush %}:刷新輸出緩衝,等同於 flush
{% include %}:包含模板
{% extends %}:擴展模板
{% embed %} xxx {% endembed %}:包含模板並擴展該模板的內容,至關於 include 和 extends 的結合體
{% use %}:包含模板,近似於多重繼承
{% from aaa import bbb as ccc %}:從指定模板導入宏並設置別名
{% macro %} xxx {% endmacro %}:定義宏以便屢次調用,與定義 PHP 函數無異
{% sandbox %} {% include xxx %} {% endsandbox %}:對導入的模板指定沙箱模式,只對 include 語句有效,只在沙箱模式已開啓的狀況下生效
{% block xxx %} 或 {% block %} xxx {% endblock %}:定義代碼塊或覆蓋代碼塊
{% set xxx %} 或 {% set %} xxx {% endset %}:在模板內定義變量
{% filter %} xxx {% endfilter %}:多行過濾器
{% spaceless %} xxx {% endspaceless %}:去除 HTML 片斷中的空格
{% autoescape %} xxx {% endautoescape %}:將字符串安全地處理成合法的指定數據
{% verbatim %} xxx {% endverbatim %}:阻止模板引擎的編譯,是 raw 的新名字
過濾器用來修飾數據,各過濾器能夠用豎線分隔進行鏈式調用,用括號傳遞參數
也能夠將過濾器當成單獨的函數來用,形式以下:
1
2
3
|
{% filter 過濾器名 %}
待處理的數據
{% endfilter %}
|
batch:將數組按指定的個數分割成更小的數組,可選的第二個參數用來在元素不夠的狀況下進行填充。如 {{ [1, 2, 3, 4, 5]|batch(2, 'NoItem') }} => [[1, 2], [3, 4], [5, 'NoItem']]
date_modify:修改時間,常與 date 聯用。如 {{ ''|date_modify('+3 days')|date('Y-m-d') }} => 將當前時間加3天后顯示
default:當所修飾的數據不存在或爲空時,提供默認值。如 {{ ''|default('Ruchee') }} => 'Ruchee'
escape:將字符串安全地處理成合法的指定數據,可簡寫爲 e,支持多種轉換模式,默認模式爲 html,其餘可選模式有 html_attr、js、css、url
first:返回數組的第一個元素或字符串的第一個字符。如 {{ {a: 1, b: 2, c: 3}|first }} => 1
last:返回數組的最後一個元素或字符串的最後一個字符。如 {{ {a: 1, b: 2, c: 3}|last }} => 3
replace:替換一個字符串中的指定內容。如 {{ '%s1 love %s2'|replace({'%s1': 'Ruchee', '%s2': 'Vim'}) }} => 'Ruchee love Vim'
raw:讓數據在 autoescape 過濾器裏失效
abs:取絕對值
nl2br:將字符串裏的 \n 替換成 <br/>
join:將數組的各個元素按指定分隔符組成字符串
sort:對數組排序
trim:去除字符串首尾的指定字符,默認爲空格
date:格式化時間,可處理與 strtotime 兼容的字符串,或 DateTime/DateInterval 的實例,可選的第二個參數用於指定時區,若是所修飾的數據爲空則默認爲當前時間
reverse:反轉一個數組或字符串,在 array_reverse 的基礎上增長了對字符串的處理
slice:截取數組或字符串的一部分,在 array_slice 的基礎上增長了對字符串的處理
keys:將數組的所有鍵名提取成一個數組,等同於 array_keys
merge:合併兩數組,近似於 array_merge 。如 {{ 數組1|merge(數組2) }}
length:返回數組元素的個數或字符串的長度,等同於 count 和 strlen 的結合體
capitalize:將字符串的首字母大寫,等同於 ucfirst
title:將字符串中每一個單詞的首字母大寫,等同於 ucwords
lower:將字符串全部字母所有變成小寫,等同於 strtolower
upper:將字符串全部字母所有變成大寫,等同於 strtoupper
split:將字符串分割成數組,等同於 str_split
striptags:去除字符串中的 HTML/PHP 標記,等同於 strip_tags
url_encode:編碼連接字符串,等同於 urlencode
json_encode:編碼 JSON 格式,等同於 json_encode
format:格式化一個字符串,近似於 printf 。如 {{ 'My name is %s, and I love %s'|format('Ruchee', 'Vim') }} => 'My name is Ruchee, and I love Vim'
number_format:格式化數值,等同於 number_format
convert_encoding:編碼轉換,第一個參數指定轉換後的編碼,第二個參數指定轉換前的編碼,近似於 iconv
even:是否爲偶數
odd:是否爲奇數
empty:是否爲空
null:是否爲 null
defined:是否已定義
sameas:目標變量與指定值是否指向的是內存中的同一個地址,使用形式 if 變量值 is sameas(指定值)
divisibleby:目標數值是否可以被指定值整除,使用形式 if 目標數值 divisibleby(指定值),其中指定值不能爲 0
iterable:目標變量是不是數組或者是否可迭代,使用形式 if 變量值 is iterable
attribute:動態獲取變量屬性值,兩種使用形式爲 attribute(數組, '元素名') 和 attribute(對象, '方法名', 可選參數)
block:重複引用指定代碼塊,如 {{ block('title') }}
constant:從字符串或對象取得常量值
cycle:循環顯示一個數組的元素,調用形式爲 cycle(數組, 一個循環變量)
date:格式化時間
dump:在開啓調試模式的狀況下顯示詳細的變量信息,等同於 var_dump
include:包含其餘模板文件
parent:在覆蓋代碼片斷時用於引用父片斷的內容
random:製造一個隨機數
range:返回一個指定區間的數組,可指定步長,Twig 使用 .. 做爲其簡用法,等同於 range
template_from_string:根據字符串加載模板