模板機制
Discuz! X2.5 擁有完善的模版機制,支持模版和程序的分離,方便模版風格的擴展開發。
通常模版文件存放在 template 目錄下,文件格式為 htm 。在加載模版的時候通常就是簡單的一句:
include template('dir/filename');
其中 dir 為目錄名稱,filename 為文件名稱。這個時候 Discuz! 的模版引擎主要進行了如下的行為:
- 根據傳入的參數計算得到完整的文件路徑和名稱
- 檢查文件是否存在以及解析之後的模版緩存是否存在及是否已經過期
- 根據上一步判定是否進行模版的解析如過解析的話,將解析後的可執行文件存入 ./data/template/ 下以備調用
- 返回解析後的 php 文件地址並加載
- 加載成功
PHP 格式的模版
從 Discuz! X2.5 開始,模板文件支持 PHP 擴展名的格式,你可以創建例如 ./template/mytext/common/forum/discuz.php 文件,PHP 的模板文件中你只需在原有 HTM 的模板文件開頭添加一行代碼即可,如:
<?php exit;?>
<?php echo '你不能看此模板的內容';exit;?>
PHP 的模板文件的模板數據內容將從文件的第二行開始解析。 PHP 和 HTM 模板文件同時存在時,會優先解析 PHP 模板文件
模版語法
- 變量輸出
輸出一個變量的值,等同於 php 的 ,花括號可以省略但不建議去掉。
{$my_var}
- 條件判斷
通過 if 判斷流程分支,如果寫在 HTML 表單元素中,可以省去使代碼更清晰易讀,如 {if $my_var}xxx{/if}
<!--{if $my_var}-->
任意 html 語句
<!--{/if}-->
帶有多條件的 if 寫法,可使用 PHP 常規判斷中的按位運算符等
<!--{if $my_var && ($my_var2 & 1 || $my_var3 == 3)}-->
任意 html 語句
<!--{/if}-->
帶有分支條件的 if 寫法
<!--{if $my_var == 1}-->
變量為 1
<!--{elseif $my_var == 2}-->
變量為 2
<!--{else}-->
其他情況
<!--{/if}-->
- 循環輸出
帶有數組鍵的循環寫法
<!--{loop $my_arr $key $val}-->
循環輸出的 HTML 語句
<!--{/loop}-->
沒有數組鍵的循環寫法
<!--{loop $my_arr $val}-->
- 模板嵌套
將被嵌套模板內容解析為 PHP 語句併合併入本模板中的寫法,common/header 對應某個模板套系中的 common 目錄的 header.htm 模板文件
<!--{subtemplate common/header}-->
程序運行時 include 嵌套模板內容
<!--{template common/header}-->
- 插件鈎子
在模板中設立插件鈎子,hook 為關鍵詞,意為將 index_top 定義為鈎子
<!--{hook/index_top}-->
- 變量數組嵌套使用
條件判斷或變量輸出時用到
<!--{if $my_arr[$my_var]}-->
<!--{if $my_arr[0]}-->
<!--{if $my_arr[$my_arr2[$my_var]]}-->
- PHP 解析
在模板中使用 PHP 語句可以通過 {eval } 進行
<!--{eval $my_var = 1;}-->
<!--{eval echo $my_var;}-->
<!--{eval $my_arr = array(1, 2, 3);}-->
<!--{eval print_r($my_arr);}-->
<!--{eval output();}-->
<!--{eval exit();}-->
- 語言包使用
在模板中可以通過下面的代碼來使用語言包中的某個值
{lang index_yesterday}
其中語言包在 ./source/language/目錄下,以 PHP 數組形式存放