Twig模版語言入門

酷越發表於2015-04-15

轉自 :http://pengbotao.cn/twig-template-language.html

 

Twig中有兩種定界符{% ... %} 和 {{ ... }} , 前一種用來執行語句,比如for迴圈、IF判斷、過濾等操作,後一種模版中用來顯示變數。

Twig常用用法

可用符號

== != < > >= <= + - ~ * / // % ** | [] . .. and or not in is b-and b-or b-xor
部分符號的含義如下

~:連線兩字串,相當於 PHP 中的點號
//:整除
**:乘方,相當於 PHP 中的 ^
b-and、b-or、b-xor:按位與、按位或、按位異或
-:減法以及去除空白的簡寫用法,如 {{- 資料 }} => 去除左邊的空白、{{ 資料 -}} => 去除右邊的空白、{{- 資料 -}} => 去除兩邊的空白

註釋

{# 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. 如果沒有,則返回null

當foo為陣列時,模版也可以這樣使用:{{ foo['bar'] }}

變數未定義預設值設定:
{{ 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 過濾器裡失效

借用自PHP自帶函式的過濾器

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:根據字串載入模板

相關文章