靜態(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’);
如果在類文件中調(diào)用念搬,應該加上設置:
this);
在一些塊調(diào)用中默認將使用當前類的成員函數(shù)抑堡。
$tpl->LoadTemplate(模板的物理路徑);
如果模板中帶有 {dede:config name=” value=”/}
可以在載入模板后,通過 name) 獲得這些變量的值朗徊。
顯示頁面或保存頁面為文件
tpl->SaveTo(物理絕對路徑的文件名);
二首妖、模板標記語法
1、標記通用特性
(1) 短標記
{dede:tagname.name/}
等同于
{dede:tagname name=” /}
(2) 塊標記
{dede:tagname}
循環(huán)代碼
{/dede:tagname}
2爷恳、標記的具體語法及對應的PHP代碼
(1) 配置變量
{dede:config name=” value=”/}
配置變量可以在載入模板后通過 name) 獲得有缆,僅作為配置,不在模板中顯示温亲。
(2) 短標記
{dede:global.name/} 外部變量 等同于 <?php echo _vars['name']; ?>
{dede:field.name/} field數(shù)組 等同于 <?php echo cfg_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 refObj, array
atts,
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’> {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’> <?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
}
}
?>