很多朋友對 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();
這裏麪包含了所有的標籤,並且是如何被解析的。有興趣的同學可以研究一下。