詳解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 访诱,應該寫成 {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)用念搬,應該加上設置:
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爷恳、標記的具體語法及對應的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 表示相應的變量。

如:
{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)系作者
  • 序言:七十年代末浑此,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子滞详,更是在濱河造成了極大的恐慌凛俱,老刑警劉巖,帶你破解...
    沈念sama閱讀 219,110評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件料饥,死亡現(xiàn)場離奇詭異蒲犬,居然都是意外死亡,警方通過查閱死者的電腦和手機岸啡,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,443評論 3 395
  • 文/潘曉璐 我一進店門原叮,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人凰狞,你說我怎么就攤上這事篇裁。” “怎么了赡若?”我有些...
    開封第一講書人閱讀 165,474評論 0 356
  • 文/不壞的土叔 我叫張陵达布,是天一觀的道長。 經(jīng)常有香客問我逾冬,道長黍聂,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,881評論 1 295
  • 正文 為了忘掉前任身腻,我火速辦了婚禮产还,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘嘀趟。我一直安慰自己脐区,他們只是感情好,可當我...
    茶點故事閱讀 67,902評論 6 392
  • 文/花漫 我一把揭開白布她按。 她就那樣靜靜地躺著牛隅,像睡著了一般炕柔。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上媒佣,一...
    開封第一講書人閱讀 51,698評論 1 305
  • 那天匕累,我揣著相機與錄音,去河邊找鬼默伍。 笑死欢嘿,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的也糊。 我是一名探鬼主播炼蹦,決...
    沈念sama閱讀 40,418評論 3 419
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼显设!你這毒婦竟也來了框弛?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,332評論 0 276
  • 序言:老撾萬榮一對情侶失蹤捕捂,失蹤者是張志新(化名)和其女友劉穎瑟枫,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體指攒,經(jīng)...
    沈念sama閱讀 45,796評論 1 316
  • 正文 獨居荒郊野嶺守林人離奇死亡慷妙,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,968評論 3 337
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了允悦。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片膝擂。...
    茶點故事閱讀 40,110評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖隙弛,靈堂內(nèi)的尸體忽然破棺而出架馋,到底是詐尸還是另有隱情,我是刑警寧澤全闷,帶...
    沈念sama閱讀 35,792評論 5 346
  • 正文 年R本政府宣布叉寂,位于F島的核電站,受9級特大地震影響总珠,放射性物質(zhì)發(fā)生泄漏屏鳍。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,455評論 3 331
  • 文/蒙蒙 一局服、第九天 我趴在偏房一處隱蔽的房頂上張望钓瞭。 院中可真熱鬧,春花似錦淫奔、人聲如沸山涡。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,003評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽鸭丛。三九已至霍殴,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間系吩,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,130評論 1 272
  • 我被黑心中介騙來泰國打工妒蔚, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留穿挨,地道東北人。 一個月前我還...
    沈念sama閱讀 48,348評論 3 373
  • 正文 我出身青樓肴盏,卻偏偏與公主長得像科盛,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子菜皂,可洞房花燭夜當晚...
    茶點故事閱讀 45,047評論 2 355

推薦閱讀更多精彩內(nèi)容