PHP模闆
該如何使我的PHP腳本從設計中獨立出來?這無疑地是在PHP郵件列表上所提問的最多的問題之一。雖然PHP被标榜為“HTML嵌入式語言”,在寫過許多PHP和HTML混合式的工程之後,我産生了一個分離表單和内容的想法。而且,在許多公司裡規劃設計者的角色和程序設計者是分開的。于是,這樣的一個模闆解決方案産生了……
例如在一個公司,一個應用程序的開發流程如下:在提交計劃文檔之後,界面設計者[美工]制作了網站的外觀模型,然後把它交給後台程序員。程序員使用PHP實現商業邏輯,同時使用外觀模型做成基本架構。然後工程被返回到HTML頁面設計者繼續完善。就這樣工程可能在後台程序員和頁面設計者之間來來回回好幾次。由于後台程序員不喜歡幹預任何有關HTML标簽,同時也不需要美工們和PHP代碼混在一起;美工設計者隻需要配置文件,動态區塊和其他的界面部分,不必要去接觸那些錯綜複雜的PHP代碼。因此,這時候有一個很好的模闆支持就顯得很重要了。
縱觀現今存在的許多PHP模闆解決方案(比如PHPLIB),大多數都隻是提供了用模闆取代變量和将動态區塊的功能有限的格式化的基本方法。但是我們的需求比這個要高的多。我們完全不想要PHP程序員去設計HTML頁面,可是這又是不可避免的。例如:如果美工想要在動态區塊之間交替不同的背景顔色,他就可能得和程序員預先說好。同樣,美工們也應該有自己對于頁面設計的配置文件,這同樣可以通過變量把他們拉到模闆裡邊去。
Smarty優點
1.速度:采用Smarty編寫的程序可以獲得最大速度的提高,這一點是相對于其它的模闆引擎技術而言的。
2.編譯型:采用Smarty編寫的程序在運行時要編譯成一個非模闆技術的PHP文件,這個文件采用了PHP與HTML混合的方式,在下一次訪問模闆時将WEB請求直接轉換到這個文件中,而不再進行模闆重新編譯(在源程序沒有改動的情況下)
3.緩存技術:Smarty選用的一種緩存技術,它可以将用戶最終看到的HTML文件緩存成一個靜态的HTML頁,當設定Smarty的cache屬性為true時,在Smarty設定的cachetime期内将用戶的WEB請求直接轉換到這個靜态的HTML文件中來,這相當于調用一個靜态的HTML文件。
4.插件技術:Smarty可以自定義插件。插件實際就是一些自定義的函數。
5.模闆中可以使用if/elseif/else/endif。在模闆文件使用判斷語句可以非常方便的對模闆進行格式重排。
Smarty的産生和适用性
Smarty的産生
以下文字摘自《Smarty手冊》,以開發組為第一人稱——
早在1999年後期,我們就已經開始為模闆引擎寫說明文檔。在完成這個文檔之後,我們開始用C寫一個模闆引擎,并有希望被包含到PHP裡去。在撞上了許多的技術難題的同時,“什麼是模闆應該做的,什麼不該做”這個問題,也被熱烈的讨論着。從這些經驗,我們決定應該用PHP将模闆引擎寫成一個類,讓任何覺得合适的人使用它。所以我們寫了一個引擎,從此就有了Smarty。(注:這個類以前從來沒有公開發表過)。這個類幾乎達到了我們所有的要求:常規變量替換,支持包括其他模闆,使用配置文件集成設置,嵌入PHP代碼,限制'if'語句的作用,還有更多的可以多層嵌套的健壯的動态區塊。它用常規表達式做到這一切,于是代碼變得相當令人費解。在每次調用的時候,都要去解析那些語法和常規表達式,于是在大型應用的時候,它顯然慢了下來。在程序員的眼光看來,最大的問題還是使用PHP腳本建立和處理模闆和動态區塊的所有必要工作。我們應該如何使他變得更簡單?
我們可以想象Smarty應該有怎樣的最後表現。我們知道PHP代碼如果沒有了模闆解析的開銷将有多快,我們也知道從一般的美工看來PHP語言是多麼的“恐怖”,然而這一切可以被一種更簡單的模闆語法掩飾掉。我們應該怎樣把這兩種方法的長處結合起來?
于是,Smarty誕生了……
Smarty的适用性
1.由于Smarty是編譯型模闆引擎,在模闆修改後要立即進行編譯,因此需要實時更新的内容不适合使用。例如像股票顯示,它需要經常對數據進行更新,導緻經常重新編譯模闆,所以這類型的程序使用Smarty會使模闆處理速度變慢。
2.小項目。小項目因為項目簡單而美工與程序員兼于一人的項目,使用Smarty會在一定程度上喪失PHP開發迅速的優點。
簡明教程
安裝
首先打開網頁http://www.smarty.net/download.php,下載最新版本的Smarty。解壓下載的文件。在根目錄下建立了新的目錄learn/,再在learn/裡建立一個目錄smarty/。将剛才解壓縮出來的目錄的libs/拷貝到smarty/裡,再在smarty/裡新建templates目錄,templates裡新建cache/,templates/,templates_c/,config/。這樣就完成了安裝的目錄設置。
實例化Smarty對象
實例化Smarty對象非常簡單,代碼如下:
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類默認已經有了對緩存、配置、模闆、編譯文件的文件夾設置,因此隻要按照安裝部分的目錄設置,隻需要最頂端兩行代碼即可使用。
Smarty主要方法
Smarty::assign本方法用來賦值,将需要在模闆中進行替換的變量加載,然後才進行變量的替換,這樣可以防止多餘變量。
Smarty::display本方法用于輸出頁面,參數為模闆的文件名,講變量替換完畢後,使用該方法就可以得到生成頁面。
Smarty主要标簽
引用
網站中的網頁一般header和footer是可以共用的,所以隻要在每個tpl中引用它們就可以了。
示例:*.tpl:
{include file="header.tpl"}
{* body of template goes here *}
{include file="footer.tpl"}
判斷
模闆文件中可以使用if else等判斷語句,即可以将一些邏輯程序放在模闆裡。"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}
循環
在Smarty裡使用循環遍曆數組的方法是section,如何賦值遍曆都是在模闆中解決,php源文件中隻要一個assign就能解決問題。
示例:
{* this examplewill print out all the values of the $custid array *}
{sectionname=customer loop=$custid}
id: {$custid[customer]}
{/section}