smarty - 模板引擎
Smarty是一個(gè)使用PHP寫(xiě)出來(lái)的模板PHP模板引擎,是目前業(yè)界最著名的PHP模板引擎之一。它分離了邏輯代碼和外在的內(nèi)容,提供了一種易于管理和使用的方法,用來(lái)將原本與HTML代碼混雜在一起PHP代碼邏輯分離。
PHP模板
該如何使我的PHP腳本從設(shè)計(jì)中獨(dú)立出來(lái)?這無(wú)疑地是在PHP郵件列表上所提問(wèn)的最多的問(wèn)題之一。雖然PHP被標(biāo)榜為“HTML嵌入式語(yǔ)言”,在寫(xiě)過(guò)許多PHP和HTML混合式的工程之后,我產(chǎn)生了一個(gè)分離表單和內(nèi)容的想法。而且,在許多公司里規(guī)劃設(shè)計(jì)者的角色和程序設(shè)計(jì)者是分開(kāi)的。于是,這樣的一個(gè)模板解決方案產(chǎn)生了……
例如在一個(gè)公司,一個(gè)應(yīng)用程序的開(kāi)發(fā)流程如下:在提交計(jì)劃文檔之后,界面設(shè)計(jì)者[美工]制作了網(wǎng)站的外觀模型,然后把它交給后臺(tái)程序員。程序員使用PHP實(shí)現(xiàn)商業(yè)邏輯,同時(shí)使用外觀模型做成基本架構(gòu)。然后工程被返回到HTML頁(yè)面設(shè)計(jì)者繼續(xù)完善。就這樣工程可能在后臺(tái)程序員和頁(yè)面設(shè)計(jì)者之間來(lái)來(lái)回回好幾次。由于后臺(tái)程序員不喜歡干預(yù)任何有關(guān)HTML標(biāo)簽,同時(shí)也不需要美工們和PHP代碼混在一起;美工設(shè)計(jì)者只需要配置文件,動(dòng)態(tài)區(qū)塊和其他的界面部分,不必要去接觸那些錯(cuò)綜復(fù)雜的PHP代碼。因此,這時(shí)候有一個(gè)很好的模板支持就顯得很重要了。
縱觀現(xiàn)今存在的許多PHP模板解決方案(比如PHPLIB),大多數(shù)都只是提供了用模板取代變量和將動(dòng)態(tài)區(qū)塊的功能有限的格式化的基本方法。但是我們的需求比這個(gè)要高的多。我們完全不想要PHP程序員去設(shè)計(jì)HTML頁(yè)面,可是這又是不可避免的。例如:如果美工想要在動(dòng)態(tài)區(qū)塊之間交替不同的背景顏色,他就可能得和程序員預(yù)先說(shuō)好。同樣,美工們也應(yīng)該有自己對(duì)于頁(yè)面設(shè)計(jì)的配置文件,這同樣可以通過(guò)變量把他們拉到模板里邊去。
Smarty優(yōu)點(diǎn)
1.速度:采用Smarty編寫(xiě)的程序可以獲得最大速度的提高,這一點(diǎn)是相對(duì)于其它的模板引擎技術(shù)而言的。
2.編譯型:采用Smarty編寫(xiě)的程序在運(yùn)行時(shí)要編譯成一個(gè)非模板技術(shù)的PHP文件,這個(gè)文件采用了PHP與HTML混合的方式,在下一次訪問(wèn)模板時(shí)將WEB請(qǐng)求直接轉(zhuǎn)換到這個(gè)文件中,而不再進(jìn)行模板重新編譯(在源程序沒(méi)有改動(dòng)的情況下)
3.緩存技術(shù):Smarty選用的一種緩存技術(shù),它可以將用戶最終看到的HTML文件緩存成一個(gè)靜態(tài)的HTML頁(yè),當(dāng)設(shè)定Smarty的cache屬性為true時(shí),在Smarty設(shè)定的cachetime期內(nèi)將用戶的WEB請(qǐng)求直接轉(zhuǎn)換到這個(gè)靜態(tài)的HTML文件中來(lái),這相當(dāng)于調(diào)用一個(gè)靜態(tài)的HTML文件。
4.插件技術(shù):Smarty可以自定義插件。插件實(shí)際就是一些自定義的函數(shù)。
5.模板中可以使用if/elseif/else/endif。在模板文件使用判斷語(yǔ)句可以非常方便的對(duì)模板進(jìn)行格式重排。
Smarty的產(chǎn)生和適用性
Smarty的產(chǎn)生
以下文字摘自《Smarty手冊(cè)》,以開(kāi)發(fā)組為第一人稱——
早在1999年后期,我們就已經(jīng)開(kāi)始為模板引擎寫(xiě)說(shuō)明文檔。在完成這個(gè)文檔之后,我們開(kāi)始用C寫(xiě)一個(gè)模板引擎,并有希望被包含到PHP里去。在撞上了許多的技術(shù)難題的同時(shí),“什么是模板應(yīng)該做的,什么不該做”這個(gè)問(wèn)題,也被熱烈的討論著。從這些經(jīng)驗(yàn),我們決定應(yīng)該用PHP將模板引擎寫(xiě)成一個(gè)類,讓任何覺(jué)得合適的人使用它。所以我們寫(xiě)了一個(gè)引擎,從此就有了Smarty。(注:這個(gè)類以前從來(lái)沒(méi)有公開(kāi)發(fā)表過(guò))。這個(gè)類幾乎達(dá)到了我們所有的要求:常規(guī)變量替換,支持包括其他模板,使用配置文件集成設(shè)置,嵌入PHP代碼,限制'if'語(yǔ)句的作用,還有更多的可以多層嵌套的健壯的動(dòng)態(tài)區(qū)塊。它用常規(guī)表達(dá)式做到這一切,于是代碼變得相當(dāng)令人費(fèi)解。在每次調(diào)用的時(shí)候,都要去解析那些語(yǔ)法和常規(guī)表達(dá)式,于是在大型應(yīng)用的時(shí)候,它顯然慢了下來(lái)。在程序員的眼光看來(lái),最大的問(wèn)題還是使用PHP腳本建立和處理模板和動(dòng)態(tài)區(qū)塊的所有必要工作。我們應(yīng)該如何使他變得更簡(jiǎn)單?
我們可以想象Smarty應(yīng)該有怎樣的最后表現(xiàn)。我們知道PHP代碼如果沒(méi)有了模板解析的開(kāi)銷將有多快,我們也知道從一般的美工看來(lái)PHP語(yǔ)言是多么的“恐怖”,然而這一切可以被一種更簡(jiǎn)單的模板語(yǔ)法掩飾掉。我們應(yīng)該怎樣把這兩種方法的長(zhǎng)處結(jié)合起來(lái)?
于是,Smarty誕生了……
Smarty的適用性
1.由于Smarty是編譯型模板引擎,在模板修改后要立即進(jìn)行編譯,因此需要實(shí)時(shí)更新的內(nèi)容不適合使用。例如像股票顯示,它需要經(jīng)常對(duì)數(shù)據(jù)進(jìn)行更新,導(dǎo)致經(jīng)常重新編譯模板,所以這類型的程序使用Smarty會(huì)使模板處理速度變慢。
2.小項(xiàng)目。小項(xiàng)目因?yàn)轫?xiàng)目簡(jiǎn)單而美工與程序員兼于一人的項(xiàng)目,使用Smarty會(huì)在一定程度上喪失PHP開(kāi)發(fā)迅速的優(yōu)點(diǎn)。
簡(jiǎn)明教程
安裝
首先打開(kāi)網(wǎng)頁(yè)http://www.smarty.net/download.php,下載最新版本的Smarty。解壓下載的文件。在根目錄下建立了新的目錄learn/,再在learn/里建立一個(gè)目錄smarty/。將剛才解壓縮出來(lái)的目錄的libs/拷貝到smarty/里,再在smarty/里新建templates目錄,templates里新建cache/,templates/,templates_c/,config/。這樣就完成了安裝的目錄設(shè)置。
實(shí)例化Smarty對(duì)象
實(shí)例化Smarty對(duì)象非常簡(jiǎn)單,代碼如下:
include "libs/smarty.class.php";
$smarty = new Smarty - ;
$smarty->template_dir ="smarty/templates/templates";
$smarty->compile_dir ="smarty/templates/templates_c";
$smarty->config_dir = "smarty/templates/config";
$smarty->cache_dir ="smarty/templates/cache";
由于Smarty類默認(rèn)已經(jīng)有了對(duì)緩存、配置、模板、編譯文件的文件夾設(shè)置,因此只要按照安裝部分的目錄設(shè)置,只需要最頂端兩行代碼即可使用。
Smarty主要方法
Smarty::assign本方法用來(lái)賦值,將需要在模板中進(jìn)行替換的變量加載,然后才進(jìn)行變量的替換,這樣可以防止多余變量。
Smarty::display本方法用于輸出頁(yè)面,參數(shù)為模板的文件名,講變量替換完畢后,使用該方法就可以得到生成頁(yè)面。
Smarty主要標(biāo)簽
引用
?
網(wǎng)站中的網(wǎng)頁(yè)一般header和footer是可以共用的,所以只要在每個(gè)tpl中引用它們就可以了。
示例:*.tpl:
???????? {include file="header.tpl"}
???????? {* body of template goes here *}
???????? {include file="footer.tpl"}
判斷
模板文件中可以使用if else等判斷語(yǔ)句,即可以將一些邏輯程序放在模板里。"eq","ne", "neq", "gt", "lt","lte", "le", "gte"??? "ge","is even", "is odd", "is not even", "is notodd", "not", "mod", "div by", "evenby", "odd by","==","!=",">","="這些是if中可以用到的比較。
示例:
??????? {if $name eq"Fred"}
??????? WelcomeSir.
??????? {elseif $name eq"Wilma"}
??????? WelcomeMa'am.
??????? Welcome,whatever you are.
??????? {/if}
循環(huán)
在Smarty里使用循環(huán)遍歷數(shù)組的方法是section,如何賦值遍歷都是在模板中解決,php源文件中只要一個(gè)assign就能解決問(wèn)題。
示例:
{* this examplewill print out all the values of the $custid array *}
{sectionname=customer loop=$custid}
id: {$custid[customer]}
{/section}
