詳解dede模板引擎中的標記

靜態(tài)模板類:

類文件
include/dedetag.class.php

這個文件是dedecms V5.3及之前版本使用的主要的模板類,它是解析式模板類,并非編譯式的(區(qū)別是前者通過獲得標簽位置進行內(nèi)容替換,后者是直接解析式PHP代碼,二次執(zhí)行)

一、模板語法
織夢模板引擎是一種使用XML名字空間形式的模板解析器,使用織夢解析器解析模板的最大好處是可以輕松的制定標記的屬性,感覺上就像在用HTML一樣,使模板代碼十分直觀靈活,新版的織夢模板引擎不單能實現(xiàn)模板的解析還能分析模板里錯誤的標記。

1、織夢模板引擎的代碼樣式有如下幾種形式:
{dede:標記名稱 屬性=’值’/}
{dede:標記名稱 屬性=’值’}{/dede:標記名稱}
{dede:標記名稱 屬性=’值’}自定義樣式模板(InnerText){/dede:標記名稱}

提示:
如果使用帶底層模板的標記,必須嚴格用{dede:標記名稱 屬性=’值’}{/dede:標記名稱} 這種格式,否則會報錯。

2、織夢模板引擎內(nèi)置有多個系統(tǒng)標記,這些系統(tǒng)標記在任何場合都是能直接使用的。

(1) global 標記,表示獲取一個外部變量,除了數(shù)據(jù)庫密碼之外,能調(diào)用系統(tǒng)的任何配置參數(shù),形式為:
{dede:global name=’變量名稱’}{/dede:global}

{dede:global name=’變量名稱’/}

其中變量名稱不能加 符號,如變量cfg_cmspath ,應(yīng)該寫成 {dede:global name=’cfg_cmspath’/} 。

(2) foreach 用來輸出一個數(shù)組,形式為:
{dede:foreach array=’數(shù)組名稱’}[field:key/] [field:value/]{/dede:foreach}

(3) include 引入一個文件,形式為:
{dede:include file=’文件名稱’ ismake=’是否為dede板塊模板(yes/no)’/}
對文件的搜索路徑為順序為:絕對路徑、include文件夾,CMS安裝目錄,CMS主模板目錄

3、織夢標記允許在任何標記中使用函數(shù)對得到的值進行處理,形式為:
{dede:標記名稱 屬性=’值’ function=’youfunction(“參數(shù)一”,”參數(shù)二”,”@me”)’/}
其中 @me 用于表示當前標記的值,其它參數(shù)由你的函數(shù)決定是否存在,例如:
{dede:field name=’pubdate’ function=’strftime(“%Y-%m-%d %H:%M:%S”,”@me”)’/}

4、織夢標記允許有限的編程擴展。
格式為:
{dede:tagname runphp=’yes’}
$aaa = @me;
@me = “123456″;
{/dede:tagname}
@me 表示這個標記本身的值,因此標記內(nèi)編程是不能使用echo之類的語句的,只能把所有返回值傳遞給@me。
此外由于程序代碼占用了底層模板InnerText的內(nèi)容,因此需編程的標記只能使用默認的InnerText。

動態(tài)模板類:
核心類文件
include/dedetemplate.class.php
用途:用于非核心模塊的動態(tài)頁面或列表頁的模板解析,如:member/content_list.php ,通常是在 datalistcp.class.php 中使用,這個類在動態(tài)運行的情況下,由于本身是把模板編譯成PHP的,因此性能上會優(yōu)級于舊的解析類,這個方法將在未來版本中作為通用的方式。

一、使用方法:

tpl = new DedeTemplate( 模板對象實例名稱,通常是’tpl’, [模板存放目錄(生成緩存時會存放在這個目錄), include語法默認引用目錄] ); 通常情況下參數(shù)二和參數(shù)三是不必要的,如:tpl = new DedeTemplate(‘tpl’);

如果在類文件中調(diào)用,應(yīng)該加上設(shè)置:
this->tpl->SetObject(this);
在一些塊調(diào)用中默認將使用當前類的成員函數(shù)。

$tpl->LoadTemplate(模板的物理路徑);

如果模板中帶有 {dede:config name=” value=”/}
可以在載入模板后,通過 tpl->GetConfig(name) 獲得這些變量的值。

顯示頁面或保存頁面為文件
tpl->Display();tpl->SaveTo(物理絕對路徑的文件名);

二、模板標記語法

1、標記通用特性
(1) 短標記
{dede:tagname.name/}
等同于
{dede:tagname name=” /}
(2) 塊標記
{dede:tagname}
循環(huán)代碼
{/dede:tagname}

2、標記的具體語法及對應(yīng)的PHP代碼
(1) 配置變量
{dede:config name=” value=”/}
配置變量可以在載入模板后通過 tpl->GetConfig(name) 獲得,僅作為配置,不在模板中顯示。

(2) 短標記

{dede:global.name/} 外部變量 等同于 <?php echo name; ?> {dede:var.name/} var數(shù)組 等同于 <?php echo_vars['name']; ?>
{dede:field.name/} field數(shù)組 等同于 <?php echo fields['name']; ?> {dede:cfg.name/} 系統(tǒng)配置變量 等同于 <?php echocfg_name; ?>

