Twig 是個 簡單而強力的模板,因為在學習sf 所以看看她。
本文來源http://twig.sensiolabs.org/doc/tags/index.html
目前支持的tags包括
for if macro filter set extends block include import from use spaceless autoescape raw flush do
twig在html分為3種
{{...}} 直接輸出其中的變量
{#...#} 注釋標簽
{%...%} 命令標簽,就是我們要學習的這些
for標簽
這個最簡單,就是循環。
基於數組的循環
<h1>Members</h1>
<ul>
{% for user in users %}
<li>{{ user.username|e }}</li>
{% endfor %}
</ul>
<h1>Members</h1>
<ul>
{% for user in users %}
<li>{{ user.username|e }}</li>
{% endfor %}
</ul>
基於數字的循環,特別要注意,這裡會輸出0-10 也就是11個數字。
{% for i in 0..10 %}
* {{ i }}
{% endfor %}
{% for i in 0..10 %}
* {{ i }}
{% endfor %}
基於字母的循環
{% for letter in 'a'..'z' %}
* {{ letter }}
{% endfor %}
{% for letter in 'a'..'z' %}
* {{ letter }}
{% endfor %}
在循環體內部的變量
loop.length, loop.revindex, loop.revindex0,loop.last 這幾個值只有在被循環的是 php數組 或實現了Countable 接口的類,才有效。
添加一個條件
跟PHP不一樣,在循環內部不支持break和continue語句,你只能通過過濾器去跳過一些循環,就像這樣
<ul>
{% for user in users if user.active %}
<li>{{ user.username|e }}</li>
{% endfor %}
</ul>
<ul>
{% for user in users if user.active %}
<li>{{ user.username|e }}</li>
{% endfor %}
</ul>
else 分支
如果 users是個空數組就會輸出no user found 。
<ul>
{% for user in users %}
<li>{{ user.username}}</li>
{% else %}
<li><em>no user found</em></li>
{% endfor %}
</ul>
<ul>
{% for user in users %}
<li>{{ user.username}}</li>
{% else %}
<li><em>no user found</em></li>
{% endfor %}
</ul>
按keys循環
<h1>Members</h1>
<ul>
{% for key in users|keys %}
<li>{{ key }}</li>
{% endfor %}
</ul>
<h1>Members</h1>
<ul>
{% for key in users|keys %}
<li>{{ key }}</li>
{% endfor %}
</ul>
按keys, values循環
<h1>Members</h1>
<ul>
{% for key, user in users %}
<li>{{ key }}: {{ user.username|e }}</li>
{% endfor %}
</ul>
<h1>Members</h1>
<ul>
{% for key, user in users %}
<li>{{ key }}: {{ user.username|e }}</li>
{% endfor %}
</ul>
if標簽
這個不用多說,直接看例子{% if users %}
<ul>
{% for user in users %}
<li>{{ user.username|e }}</li>
{% endfor %}
</ul>
{% endif %}
{% if kenny.sick %}
Kenny is sick.
{% elseif kenny.dead %}
You killed Kenny! You bastard!!!
{% else %}
Kenny looks okay --- so far
{% endif %}
{% if users %}
<ul>
{% for user in users %}
<li>{{ user.username|e }}</li>
{% endfor %}
</ul>
{% endif %}
{% if kenny.sick %}
Kenny is sick.
{% elseif kenny.dead %}
You killed Kenny! You bastard!!!
{% else %}
Kenny looks okay --- so far
{% endif %}
macro標簽
macro(宏標簽)類似於其他語言中的函數,常用於填充html標簽,以下是一個例子,用來渲染<input>
{% macro input(name, value, type, size) %}
<input type="{{ type|default('text') }}" name="{{ name }}" value="{{ value|e }}" size="{{ size|default(20) }}" />
{% endmacro %}
{% macro input(name, value, type, size) %}
<input type="{{ type|default('text') }}" name="{{ name }}" value="{{ value|e }}" size="{{ size|default(20) }}" />
{% endmacro %}
macro與函數的不同之處在於:
1、參數的默認值是通過macro塊內部的 default過濾器來定義的。
2、參數總是可選的。
另外,就跟php函數一樣,macro內部是無法使用外部的變量的。但你可以傳遞一個特殊變量_context作為參數來獲取整個內容。
macro可以被定義在任何的模板內,但在你使用之前需要使用 imported
{% import "forms.html" as forms %}
{% import "forms.html" as forms %}然後就可以這樣使用了
<p>{{ forms.input('username') }}</p>
<p>{{ forms.input('password', null, 'password') }}</p>
<p>{{ forms.input('username') }}</p>
<p>{{ forms.input('password', null, 'password') }}</p>如果你要在定義macro的模板裡使用,就不需要imported 可以使用特殊變量_self
<p>{{ _self.input('username') }}</p>
<p>{{ _self.input('username') }}</p>
如果你要定義一個macro裡 包含另一個macro,並且兩個macro在同一個文件裡,可以使用特殊變量_self
{% macro input(name, value, type, size) %}
<input type="{{ type|default('text') }}" name="{{ name }}" value="{{ value|e }}" size="{{ size|default(20) }}" />
{% endmacro %}
{% macro wrapped_input(name, value, type, size) %}
<div class="field">
{{ _self.input(name, value, type, size) }}
</div>
{% endmacro %}
{% macro input(name, value, type, size) %}
<input type="{{ type|default('text') }}" name="{{ name }}" value="{{ value|e }}" size="{{ size|default(20) }}" />
{% endmacro %}
{% macro wrapped_input(name, value, type, size) %}
<div class="field">
{{ _self.input(name, value, type, size) }}
</div>
{% endmacro %}
如果兩個macro在不同的文件裡,你需要使用import
{# forms.html #}
{% macro input(name, value, type, size) %}
<input type="{{ type|default('text') }}" name="{{ name }}" value="{{ value|e }}" size="{{ size|default(20) }}" />
{% endmacro %}
{# shortcuts.html #}
{% macro wrapped_input(name, value, type, size) %}
{% import "forms.html" as forms %}
<div class="field">
{{ forms.input(name, value, type, size) }}
</div>
{% endmacro %}
{# forms.html #}
{% macro input(name, value, type, size) %}
<input type="{{ type|default('text') }}" name="{{ name }}" value="{{ value|e }}" size="{{ size|default(20) }}" />
{% endmacro %}
{# shortcuts.html #}
{% macro wrapped_input(name, value, type, size) %}
{% import "forms.html" as forms %}
<div class="field">
{{ forms.input(name, value, type, size) }}
</div>
{% endmacro %}
filter標簽
就是給整個區塊使用過濾器
{% filter upper %}
This text becomes uppercase
{% endfilter %}
{% filter upper %}
This text becomes uppercase
{% endfilter %}
{% filter lower|escape %}
<strong>SOME TEXT</strong>
{% endfilter %}
摘自 jiaochangyun的專欄