Discuz開發 Discuz! X 模板開發中的一些基本語法分析

[復制鏈接]
427156
ARCHY明星會員實名認證 發表于 2015-5-27 17:13:53 [Discuz開發] 只看該作者 |閱讀模式 上一主題 下一主題

馬上注冊,一起探討正確快速的建站方法

您需要 登錄 才可以下載或查看,沒有帳號?快速注冊

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

首先我們要向大家介紹的是Discuz! X的模板解析流程。

Discuz! X模板的模塊化很強,具有相同功能的模塊基本上都已經統一管理了。所有的模板文件都是放置在./template目錄下,并且基本上都是在./source/module下的模塊處理文件中被引入的。

一個模板文件在引入之前,通常會通過./source/module下的相應模塊處理程序,模板所要顯示的數據,之后才會引入他要顯示的模板文件,在程序文件中是這樣引入模板的: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、<!--{subtemplate common/header}-->

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

2、<!--{ad/headerbanner/wpa_h}-->

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

3、<!--{if $_G['uid']}--><!--{/if}-->

DiscuzX的判斷標簽,如果條件成立,那么包括在這個標簽中的html代碼將會被顯示。示例中如果用戶的uid存在的話。這里面的代碼就會被顯示,如果為游客沒有uid,那么對應的里面的html代碼將不會再頁面中顯示出來,即使解析出來,也不會被顯示。

而且if 后面的判斷條件也可以用表達式的計算結果作為值,進行判斷。比如
<!--{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、<!--{loop $catlist $key$cat}-->

循環標簽,這是一個使用頻率很高的標簽,他會實現php中foreach的函數效果,對一組數組數據進行循環輸出。如果你在php中組裝好了一個要用到的數組,那么loop將是您最佳的顯示標簽。

5、<!--{eval $forum=$forumlist[$forumid];}-->

以eval開始的標簽,將直接將后面的代碼作為php執行語句原樣輸出。

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




上一篇:DiscuzX 前端模板界面css加載分析
下一篇:discuz核心函數庫function_core的函數注釋
分享到:  QQ好友和群QQ好友和群
收藏收藏1

大神點評4

跳轉到指定樓層
沙發
UC955 發表于 2015-7-1 17:42:50 [Discuz開發] 只看該作者
感謝樓主無私的分享與奉獻
4
淘小淘 發表于 2019-6-6 11:09:09 [Discuz開發] 只看該作者
感謝樓主無私的分享與奉獻
5
841145272 發表于 2020-2-3 15:08:52 [Discuz開發] 只看該作者
很給力,希望分享更多給力的帖子啊。
您需要登錄后才可以回帖 登錄 | 快速注冊

本版積分規則

快速回復 返回頂部 返回列表
铁板炒面能赚钱不