考慮到大多數(shù)情況下都會在函數(shù)或類中調(diào)用模板,因此 $_vars、$fields 數(shù)組必須聲明為 global 數(shù)組,否則模板引擎無法獲得它的值從而導致產(chǎn)生錯誤。

(3) 自由調(diào)用塊標記
{tag:blockname bind=’GetArcList’ bindtype=’class’}
循環(huán)代碼
{/tag:blockname}

必要屬性:
bind 數(shù)據(jù)源來源函數(shù)
bindtype 函數(shù)類型,默認是 class 可選為 sub
rstype 返回結(jié)果類型,默認是 array ,可選項為 string

自定義函數(shù)格式必須為 function(array atts,objectrefObj, array fields); 在沒有指定 bind 綁定的函數(shù)的情況下,默認指向 MakePublicTag(atts,tpl->refObj,fields) 統(tǒng)一管理,這個函數(shù)存放在 cls_dede_tplinc.php 。

(4) 固定塊標記

[1] datalist
從綁定類成員函數(shù)GetArcList中獲取數(shù)組并輸出
{dede:datalist}
循環(huán)代碼
{/dede:datalist}
遍歷一個二給維數(shù)組,數(shù)據(jù)源是固定的,只適用用類調(diào)用。
等同于
{tag:blockname bind=’GetArcList’ bindtype=’class’ rstype=’arrayu’}
循環(huán)代碼
{/tag:blockname}

[2] label
從綁定函數(shù)中獲取字符串值并輸出
等同于 {tag:blockname bind=’func’ bindtype=’sub’ rstype=’string’/}

[3] pagelist

從綁定類成員函數(shù)GetPageList中獲取字符串值并輸出
等同于 {tag:blockname bind=’GetPageList’ bindtype=’class’ rstype=’string’/}

(5) include 語法
{dede:include file=”/}
{dede:include filename=”/}

(6) php 代碼塊
{dede:php
php 代碼
/}

{dede:php}
php代碼
{/dede:php}

(7) if 條件
僅支持 if ,else ,else 直接用{else}表示,但不支持{else if}這樣的語法 ,一般建議模板中不要使用太復雜的條件語法,如果確實有需要,可以直接使用 php 語法。

{dede:if 條件} a-block {else} b-block {/dede:if}

條件中允許使用 var.name 、 global.name 、 field.name、cfg.name 表示相應(yīng)的變量。

如:
{dede:if field.id>10 }
{/dede:if}

(8) 遍歷一個 array 數(shù)組

{dede:array.name}
{dede:key/} = {dede:value/}
{/dede:array}

各種語法的具體編譯后的代碼,可查看 dede-template-class.php 的 function CompilerOneTag(&$cTag)。

塊調(diào)用示例代碼:
1、示例一

{tag:datalist timeformat=”"}
  <tr>
    <td class=’col1′>
      <div>?<a href=’{tag:field.arcurl/}’>{tag:field.title/}</a></div>
      <!–div class=’descriptions’>&nbsp;&nbsp;&nbsp;&nbsp;{tag:field.description function=”CnSubstr(@me,150)”/}…</div–>
    </td>
    <td class=’col2′>{tag:field.formattime/}</td>
  </tr>
{/tag:datalist}

編譯后的代碼

<?php
$atts = array();
$atts['tagname'] = ‘datalist’;
$atts['timeformat'] = ”;
$blockValue = $this->refObj->GetArcList($atts,$this->refObj,$fields);
foreach( $blockValue as $key=>$fields )
{
?>
  <tr>
    <td class=’col1′>
      <div>?<a href=’<?php echo $fields['arcurl']; ?>’><?php echo $fields['title']; ?></a></div>
      <!–div class=’descriptions’>&nbsp;&nbsp;&nbsp;&nbsp;<?php echo CnSubstr($fields['description'],150); ?>…</div–>
    </td>
    <td class=’col2′><?php echo $fields['formattime']; ?></td>
  </tr>
<?php
}
?>

2、示例二

{tag:article sort=’new’ titlelen=’36′ row=’10′}
   <dd>[{tag:field.typename/}]<a href=”{tag:field.arcurl/}”>{tag:field.title function=”CnSubstr(@me,24)”/}</a></dd>
{/tag:article}

編譯后的代碼

<?php
$atts = array();
$atts['tagname'] = ‘a(chǎn)rticle’;
$atts['sort'] = ‘new’;
$atts['titlelen'] = ’36′;
$atts['row'] = ’10′;
$blockValue = MakePublicTag($atts,$this->refObj,$fields);
if(is_array($blockValue) && count($blockValue) > 0){
foreach( $blockValue as $key=>$fields )
{
?>
   <dd>[<?php echo $fields['typename']; ?>]<a href=”<?php echo $fields['arcurl']; ?>”><?php echo CnSubstr($fields['title'],24); ?></a></dd>
<?php
}
}
?>
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容