1.DiscuzX2.5新增php格式模板檔案載入支援
從 Discuz! X2.5 開始,模板檔案支援 PHP 副檔名的格式,主要功能是防止模板被別的論壇盜取!
例如:template/default/common/header.htm
可建立為:template/default/common/header.php,模板檔案為php後,代碼書寫方式不改變依然和以前一樣採用HTML
php尾碼的模板檔案需在模板檔案開頭添加一行代碼:
<?php exit;?>
或者
<?php echo '你不能看此模板的內容';exit;?>
注意:PHP 的模板檔案的模板資料內容將從檔案的第二行開始解析。PHP 和 HTM 模板檔案同時存在時,會優先解析 PHP 模板檔案(該模式只能用與X2.5及以上版本!)
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
2.模板的變數名:
1)DiscuzX中有兩種變數
一種我們稱為G變數:$_G[xxx]
G變數是程式的全域變數,為了讓程式更加高效,減少不必要的資料擷取,所以程式特將經常需要用到的變數統一到G變數下,如使用者登入資訊、後台設定資訊、伺服器環境資訊、用戶端CooKies、資料緩衝等都存放在G變數裡面, 在製作模板的時候作者只需要將G變數列印出來即可獲得需要的資訊是否在G變數裡面。
另一種自訂變數:$xxx
自訂變數是以$開頭首位為字母或底線的自訂代碼,如:$data、$thread、$post、$forumlist、$threadlist等等!
自訂變數是作者可以自己在程式裡面自訂的,或程式自身已經定義了的。
注意:我們在製作模板的時候是將程式已有的資料進行另外一種展現方式,所以不用去自訂變數。
2)變數資料在模板中的輸出方式:
程式從資料庫或快取檔案中將資料進行讀取,轉換成數組資料並載入模板進行輸出!所以我們在模板中調用並輸出資料行表資料時必須寫迴圈代碼,將數組資料逐條迴圈顯示出來!
a)自訂變數資料的迴圈代碼書寫格式:
<!--{loop $data $key $value}--> <li>$key $value</li> <!--{/loop}-->
這段代碼就是一段典型的迴圈代碼,意思是將自訂變數$data進行迴圈,並將每次迴圈的資料傳遞給$value,$key是數組索引值(序號),
<!--{loop $data $key $value}--><!--{/loop}-->之間書寫html代碼。我們只需要記住這個簡單卻重要的意思!
b)開啟 template/default/forum/viewthread.htm
<!--{eval $postcount = 0;}--> <!--{loop $postlist $post}--> <!--{if $post['invisible'] != -5}--> <!--{if $rushreply && $_G['gp_checkrush'] && $post['rewardfloor'] != 1}--> <!--{eval continue;}--> <!--{/if}--> <div id="post_$post[pid]"> <!--{subtemplate forum/viewthread_node}--> </div> <!--{eval $postcount++;}--> <!--{/if}--> <!--{/loop}-->
這段代碼就是文章頁的迴圈代碼,通過上面的【自訂變數資料的迴圈代碼書寫格式】我們應該可以大致瞭解到這個迴圈代碼的意思!
$postlist變數中存放了當前訪問文章的主題資訊、回複樓層資訊,通過迴圈,將每個樓層的資料傳遞給$post變數。
迴圈的HTML代碼存放在template/default/forumviewthread_node.htm
開啟這個檔案後可以看見裡面的很多變數名都是$post,例如:$post['authorid'] = 作者UID、$post['username']=作者使用者名稱等等,通過$post[xxx]不同的欄位資訊輸出相應的資料,這些欄位資訊都在資料庫-資料表pre_forum_post存放著。
經常發現很多童鞋將$post[xxx]變數放到其他模板檔案中去用,結果重新整理出來的結果什麼都沒有!
原因是:
每個模板檔案都有一個對應的程式檔案,所以自訂變數不能在不同的頁面中使用,只限於定義了變數的模板檔案中使用。例如貼文清單頁的貼文數據是不能在論壇首頁或其他頁面輸出的!
3)模板製作中最重要的條件判斷(if else)
在迴圈語句中,我們經常要對不同的資料進行其他的展現方式,這時就需要用到條件判斷!條件判斷文法有很多中方式,如:大於、等於、小於、不等於、變數是否存在等!if else速記方法:if=如果 else=那麼,條件判斷涉及邏輯問題,所以需要很強的邏輯思維。下面的例子你第一次看的時候可能會感覺很好笑,請靜下心仔細看!
a)$xxx變數是否存在:
<!--{if $xxx}-->.....<!--{/if}-->PS:如果$xxx變數存在,則執行中間的代碼
b)$xxx變數是否大於1:
<!--{if $xxx >1}-->.....<!--{/if}-->PS:如果$xxx變數大於1,則執行中間的代碼
c)$xxx變數是否小於1:
<!--{if $xxx <1}-->.....<!--{/if}-->PS:如果$xxx變數小於1,則執行中間的代碼
d)$xxx變數是否不等於1:
<!--{if $xxx !=1}-->.....<!--{/if}-->PS:如果$xxx變數不等於1,則執行中間的代碼
e)複雜一點(如果那麼):
<!--{if $xxx ==1}-->a<!--{else}-->b<!--{/if}-->PS:如果$xxx變數等於1,則執行a代碼,那麼如果$xxx不等於1則執行b代碼
f)再複雜點(如果那麼如果)
<!--{if $xxx ==1}-->a<!--{elseif $xxx ==2}-->b<!--{elseif $xxx ==3}-->c<!--{/if}--> PS:如果$xxx變數等於1,則執行a代碼, 那麼如果$xxx不等於1等於2則執行b代碼, 那麼如果$xxx不等於1也不等於2是等於3,則執行c代碼。有點暈了嗎?
g)再再複雜一點(ifelse兩個條件判斷)
<!--{if $xxx ==1 || $xxx ==3}-->a<!--{elseif $xxx ==2}-->b<!--{/if}--> PS:如果$xxx變數等於1或者$xxx等於3,則執行a代碼, 那麼如果$xxx不等於1也不等於3,等於2則執行b代碼,
h)兩個變數判斷
<!--{if $xxx ==1 || $ooo ==1}-->a<!--{elseif $xxx && !$ooo}-->b<!--{/if}--> PS:如果$xxx變數等於1或者$ooo等於1,則執行a代碼, 那麼如果$xxx不等於1,$ooo也不等於1,$xxx變數存在並且$ooo變數不存在則執行b代碼
讀懂了ifelse例子後,上面viewthread.htm那段代碼中的<!--{if $post['invisible'] != -5}-->.....<!--{/if}-->我們根據剛才的ifelse註解,現在可以理解他的意思:判斷迴圈輸出時,如果$post['invisible'] 不等於-5則執行載入的HTML代碼
4)模板檔案中的外掛程式鉤子(外掛程式嵌入點):
a)外掛程式鉤子代碼例子:
<!--{hook/xxx_xxx}-->
外掛程式鉤子的作用在於能讓外掛程式在指定的一些位置輸出有關代碼!所以我們在製作模板的時候一定要參考預設範本中的外掛程式鉤子位置進行合理的安排!
除非你覺得某個外掛程式鉤子在自己的模板中並不需要,否則請保留外掛程式鉤子代碼!
5)DiscuzX的模板檔案N次嵌套:
我們在模板檔案template/default/forum/viewthread.htm中可以找到:<!--{subtemplate forum/viewthread_node}-->,
這個代碼的意思是在這個代碼的位置載入另外一個模板檔案:template/default/forum/viewthread_node.htm,
當我們開啟這個檔案後發現還有一段載入代碼:<!--{subtemplate forum/viewthread_node_body}-->
這就是DiscuzX的模板檔案N次嵌套!
我們首先要清楚的理解各個模板檔案是做什麼用的,就知道這些嵌套的意思:
template/default/forum/viewthread.htm 文章內容頁主模板,這個模板檔案是文章內容頁處理常式載入的
template/default/forum/viewthread_node.htm 文章內容頁樓層模板檔案,這個模板檔案迴圈一次就是一個樓層
template/default/forum/viewthread_node_body.htm 文章內容頁,文章內容範本,這個模板檔案是專門用於處理文章內容的
這種嵌套方式是便於以後的代碼修改,比如我只想修改文章內容的代碼,就只需要編輯viewthread_node_body.htm,而不用把另外兩個檔案都編輯。