程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> 網頁編程 >> PHP編程 >> 關於PHP編程 >> Twig 的 tags學習(中文) 之三 完結

Twig 的 tags學習(中文) 之三 完結

編輯:關於PHP編程

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的專欄

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved