DEDECMS靜態範本類別檔案是什麼?
靜態模板類別文件織夢模板引擎是一種使用XML名字空間形式的模板解析器
推薦學習:織夢cms
使用織夢解析器解析模板的最大好處是可以輕鬆的製定標記的屬性,感覺上就像在用HTML一樣,使模板代碼十分直觀靈活,新版的織夢模板引擎不單能實現模板的解析還能分析模板裡錯誤的標記。
include/dedetag.class.php這個檔案是dedecms V5.3及之前版本使用的主要的模板類,它是解析式模板類,並非編譯式的(區別是前者通過獲得標籤位置進行內容替換,後者是直接解析式PHP程式碼,二次執行)
一、模板語法
1、織夢模板引擎的程式碼樣式有下列幾種形式:
{dede:標記名稱屬性='值'/}
#{dede:標記名稱屬性='值'}{/dede:標記名稱}
{dede:標記名稱屬性='值'}自訂樣式範本(InnerText){/dede:標記名稱}
#提示:
如果使用底層範本的標記,必須嚴格使用{dede:標記名稱屬性='值'}{/dede:標記名稱} 這種格式,否則會報錯。
2、織夢模板引擎內建有多個系統標記,這些系統標記在任何場合都是能直接使用的。
(1) global 標記,表示取得一個外部變量,除了資料庫密碼之外,能呼叫系統的任何設定參數,形式為:
{dede:global name='變數名稱'}{/dede:global}
或
##{dede:global name='變數名稱'/} 其中變數名稱不能加$ 符號,如變數$ cfg_cmspath ,應該寫成{dede:global name='cfg_cmspath'/} 。 (2) foreach 用來輸出一個數組,形式為: {dede:foreach array='數組名稱'}[field:key/] [field:value/]{/ dede:foreach} (3) include 引入一個文件,形式為: {dede:include file='文件名稱' ismake='是否為dede板塊模板(yes/no) '/} 對檔案的搜尋路徑為順序為:絕對路徑、include資料夾,CMS安裝目錄,CMS主模板目錄 3、織夢標記允許在任何標記中使用函數對所得到的值進行處理,形式為: {dede:標記名稱屬性='值' function='youfunction("參數一","參數二","@me")' /} 其中@me 用來表示目前標記的值,其它參數由你的函數決定是否存在,例如: {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 表示這個標記本身的值,因此標記內程式設計是不能使用echo之類的語句的,只能把所有回傳值傳遞給@me。 此外由於程式碼佔用了底層模板InnerText的內容,因此需編程的標記只能使用預設的InnerText。 二、解析方式 在dedetag.class.php 裡面有四個類別 class DedeAttribute 屬性結構表述 #class DedeAttributeParse 屬性解析器 class DedeTag 標籤結構表述 class DedeTagParse 標籤解析器 使用解析類別解析模板時一般經過下面的步驟 1、初始化: $dtp = new DedeTagParse(); 2、載入範本/範本字串: $dtp->LoadTemplate(範本檔案(絕對路徑)); / /會產生緩存,第二次不需解析模板 或 $dtp->LoadSource(字串); 3、給標籤賦值
foreach($dtp->CTags as $tid=>$ctag) { //判斷ctag的名稱和屬性,並給予不同的值,通常用函數處理
if($ctag->GetName=='mytag') $dtp->Assign($tid, mytagvalue($ctag) ); } 在上面範例中,直接把名稱為mytag的標籤轉交給mytagvalue 函數處理,mytagvalue 裡判斷$ctag的各個屬性,回傳不同內容即可。 在V5.3版本中,通常除了field、list等專用標籤之外,凡arc.*開頭的類別解析的文件,標籤都是對應該include/taglib 的源碼的,這個由系統進行了自動的映射。 4、顯示或儲存為HTML $dtp->display(); 或 $dtp->SaveTo(靜態文件名);
对于二次开发人员而言,不大需要知道dedecms模板具体解析方式,不过应该十分清楚CTag这个类的结构,从而判断标签不同属性进行处理。
代码如下:
class DedeTag { var $IsReplace=FALSE; //标记是否已被替代,供解析器使用 var $TagName=""; //标记名称 var $InnerText=""; //标记之间的文本 var $StartPos=0; //标记起始位置 var $EndPos=0; //标记结束位置 var $CAttribute=""; //标记属性描述,即是class DedeAttribute var $TagValue=""; //标记的值 var $TagID = 0; //获取标记的名称和值 function GetName() { return strtolower($this->TagName); } function GetValue() { return $this->TagValue; } //下面两个成员函数仅是为了兼容旧版 function GetTagName() { return strtolower($this->TagName); } function GetTagValue() { return $this->TagValue; } //获取标记的指定属性 function IsAttribute($str) { return $this->CAttribute->IsAttribute($str); } function GetAttribute($str) { return $this->CAttribute->GetAtt($str); } function GetAtt($str) { return $this->CAttribute->GetAtt($str); } function GetInnerText() { return $this->InnerText; } }
以上是DEDECMS靜態範本類別檔案是什麼的詳細內容。更多資訊請關注PHP中文網其他相關文章!