很多朋友對 Discuz! X 的模板都很感興趣,特別是 Discuz! X 獨有的模板機制,相信大家都非常希望能夠看懂它。下面我講解一下我經常用到的模板語法,希望大家看完之後對 Discuz! X 的模板有一個詳細的瞭解。

首先我們要向大家介紹的是 Discuz! X 的模板解析流程。
Discuz! X 模板的模組化很強,具有相同功能的模組基本上都已經統一管理了。所有的模板檔案都是放置在./template 目錄下,並且基本上都是在./source/module 下的模組處理檔案中被引入的。
一個模板檔案在引入之前,通常會透過./source/module 下的相應模組處理程式,模板所要顯示的資料,之後才會引入他要顯示的模板檔案,在程式檔案中是這樣引入模板的:

  1. include template('forum/forumdisplay');

下面我就以 discuz 比較典型的論壇首頁作為講解,為大家剖析一下這個模板的顯示流程:

論壇首頁是透過./source/module/forum_index.php 中的 includetemplate('diy:forum/discuz:'.$gid); 引入的。

下面我們就來詳細的看一看 template 是怎麼神奇把 dz 的模板檔案解析成我們前臺看到的 html 檔案的,我們找到函式的核心檔案 function_core.php,在那裡我們能看到 template 函式,這段程式碼很長,我就不再這裡黏貼了。

這個函式的主要作用就是對傳入的模板檔案進行條件判斷,並檢查是否更新快取檔案。至於具體的作用,你可以自己去看,我這裡就不做詳解了。

下面我們主要關注的是./source/ class /class_template.php 這個類檔案。我們的模板檔案都是被他解析,然後寫入快取的。我們前臺顯示的也都是他解析過後的快取檔案。

這裡我只介紹幾中比較常用的模板語法,和大家共同學習一下。

1.

  1. <!--{subtemplate common/header}-->

discuz 的如果檔案模板中,我們通常都會看到形如這樣的載入頭部檔案的方式。以前不太瞭解 discuz 模板機制的時候,也經常搞不清楚<!--{subtemplate }--> <!--{templater}-->,後來看了看程式才明白。<!--{subtemplate }--> 後面的模板檔案通常都是被包含在其他模板檔案中的子體。這樣在解析模板的時候,程式就會判斷<!--{subtemplate }--> 所引入的模板會被再一次解析一遍然後再和入口模板拼合,組成一個完整的模板。也就是說,如果我們新增的模板是在別的模板中被呼叫的話我們需要以<!--{subtemplate 模板名稱}--> 的方式引入進來。

2

  1. <!--{ad/headerbanner/wpa_h}-->

論壇上也經常碰到有人問這個標籤的含義,這裡我就告訴一下大家,這個標籤的意思是廣告。我們後臺新增的廣告都是顯示在這個標籤被解析後的程式碼中。 ad 代表廣告標籤 headerbanner 為此廣告的識別符號。 Wp a_h 為插入 html 後此廣告的樣式。

3.

  1. <!--{if $_G['uid']}--><!--{/if}-->

Discuz X 的判斷標籤,如果條件成立,那麼包括在這個標籤中的 html 程式碼將會被顯示。示例中如果使用者的 uid 存在的話。這裡面的程式碼就會被顯示,如果為遊客沒有 uid, 那麼對應的裡面的 html 程式碼將不會再頁面中顯示出來,即使解析出來,也不會被顯示。

而且 if 後面的判斷條件也可以用表示式的計算結果作為值,進行判斷。比如

  1. <!--{if !empty($_G['cache']['heats']['message'])}-->,<!--{ifempty($gid) && $announcements}-->

這個標籤的算是模板中最常用的標籤了,他同樣支援形如我們 php 中常用的 if(){}else{}, 或者 if(){}elseif(判斷條件){}else{}. 他們對應的標籤 discuz 標籤分別為:<!--{if 判斷條件程式碼}--> 顯示的 html<!--{else}--> 若果條件不成立顯示的程式碼<!--{/if}--> 和<!--{if 判斷條件程式碼}--> 顯示的 html<!--{elseif 判斷條件程式碼}--> 若果條件不成立顯示的程式碼<!--{else}--> 顯示的程式碼<!--{/if}-->

4.

  1. <!--{loop $catlist $key$cat}-->

迴圈標籤,這是一個使用頻率很高的標籤,他會實現 php foreach 的函式效果, 對一組陣列資料進行迴圈輸出。如果你在 php 中組裝好了一個要用到的陣列,那麼 loop 將是您最佳的顯示標籤。

5.

  1. <!--{eval $forum=$forumlist[$forumid];}-->

eval 開始的標籤,將直接將後面的程式碼作為 php 執行語句原樣輸出。

一般我們常用的標籤就這幾種。其他的話一般都不太常用。如果你有興趣可以自己去研究一下./source/ class /class_template.php中的解析函式:function
parse_template();
這裡麵包含了所有的標籤,並且是如何被解析的。有興趣的同學可以研究一下。