PHPTAL模板引擎語法

chenwenxian發表於2019-02-16

PHPTAL模板引擎語法

PHP 資料

本文件的使用到的資料($talData)

//定義talData變數
$talData = array();

$talData[`title`] = `title1`;
$talData[`key`] = `key1`;
$talData[`href`] = `xxx.html`;
$talData[`html`] = `<h1>h1標題</h1>`;
$talData[`fun`] = function($key=``){
    return $key === `key1`? true : false;
};
//兩維陣列
$talData[`list1`] = array(
    array(`id`=>`1`, `title`=>`標題1`),
    array(`id`=>`2`, `title`=>`標題2`),
    array(`id`=>`3`, `title`=>`標題3`),
    array(`id`=>`4`, `title`=>`標題4`)
);
//輸出的資料結構
{"title":"title1","key":"key1","href":"xxx.html","html":"
h1u6807u9898</h1>","fun":{},"list1":[{"id":"1","title":"u6807u98981"},{"id":"2","title":"u6807u98982"},{"id":"3","title":"u6807u98983"},{"id":"4","title":"u6807u98984"}]}

屬性優先權

  • define 定義變數
  • condition
  • repeat
  • content or replacae
  • attributes 屬性
  • omit-tag

TAL有效空間

定義變數


定義全域性(global)變數title和區域性變數 key
<div tal:define="global title talData/title; key talData/key">
    ${title} && ${key}
</div>
${title} && ${key}
<!-- 結果 -->
<div>title1 && key1</div>
title1 && 
定義預設值變數
<div tal:define="global fname string:fname1 string; lname string:lname1 string;">
    ${fname} && ${lname}
</div>
${fname} && ${lname}
<!-- 結果 -->
<div>fname1 string && lname1 string</div>
fname1 string &&

TAL有效空間

定義變數


定義拼接變數
<p tal:define="global hello string:hello $fname welcome on this page">
    ${hello}
</p>
或
<p tal:define="global hello string:hello ${fname} welcome on this page">
    ${hello}
</p>
<!-- 結果 -->
<p>hello fname1 string welcome on this page</p>
定義變數,執行php方法
<p tal:define="global rand php: rand(1, 4)">
    ${rand}
</p>
<!-- 結果 -->
<p>2</p>

TAL有效空間

輸出內容


tal:replace=”資料” 將用值替代整個標籤,如果沒有賦值將替空
<tal:block>
    <p>渲染1</p>
</tal:block>
<tal:block tal:replace="">
不渲染這裡
</tal:block>
<tal:block tal:replace="talData/title">
    <p>不渲染這裡</p>
</tal:block>
<p>${talData/title}</p>
<!-- 結果 -->
<p>渲染1</p>
title1
<p>title1</p>
tal:content=”資料” 將會替代標籤內的內容
<p tal:content="talData/title">
    test data<span>tips</span>
</p>
<!-- 結果 -->
<p>title1</p>

TAL有效空間

輸出內容


${資料}
<p class="p p_${talData/title}">${talData/title}</p>
<!-- 結果 -->
<p class="p p_title1">title1</p>
tal:attributes 將會改變tag的屬性或值
<a href="http://www.foo.com" title="some foo link" tal:attributes="href talData/href; title talData/title" tal:content="talData/key">sample link</a>
<!-- 結果 -->
<a href="xxx.html" title="title1">key1</a>
tal:on-error=”string: 出錯時顯示內容” ;出錯時顯示error內容,並且沒有當前標籤;
<span tal:on-error="string: 當前資料不存在" tal:content="talData/key">key 已經是定義了</span>
<span tal:on-error="string: 當前資料不存在" tal:content="talData/ky">ky 沒有定義的</span>
<!-- 結果 -->
<span>key1</span>
當前資料不存在

TAL有效空間

判斷條件


tal:condition=”資料”,條件是true,標籤和它的內容就會被顯示
<p tal:condition="php: true" tal:content="talData/title">標題</p>
<p tal:condition="php: talData[`key`] == `key1`" tal:content="talData/key">關鍵詞</p>
<p tal:condition="php: key == `key1`" tal:define="key talData/key" tal:content="talData/key">關鍵詞</p>
<p tal:condition="talData/key" tal:content="talData/key">關鍵詞</p>
<p tal:condition="talData/fun" tal:content="talData/key">關鍵詞</p>
<!-- 結果 -->
<p>title1</p>
<p>key1</p>
<p>key1</p>
<p>key1</p>

TAL有效空間

迴圈


tal:repeat=”賦值變數 資料”;屬性迴圈它的元素和內容直到結束
<ul tal:repeat="item talData/list1">
    <li tal:condition="php: repeat.item.index == 0">
        repeat/item/key: ${repeat/item/key} ;(如果talData/list1是一組聯合物件,返回item的鍵)<br/>
        repeat/item/index: ${repeat/item/index} ;(返回索引號(0~count-1))<br/>
        repeat/item/number: ${repeat/item/number} ;(返回索引號(1~count))<br/>
        repeat/item/even: ${repeat/item/even} ;(如果是偶數,true)<br/>
        repeat/item/odd: ${repeat/item/odd} ;(如果是奇數,true)<br/>

        repeat/item/start: ${repeat/item/start} ;(如果是第一個元素,true)<br/>
        repeat/item/end: ${repeat/item/end} ;(如果是最後一個元素,true)<br/>
        repeat/item/length: ${repeat/item/length} ;(返回talData/list1裡面元素個數)<br/>
        -------------
    </li>
    <li tal:condition="php: repeat.item.index > 0" tal:content="item/title">列表li</li>
</ul>
<!-- 結果 -->
<li>
repeat/item/key: 0 ;(如果talData/list1是一組聯合物件,返回item的鍵)<br/>
repeat/item/index: 0 ;(返回索引號(0~count-1))<br/>
repeat/item/number: 1 ;(返回索引號(1~count))<br/>
repeat/item/even: 1 ;(如果是偶數,true)<br/>
repeat/item/odd: 0 ;(如果是奇數,true)<br/>
repeat/item/start: 1 ;(如果是第一個元素,true)<br/>
repeat/item/end: 0 ;(如果是最後一個元素,true)<br/>
repeat/item/length: 4 ;(返回talData/list1裡面元素個數)<br/>
</li>
<li>標題2</li>
<li>標題3</li>
<li>標題4</li>

TAL有效空間

標籤渲染與否


tal:omit-tag=”condition”;要求phptal解析時忽略實體的開關閉標籤,它的內容仍然會顯示.
<p tal:omit-tag="php: false">
    omit-tag值為真,不出現當前p標籤,否則就出現當前p標籤
</p>
<p tal:omit-tag="php: true">
    omit-tag值為真,不出現當前p標籤,否則就出現當前p標籤
</p>
<!-- 結果 -->
<p>omit-tag值為真,不出現當前p標籤,否則就出現當前p標籤</p>
omit-tag值為真,不出現當前p標籤,否則就出現當前p標籤
<tal:block>;代替標籤,標籤永遠不輸出
<tal:block tal:repeat="x php:range(1,10)" tal:content="x">文字會出現十次</tal:block>
<!-- 結果 -->
12345678910

METAL空間 支援巨集


metal:define-macro 定義巨集
<!-- 在pWeb/_macro/common.html檔案中程式碼 -->
<tal:block metal:define-macro="WinPageData">
    <script type="text/javascript">
        window.WinPageData = ${structure WinPageData};
    </script>
</tal:block>
metal:use-macro 呼叫巨集
<tal:block metal:use-macro="pWeb/_macro/common.html/WinPageData">
    當前內容會被巨集替換掉
    <script type="text/javascript">
        window.WinPageData = {};
    </script>
</tal:block>
<div metal:use-macro="${路徑變數}/macros.html/main_menu"></div>

METAL空間 支援巨集


metal:define-slot 定義巨集標籤替換
<!-- 在pWeb/_macro/mlog.html檔案中程式碼 -->
<tal:block metal:define-macro="mobile">
    <script>
        <metal:block define-slot="mlog_page">
        var mlog_page = `mobile_other`;
        </metal:block>
        var mlog_track = function(){};
    </script>
    <script src=`xxx.js`></script>
</tal:block>
metal:fill-slot 使用巨集標籤替換
<tal:block metal:use-macro="pWeb/_macro/mlog.html/mobile">
    <tal:block metal:fill-slot="mlog_page">
        var mlog_page = `mobile_index`;
    </tal:block>
</tal:block>

METAL空間 支援巨集


巨集獲取引數
<!-- 在pWeb/_macro/mlog.html檔案中程式碼 -->
<tal:block metal:define-macro="conent">
    <p>${title}</p>
    <p>${key}</p>
</tal:block>
巨集傳引數(tal:define)
<tal:block metal:use-macro="pWeb/_macro/mlog.html/conent"  tal:define="title `標題`; key `關鍵詞`"></tal:block>

phptal空間


phptal:debug
phptal:cache 使整個元素(包括標籤)儲存在磁碟而不重新解析直到cache失效,有效期的格式由數字和`d`, `h`,`m`或`s`組成.
<div class="footer" phptal:cache="3h">...</div>
有效期可以有選擇的跟隨`per`引數來定義多少個快取被共享,使用`per url`分別針對每個url複製元素.
<ol id="breadcrumbs" phptal:cache="1d per url">...</ol>

使用php:語法


如下所述同正規表示式,除了->被替換成.及變數不需要字首$,使用空格裝配由點分隔的字串.
php:htmlentities(foo)
php:`string ${varReplaced}`
php:`string ${some.path().to[0].var}`
php:foo.a.b.c(e).htmlentities(SomeClass::staticMethod())
php:SomeClass::ConstOfClass
php:SomeClass::$staticVar

使用not:、exists:語法


not:可以用於tal:condition中,相反判斷
<span tal:condition="not: logged">not logged</span>
<!-- 結果 -->
<span>not logged</span>
exists:可以用於tal:condition中,判斷存在
<span tal:condition="exists: talData/title" tal:content="talData/title">存在</span>
<!-- 結果 -->
<span>title1</span>

使用default、structure語法


default預設值;在 tal:define、tal:content、tal:attributes 使用
<span tal:define="myVar talData/title | default">
default my var value
</span>
<p tal:content="some/var | other/path | default">
沒有var,沒有找到path
</p>
<a href="unknown.html" title="Unknown page" tal:attributes="href item/href | default; title talData/title | default" tal:content="item/title | default">Unknown page</a>
<!-- 結果 -->
<p>沒有var,沒有找到path</p>
<a href="unknown.html" title="title1">Unknown page</a>

使用structure語法

允許將包括html/xml等變數輸出顯示;

注意存在XSS攻擊風險,謹慎使用


在tal:content中使用
<div tal:content="talData/html"></div>
<div tal:content="structure talData/html"></div>
<!-- 結果 -->
<div>&lt;h1&gt;h1標題&lt;/h1&gt;</div>
<div><h1>h1標題</h1></div>
在${}中使用
<div>${talData/html}</div>
<div>${structure talData/html}</div>
<!-- 結果 -->
<div>&lt;h1&gt;h1標題&lt;/h1&gt;</div>
<div><h1>h1標題</h1></div>

相關資料

相關文章