掌握了如何安裝Twig模版引擎以後,接下來就要學習Twig的語法和語義,而後建立Twig模版。而本文的將花費較大的篇幅來介紹模板引擎的語法和語義,這對於模版設計師將會是很是有用的參考。因爲本文的原文篇幅較長,因此就分紅兩部分進行翻譯。本文爲第一部分。php
1. 概要html
模板是一個簡單的文本文件。它能夠生成任何基於文本的格式(HTML、XML、CSV等)。它不具備特定擴展名,html或xml都OK。 模板中包含的變量或表達式,用來控制模板的邏輯。當模版被預處理時,它們會被替換爲變量值。git
下面是說明了一些基本要素的最小模板。稍後咱們將介紹更多細節:github
<!DOCTYPE html> <html> <head> <title>My Webpage</title> </head> <body> <ul id="navigation"> {% for item in navigation %} <li><a href="{{ item.href }}">{{ item.caption }}</a></li> {% endfor %} </ul> <h1>My Webpage</h1> {{ a_variable }} </body> </html>
Twig有兩種類型的分隔符:{%...%} 和 {{...}} 。第一個是用於執行諸如for循環的控制語句,後者則在模板中打印一個表達式的結果。web
2. IDEs 集成vim
許多IDE支持Twig語法高亮和自動完成標籤: api
※ TextMate 經過 Twig Bundle數組
※ Vim 經過 Jinja syntax 插件 或 vim-twig 插件 ide
※ NetBeans 經過 Twig syntax 插件(7.2+) 函數
※ PhpStorm(原生2.1+)
※ Eclipse 經過 Twig plugin
※ Sublime 經過 Twig bundle
※ GtkSourceView 經過 Twig language definition
※ Coda and SubEthaEdit 經過 Twig syntax mode
※ Coda 2 經過 other Twig syntax mode
※ Komodo and Komodo Edit 經過 Twig highlight/syntax check mode
※ Notepad++ 經過 Notepad++ Twig Highlighter
※ Emacs 經過 web-mode.el
3. 變量
應用程序將變量傳遞到操做的模板中。你也能夠訪問變量的屬性或元素。一個變量的可視化表示在很大程度上依賴於應用程序提供的值。你可使用點(.)或所謂的下標語法([])來訪問變量的屬性(PHP對象的方法或屬性,PHP數組的元素)。
{{ foo.bar }} {{ foo['bar'] }}
當屬性中包含特殊字符(如 - 這會被解釋爲減號操做符),使用attribute()函數來替代使用點(.)訪問變量屬性:
{# equivalent to the non-working foo.data-foo #} {{ attribute(foo, 'data-foo') }}
重要提示:要知道,大括號不是變量的一部分,print語句除外。當訪問標籤內的變量,不要把大括號加在變量上。
若是一個變量或屬性不存在,strict_variables選項設置爲false時,您將收到一個空值;另外,若是strict_variables設置爲true,Twig將會拋出一個錯誤(參照見 environment options)
變量調用機制
爲了方便起見,在PHP表現層調用foo.bar時,會進行如下操做:
a.1 檢查foo是不是個數組,並檢查bar是不是有效的元素
a.2 若是不是,foo是個對象,並檢查bar是不是有效的屬性
a.3 若是不是,foo是個對象,並檢查bar是不是有效方法。(即便bar是一個構造器。那麼請使用__construct()方法替代
a.4 若是不是,foo是個對象,會檢查getBar()是不是有效的方法
a.5 若是不是,foo是個對象,會檢查isBar()是不是有效的方法
a.6 若是不是,返回空值(null)
a.7 檢查foo是一個數組和bar是一個有效的元素;
a.8 若是沒有,則返回null值。
提示:若是你想訪問一個變量的動態屬性,使用attribute()函數來代替。
4. 全局變量
下面的變量在模板中老是可用:
_self: 引用當前模版;
_context: 引用當前的上下文;
_charset: 引用當前的字符集。
5. 設置變量
您能夠將值賦給內部代碼塊中的變量。賦值使用 set 標籤:
{% set foo = 'foo' %} {% set foo = [1, 2] %} {% set foo = {'foo': 'bar'} %}
6. 過濾器
變量能夠經過過濾器進行修改。過濾器和變量之間使用管道符號(也就是豎線 | )分隔開,過濾器括號中可能有可選的參數。多個過濾器能夠串連使用,濾波器的輸出會被應用於下一個過濾器。
下面的示例是從名稱中刪除全部的HTML標籤並應用title-cases格式化:
{{ name|striptags|title }}
過濾器接受括號中的參數。 這個例子將用逗號鏈接一個列表:
{{ list|join(', ') }}
要對一段代碼應用過濾器,只要使用 filter 標籤把它包起來:
{% filter upper %} This text becomes uppercase {% endfilter %}
訪問 Filters 頁面,以瞭解更多關於內置過濾器。
7. 函數
函數能夠被調用來生成內容。函數是經過它們的[函數名+()]進行調用的,可能還帶有參數。
例如,range()函數返回一個包含一個整數等差數列的列表:
{% for i in range(0, 3) %} {{ i }}, {% endfor %}
訪問 Functions 頁面,以瞭解更多關於內置函數。
8. 命名參數
1.12版本新特性:對命名參數的支持被添加到Twig 1.12版。
{% for i in range(low=1, high=10, step=2) %} {{ i }}, {% endfor %}
使用命名參數,讓你的模板更明確的瞭解,您做爲參數傳遞的值的含義:
{{ data|convert_encoding('UTF-8', 'iso-2022-jp') }} {# versus (對比) #} {{ data|convert_encoding(from='iso-2022-jp', to='UTF-8') }}
命名參數還容許您跳過一些你不但願更改默認值的參數:
{# the first argument is the date format, which defaults to the global date format if null is passed #} {{ "now"|date(null, "Europe/Paris") }} {# or skip the format value by using a named argument for the time zone #} {{ "now"|date(timezone="Europe/Paris") }}
您也能夠在一個調用中使用佔位參數和命名參數,在這種狀況下,佔位參數必須在命名參數以前:
{{ "now"|date('d/m/Y H:i', timezone="Europe/Paris") }}
提示:每一個函數和過濾器的文檔頁面,都有一段內容,列出它們支持的全部參數名稱。
9. 控制結構
控制結構指的是全部這些控制程序流程的代碼:條件語句(如:if/elseif/else)、for循環以及相似的代碼塊。控制結構出如今{%...%}塊內。
例如,要顯示一個由變量(users)提供的用戶列表,使用 for 標籤:
<h1>Members</h1> <ul> {% for user in users %} <li>{{ user.username|e }}</li> {% endfor %} </ul>
if 標籤能夠用於測試表達式:
{% if users|length > 0 %} <ul> {% for user in users %} <li>{{ user.username|e }}</li> {% endfor %} </ul> {% endif %}
訪問 tags 頁面,以瞭解更多關於內置標籤。
10. 註釋
要在模板中註釋掉一部分,使用註釋語法{#...#}。這對於調試或添加信息給其餘模板設計者或本身看會頗有用:
{# note: disabled template because we no longer use this {% for user in users %} ... {% endfor %} #}
11. 包含其餘模板
包含一個模板時,include標籤頗有用,它會返回該模板(子模版)的內容呈現到當前模版(父模版):
{% include 'sidebar.html' %}
默認狀況下每一個被包含的模板都會傳遞當前上下文(context)。傳遞給父模板的上下文,還包括在子模板中定義的變量:
{% for box in boxes %} {% include "render_box.html" %} {% endfor %}
被包含的模板 render_box.html 可以訪問變量 box。
模板的文件名取決於模板加載器。例如,Twig_Loader_Filesystem 容許你經過給文件名來訪問其餘模板。您能夠訪問以斜線分隔的子目錄中的模板:
{% include "sections/articles/sidebar.html" %}
此行爲取決於應用程序中嵌入Twig。