use標簽
use標簽是1.1版本新添加內容。
這個use標簽主要是來解決模板只能從一個父模板繼承,而你又想重用其他模板的問題。但是use標簽只會導入block區塊,
(注意import只會導入宏macros,include會導入一切。這三個標簽要區分清楚)
比如 {% extends "base.html" %}
{% use "blocks.html" %}
{% block title %}{% endblock %}
{% block content %}{% endblock %}
{% extends "base.html" %}
{% use "blocks.html" %}
{% block title %}{% endblock %}
{% block content %}{% endblock %}而blocks.html的內容是
# blocks.html
{% block sidebar %}{% endblock %}
# blocks.html
{% block sidebar %}{% endblock %}我們從blocks..html導入了 block sidebar
運行的結果幾乎等於
{% extends "base.html" %}
{% block sidebar %}{% endblock %}
{% block title %}{% endblock %}
{% block content %}{% endblock %}
{% extends "base.html" %}
{% block sidebar %}{% endblock %}
{% block title %}{% endblock %}
{% block content %}{% endblock %}
要注意,被use標簽導入的模板(上例中的block.html),不能再繼承別的模板,不能定義宏macros。但它可以再use其他模板。
另外use標簽後面的文件名,不能是一個表達式。
當被導入了的block和主模板的block重名了,模板引擎會自動忽略被use標簽導入block。
為了避免這種情況。你可以在使用use標簽的時候,給block重命名
{% extends "base.html" %}
{% use "blocks.html" with sidebar as base_sidebar %}
{% block sidebar %}{% endblock %}
{% block title %}{% endblock %}
{% block content %}{% endblock %}
{% extends "base.html" %}
{% use "blocks.html" with sidebar as base_sidebar %}
{% block sidebar %}{% endblock %}
{% block title %}{% endblock %}
{% block content %}{% endblock %}
1.3版本新支持了 parent()函數,(這個特別重要)
parent()函數,會自動的搞定block的繼承樹,如果你在主模板裡覆蓋了use標簽引入進來的block塊,而用parent()函數則可以調用被覆蓋的那個block內容
{% extends "base.html" %}
{% use "blocks.html" %}
{% block sidebar %}
{{ parent() }}
{% endblock %}
{% block title %}{% endblock %}
{% block content %}{% endblock %}
{% extends "base.html" %}
{% use "blocks.html" %}
{% block sidebar %}
{{ parent() }}
{% endblock %}
{% block title %}{% endblock %}
{% block content %}{% endblock %}
注意,parent()的內容 其實是blocks.html裡的block sidebar的內容。因為繼承樹是 base.html->blocks.html->本模板
如果你在use標簽裡給導入的block重命名了,那就可以使用block函數,來代替上面代碼中的parent函數所達到的效果
{% extends "base.html" %}
{% use "blocks.html" with sidebar as parent_sidebar %}
{% block sidebar %}
{{ block('parent_sidebar') }}
{% endblock %}
{% extends "base.html" %}
{% use "blocks.html" with sidebar as parent_sidebar %}
{% block sidebar %}
{{ block('parent_sidebar') }}
{% endblock %}
你可以使用任意數量的use標簽,如果多個use標簽裡的block名字存在重復,那麼最後use的那個有效。
spacelsee標簽
會刪除html標簽之間的空白
{% spaceless %}
<div>
<strong>foo</strong>
</div>
{% endspaceless %}
{# output will be <div><strong>foo</strong></div> #}
{% spaceless %}
<div>
<strong>foo</strong>
</div>
{% endspaceless %}
{# output will be <div><strong>foo</strong></div> #}
autoescape標簽
這個十分汗顏,我居然沒看懂。我只知道字面上的意思是自動轉義。。但是。。我做實驗的時候 還是不知道應怎麼使用
他官方給的例子是
{% autoescape true %}
Everything will be automatically escaped in this block
{% endautoescape %}
{% autoescape false %}
Everything will be outputed as is in this block
{% endautoescape %}
{% autoescape true js %}
Everything will be automatically escaped in this block
using the js escaping strategy
{% endautoescape %}
{% autoescape true %}
Everything will be automatically escaped in this block
{% endautoescape %}
{% autoescape false %}
Everything will be outputed as is in this block
{% endautoescape %}
{% autoescape true js %}
Everything will be automatically escaped in this block
using the js escaping strategy
{% endautoescape %}
而我這麼測試。輸出的還是原本的內容。
{% autoescape true %}
<body><b>aaaa</b></body>
{% endautoescape %}
{% autoescape false %}
<b>aaaa</b>
{% endautoescape %}
{% autoescape true js %}
<script>
function aaa(){alert('x');}
</script>
{% endautoescape %}
{% autoescape true %}
<body><b>aaaa</b></body>
{% endautoescape %}
{% autoescape false %}
<b>aaaa</b>
{% endautoescape %}
{% autoescape true js %}
<script>
function aaa(){alert('x');}
</script>
{% endautoescape %}
這個請教各位路過的師兄了。。。
他官方文檔還說,如果使用了 {% autoescape true %} 那麼裡面的內容都會被轉義成安全的內容,除非你使用raw過濾器。
{% autoescape true %}
{{ safe_value|raw }}
{% endautoescape %}
{% autoescape true %}
{{ safe_value|raw }}
{% endautoescape %}
另外,twig裡函數的返回值都是安全的比如 macros parent
raw標簽
raw標簽,保證區塊內的數據不被模板引擎解析。{% raw %}
<ul>
{% for item in seq %}
<li>{{ item }}</li>
{% endfor %}
</ul>
{% endraw %}
{% raw %}
<ul>
{% for item in seq %}
<li>{{ item }}</li>
{% endfor %}
</ul>
{% endraw %}
flush標簽
1.5版本新增內容
告訴模板,刷新輸出緩存,在內部其實是調用了php的flush函數
{% flush %}
{% flush %}
do 標簽
1.5版本新增內容
do 標簽的作用就像是輸出標簽一樣{{ }},他可以計算一些表達式,區別是不打印出任何東西
{% do 1 + 2 %}
{% do 1 + 2 %}
標簽的學習到此結束了。掌聲鼓勵下。。。。。下面進入過濾器的學習。。。。。。呱唧呱唧
摘自 jiaochangyun的專欄