從PHP的模板引擎看Discuz!模板機制
來源:互聯網
上載者:User
此文轉自<PHPer>第七期,看看人家寫的東西。鑒於對PHP的熟悉度及以後的維護,最近想把那個ASP的分類資訊網改一下,前台基本改版 完畢,使用了fleaPHP提供的架構(對比了thinkPHP與fleaPHP最終還是選擇了後者),其中的視圖使用了smarty模板,平台環境使用 了APMServ,開發環境使用了Zend Development Environment,後台進行中中,計劃月底前完成。
一、關於模板引擎的前言
從phplib到smarty,再到Discuz!的模板機制,本文試圖通過PHP模板引擎為你講解作者自己的PHP心得。
我清楚的記得在我剛上大學開始學習PHP的時候,曾經在phpe.net看到過一篇關於phplib Template和FastTemplate這兩模板引擎效能比較的文章。讓我在接下來半年的時間內持續的使用著phplib。不可否認phplib是左 右了一代PHP開發人員對於PHP模板引擎的認識。或許你也會對下面的方法比較熟悉
$t->set_file
$t->set_var
當我對於phplib的執行效率不滿意的時候,我開始尋找下一個PHP的模板引擎,於是smarty跳入我的視野範圍,當我費盡心血去學會了smarty並使用開發了很多東西,而現在的我突然發現記得的也就只有下面的方法了
$s->assign
$s->display
究竟我們需要模板引擎來做什麼呢,MVC?簡單?易用?效率?請看下文的分析。
二、程式處理的分析
1.PHPLIB的程式處理過程
$t = new Template()
$t->set_file
$t->set_var
$t->parse
$t->p
看上面的代碼,翻譯成中文就是
初始化模板類$t
設定模板檔案
設定模板變數
分析模板檔案中的模板變數
輸出內容
通過了最少5個步驟在php程式中實現模板的處理
2.Smarty的程式處理過程
$s = new Smarty
$s->assign
$s->display
翻譯成中文就是
初始化模板類$s
設定模板變數
解析並輸出模板
3.Discuz!模板的程式處理過程
include template(tplname);
主要作用就是指定給程式需要處理的模板檔案
在上述三種模板處理機制中,最容易理解和接受就是Discuz!模板的處理過程。初始化、設定變數、解析模板、輸出內容,Discuz!只用了一個函數來 做。對於一個開源的論壇軟體,這樣處理的好處是顯而易見的,對於Discuz!進行二次開發的程式員的要求降低。簡化範本語言,方便風格和外掛程式的製作,這 也在一定程度上促進了Discuz!的傳播
三、模板源檔案的文法
在phplib中處理迴圈嵌套的時候,使用:
<!-- BEGIN row -->
{it}
<!-- END row -->
在smarty中處理迴圈嵌套的時候,引入了
<{section name=loopName loop=$loopArray}>(當然還有foreach這樣的)
在Discuz!中處理迴圈嵌套的時候,
<!--{loop $array $value}-->
其實真正的模板面對的可以說是不懂PHP或者懂一點PHP的美工同志們,模板的複雜就意味著美工製作頁面的難度加大。在必不可少的需要模板有邏輯處理的時 候,為什麼不在html代碼中使用原生態的PHP文法,而讓美工相當於去學習另外一種語言呢?在我個人的經驗中,顯然是Discuz!的範本語言更為簡單 易學,也為我節省了更多的時間。
四、Discuz!模板處理機制
我剝離出一個簡單的Discuz!模板處理函數
function template($file, $templateid = 0, $tpldir = '') {
$tplfile = DISCUZ_ROOT.'./'.$tpldir.'/'.$file.'.htm';//模板源檔案
$objfile = DISCUZ_ROOT.'./forumdata/templates/'.$templateid.'_'.$file.'.tpl.php';//模板快取檔案
//如果模板源檔案的修改時間遲於模板快取檔案的修改時間,
//就是模板源檔案被修改而模板緩衝沒有更新的時候,
//則調用parse_template函數重建模板快取檔案。
if(@filemtime($tplfile) > @filemtime($objfile)) {
require_once DISCUZ_ROOT.'./include/template.func.php';
parse_template($file, $templateid, $tpldir);
}
//返回快取檔案名稱
//$objfile變數內容可能為D:\discuz\forumdata\templates\1_demo.tpl.php
return $objfile;
}
而php頁面的模板執行語句
include template('demo');
實際上在本例中就是相當於
include 'D:\discuz\forumdata\templates\1_demo.tpl.php';
這個流程就是一個demo.php檔案中當資料處理完成以後include template('demo'),去顯示頁面。
五、總結
我也曾經看到過有列舉出很多種的PHP模板引擎,但是我覺著phplib、smarty、Discuz!模板機制就足以說明問題了。
1.我們需要模板來做什嗎?
分離程式與介面,為程式開發以及後期維護提供方便。
2.我們還在關心什嗎?
PHP模板引擎的效率,易用性,可維護性。
3.最後的要求什嗎?
簡單就是美!
文章好像沒有寫完,其實已經寫完了,我要說明的就是從PHP的模板引擎看Discuz!模板機制。分析已經完成,或許以後我會再寫篇實際資料的測試供給大家參考!本篇文章來源於Php Question原文連結:http://www.phpq.net/viewthread-28.php