天天看點

分離自Discuz模闆類和文法

模闆原理:當模闆沒被編譯成php檔案的時候 第一次讀取模闆的時候系統會自動進行編譯然後再次打開的時候系統就直接讀取php檔案了

主要功能說明

去掉了 discuz 語言包的功能

移植 discuz 模闆中所有的功能

添加了自動更新緩存及生命周期功能

在模闆中的使用方法跟discuz的一樣,是以就不做多餘的說明了,使用前隻需要做些簡單的設定就可以了

如果需要使用discuz的語言包功能,隻要去掉template.class.php第172行注釋,并在template.func.php中加上discuz原來的languagevar函數就可以了

分離自Discuz模闆類和文法

//設定語言變量  

function languagevar($var) {  

    return $globals['language'][$var] ? $globals['language'][$var] : “!$var!”;  

}  

discuz! 的模闆采用近似 php 表達式的文法 .

直接輸出變量: {$abc}或 {echo $abc}

輸出數組中某個變量:{$arr[0]}

在本模闆中引用其他的模闆: 如我們要包含頭部模闆檔案(header.htm)可以這樣寫:{subtemplate header}

支援的元素如下:  * <!–{ … }–>

邏輯元素包圍符,該符号用于包含條件和循環元素

條件判斷

            <!--{if expr1}-->

              statement1

             <!--{elseif expr2}-->

              statement2

             <!--{else}-->

              statement3

             <!--{/if}-->

這是一個典型的條件模闆,當條件 expr1 為真時,顯示模闆 statement1 内容,否則當 expr2 為真時,顯示模闆 statement2 内容,否則顯示模闆 statement3 的内容。如同其他語言中的條件控制一樣,其中 <!–{elseif expr}–> 和 <!–{else} –> 是非必須的。

不帶下标變量的數組循環

            <!--{loop $array $value}-->

              statement

             <!--{/loop}-->

            相當于 php 的數組循環語句:

            foreach($array as $value) {

             }

帶下标變量的數組循環

            <!--{loop $array $key $value}-->

相當于 php 的數組循環語句:

            foreach($array as $key => $value) {

邏輯元素包圍符在 { } 外面包含了 html 的注釋符号 <!– –>,除了為了和資訊元素相差別外,也友善了使用 dreamweaver 和 frontpage 之類工具編輯模闆的使用者。因邏輯元素會被識别為 html 的注釋而不被顯示,對于絕大多數使用者,邏輯元素中的内容是完全不需要修改的,甚至修改錯一個字元就可能引起錯誤資訊和整個系統無法運作。是以通常您在修改模闆的時候,不要修改模闆的邏輯資訊,更不要将邏輯資訊内部元素(如 <!–{else}–> 等)的前後位置作以修改,否則可能會導緻錯誤。如果您的模闆被不慎修改損壞,請立即用原标準預設模闆覆寫,即可恢複。

對于高手而言,實際上外部的 <!– –> 是可以省略不寫的,可以用于某些元素在模闆中的定位,但強烈建議普通使用者不要輕易嘗試。

    * { … }

資訊元素包圍符

o {constant}

可以引用界面替換變量,其中必須為大寫字母,該符号實際的作用是引用 php 常量 constant,是以也可以通過它來引用其他的常量内容。

o {lang variable}

可以在模闆中引用語言變量 variable 的内容,語言變量經由 templates.php.lang 中數組 $language 定義。如 {lang post_edit} 的内容在編譯模闆的時候被替換為 $language['post_edit'] 的内容,簡體中文版的意思是“編輯文章”。

o {template name}

模闆嵌入符,為了避免模闆的冗長,可以使用本符号來将 name 模闆的内容嵌入本模闆中(實際上為引用)。

{subtemplate header}    //這種是靜态引入, 即把header的代碼直接加載在目前的緩存檔案上。

{template header}       //這種是動态引入, 會通過include來引入。

o {eval statement}

eval 标簽主要是用來在模闆中執行php 文法,在eval 後必須緊跟合法的php 文法。推薦隻在特别必須的時候才使用該結構,因為它會破壞模闆的結構和可讀性。如 {eval echo ‘template!’;} 實作的功能為 echo ‘template’;

o {lf}

換行符,因為 discuz! 模闆引擎會忽略掉多餘的換行(\n),這個符号用來成生需要的 \n。

我們所推薦的模闆修改方法:通過普通編輯器手工書寫 html 或通過 dreamweaver 或 frontpage 修改。但是修改需切記,同一邏輯元素内或嵌套中元素的位置和内容切勿修改,即通常情況下,您不能把 <!–{}–> 包圍的内容單獨的移動,更不能删除。但是整個最外部邏輯結構是可以移動或删除的。

如果修改後模闆所在頁面在輸出類似如下的錯誤資訊 parse error: parse error, unexpected ‘}’ in /home/username/forums/forumdata/templates/1_login.tpl.php on line 6,說明模闆中出現了無法比對,或格式錯誤的邏輯元素,請仔細檢查是否有元素不對應,沒有結束或嵌套損壞,格式錯誤的現象,必要時可以恢複原始模闆來解決問題。

discuz! 提供了友善的界面打包程式,前面已對其格式做了介紹,将導出資訊的内容粘貼到 系統設定 中 風格方案 中的 導入界面方案中,執行即可。程式會自動解析資料内容,恢複相關的界面設定,自定義替換變量和所需的模闆設定。如果被導出界面使用了非預設模闆,必須将 ./templates 目錄屬性設定為 777,以便導入程式自動建立模闆記錄和檔案夾。

定義變量說明

<?exit?>

<!–{eval $i=2}–>

<!–{if $i==1}–>

123

<!–{/if}–>

<!–{eval $i=0;}–>

<!–{loop $_sblock['newti'] $value}–>

<!–{if $i % 2 == 0}–>//如果i除以2的餘數等于0

<div class=”listbg”><!–{else}–>

<div class=”listbg2″><!–{/if}–>

· [<span class="lista">$value[typename]</span>]<a

class=”lista” href=”$value[url]” title=”$value[subjectall]” target=”_blank”>$value[subject]</a></div>

<!–{eval $i++;}–>

<!–{/loop}–>

<!–{eval for ($i=1; $i<=5; $i++){ }–>

<!–{eval echo “hello world!<br />”;}–>

<!–{eval}}–>