複製鏈接
請複製以下鏈接發送給好友

Smarty

(使用PHP寫出來的模板引擎)

鎖定
Smarty是一個使用PHP寫出來的模板引擎,是業界最著名的PHP模板引擎之一。它分離了邏輯代碼和外在的內容,提供了一種易於管理和使用的方法,用來將原本與HTML代碼混雜在一起PHP代碼邏輯分離。
簡單的講,目的就是要使PHP程序員同前端人員分離,使程序員改變程序的邏輯內容不會影響到前端人員的頁面設計,前端人員重新修改頁面不會影響到程序的程序邏輯,這在多人合作的項目中顯的尤為重要。
外文名
Smarty
分    類
模板引擎
功    能
提供了一種易於管理和使用的方法
特    點
速度快

Smarty定義

PHP模板
Smarty樣板引擎運作示意圖 Smarty樣板引擎運作示意圖
如何使PHP腳本從設計中獨立出來?這是在PHP郵件列表上所提問的最多的問題之一。雖然PHP被標榜為“HTML嵌入式語言”,在寫過許多PHP和HTML混合式的工程之後,一個分離表單和內容的想法產生了。而且,在許多公司裏規劃設計者的角色和程序設計者是分開的。於是,這樣的一個模板解決方案產生了……
例如在一個公司,一個應用程序的開發流程如下:在提交計劃文檔之後,界面設計者[美工]製作了網站的外觀模型,然後把它交給後台程序員。程序員使用PHP實現商業邏輯,同時使用外觀模型做成基本架構。然後工程被返回到HTML頁面設計者繼續完善。就這樣工程可能在後台程序員和頁面設計者之間來來回回好幾次。由於後台程序員不喜歡干預任何有關HTML標籤,同時也不需要美工們和PHP代碼混在一起;美工設計者只需要配置文件,動態區塊和其他的界面部分,不必要去接觸那些錯綜複雜的PHP代碼。因此,這時候有一個很好的模板支持就顯得很重要了。
縱觀現今存在的許多PHP模板解決方案(比如PHPLIB),大多數都只是提供了用模板取代變量和將動態區塊的功能有限的格式化的基本方法。但是我們的需求比這個要高的多。我們完全不想要PHP程序員去設計HTML頁面,可是這又是不可避免的。例如:如果美工想要在動態區塊之間交替不同的背景顏色,他就可能得和程序員預先説好。同樣,美工們也應該有自己對於頁面設計的配置文件,這同樣可以通過變量把他們拉到模板裏邊去 [1] 

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會在一定程度上喪失PHP開發迅速的優點。
(PS:不過為了整個項目的規範,請大家嘗試去使用模板引擎。其實習慣了,開發速度會更加快,以上是沒有用習慣模板引擎的開發者遇到的問題)

Smarty誕生過程

早在1999年後期,就已經開始為模板引擎寫説明文檔。在完成這個文檔之後,開始嘗試用C寫一個模板引擎,並有希望被包含到PHP裏去。在撞上了許多的技術難題的同時,“什麼是模板應該做的,什麼不該做”這個問題,也被熱烈的討論着。從這些經驗決定應該用PHP將模板引擎寫成一個類,讓任何覺得合適的人使用它。所以就有了Smarty。(注:這個類從來沒有公開發表過)。這個類幾乎達到了我們所有的要求:常規變量替換,支持引用其他模板,使用配置文件集成設置,嵌入PHP代碼,限制'if'語句的作用,還有更多的可以多層嵌套的健壯的動態區塊。它用正則表達式做到這一切,於是代碼變得相當令人費解。在每次調用的時候,都要去解析那些語法和正則表達式,於是在大型應用的時候,它顯然慢了下來。在程序員的眼光看來,最大的問題還是使用PHP腳本建立和處理模板和動態區塊的所有必要工作。我們應該如何使它變得更簡單?
我們可以想象Smarty應該有怎樣的最後表現。我們知道PHP代碼如果沒有了模板解析的開銷將有多快,我們也知道從一般的美工看來PHP語言是多麼的“恐怖”,然而這一切可以被一種更簡單的模板語法掩飾掉。我們應該怎樣把這兩種方法的長處結合起來?
於是,Smarty誕生了……

Smarty簡明教程

一. 安裝
下載最新版本的Smarty。解壓下載的文件。
接下來演示給大家一個安裝實例,看過應該會舉一反三的。
(1) 在根目錄下建立了新的目錄learn/,再在learn/裏建立一個目錄smarty/。將剛才解壓縮出來的目錄的libs/拷貝到smarty/裏,再在smarty/裏新建templates目錄,templates裏新建cache/,templates/,templates_c/, config/。
(2) 新建一個模板文件:index.tpl,將此文件放在learn/smarty/templates/templates目錄下,代碼如下:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"此處DOCTYPE
聲明不全,下午糾結了好一會,終於看到了,新手朋友們關注下">
<html>
<head>
<metahttp-equiv="Content-Type" content="text/html;charset=gb2312">
<title>Smarty</title></head>
<body>{#$hello#}</body>
</html>
新建index.php,將此文件放在learn/下:
<?php
require 'smarty/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模板有高速緩存的功能,如果這裏是true的話即打開caching,但是會造成網頁不立即更新的問題,
// 當然也可以通過其他的辦法解決
$smarty->caching = false;
// 重新定義邊界,因為默認邊界“{}“符,在html頁面中嵌入js腳本文件編寫代碼段時使用的就是”{}“符,
// 自定義邊界符還可以是<{ }>, {/ /} 等
$smarty->left_delimiter = "{#"; 
$smarty->right_delimiter = "#}";
$hello = "Hello World!";//賦值
$smarty->assign("hello",$hello);//引用模板文件
$smarty->display('index.tpl');?>
(3) 執行index.php就能看到Hello World!了。
二. 賦值
在模板文件中需要替換的值用大括號{}括起來,值的前面還要加$號。例如{$hello}。這裏可以是數組,比如{$hello.item1},{$hello.item2}…
而PHP源文件中只需要一個簡單的函數assign(var , value)。
簡單的例子:
*.tpl:
*.php:
$hello[name]= “Mr. Green”;
$hello[time]=”morning”;
$smarty->assign(“exp”,$hello);
output:
Hello,Mr.Green!Good morning
三. 引用
網站中的網頁一般header和footer是可以共用的,所以只要在每個tpl中引用它們就可以了。
示例:*.tpl:
{include file="header.tpl"}
{* body of template goes here *}
{include file="footer.tpl"}

Smarty判斷

模板文件中可以使用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中可以用到的比較。看看就能知道什麼意思吧。
eq相等,
ne、neq不相等,
gt大於,
lt小於,
gte、ge大於等於,
lte、le 小於等於,
not非, mod求模。
is [not] div by是否能被某數整除,
,B z M E m I w0 is [not] even是否為偶數,
$a is [not] even by $b即($a / $b) % 2 == 0,
is [not] odd是否為奇,
$a is not odd by $b即($a / $b) % 2 != 0
示例:
{if $name eq "Fred"}
  WelcomeSir.
{elseif $name eq "Wilma"}
  WelcomeMa'am.
{else}
  Welcome,whatever you are.
{/if}

Smarty循環

在Smarty裏使用循環遍歷數組的方法是section,如何賦值遍歷都是在模板中解決,php源文件中只要一個assign就能解決問題。
示例:
{* this examplewill print out all the values of the $custid array *}
{section name=‘customer’ loop=$custid}
id: {$custid[customer]}<br>
{/section}
OUTPUT:
id: 1000<br>id: 1001<br>id: 1002<br>
Smarty還可以使用類似PHP的foreach來進行遍歷,在最新版本的Smarty裏的語法與PHP更相似。
示例:
{foreach item='article' from=$art} //{foreach $art as $item}
{$article.title}
{$article.author}
{$article.content}<br/>
{/foreach}

Smarty常見問題

Smarty將所有大括號{}裏的東西都視為自己的邏輯程序,於是我們在網頁中想插入javascript函數就需要literal的幫忙了,literal的功能就是忽略大括號{}。
示例:
{literal}
<script language=javascript>
function isblank(field) {
  if (field.value == '') {
    return false;
  }else{
    document.loginform.submit();
    return true;
  }
}
</script>
{/literal}

Smarty解釋程序

我們可以看到,smarty的程序部分實際就是符合php語言規範的一組代碼,我們依次來解釋一下:
1:/**/語句:
包含的部分為程序篇頭註釋。主要的內容應該為對程序的作用,版權與作者及編寫時間做一個簡單的介紹,這在smarty中不是必需的,但從程序的風格來講,這是一個好的風格。
2:include_once語句:
它將安裝到網站的smarty文件包含到當前文件中,注意包含的路徑一定要寫正確。
3:$smarty = new Smarty():
這一句新建一個Smarty對象$smarty,簡單的一個對象的實例化。
4:$smarty->templates(""):
這一句指明$smarty對象使用tpl模板時的路徑,它是一個目錄,在沒有這一句時,Smarty默認的模板路徑為當前目錄的templates目錄,實際在寫程序時,我們要將這一句寫明,這也是一種好的程序風格。
5:$smarty->templates_c(""):
這一句指明$smarty對象進行編譯時的目錄。在模板設計篇我們已經知道Smarty是一種編譯型模板語言,而這個目錄,就是它編譯模板的目錄,要注意,如果站點位於linux服務器上,請確保
teamplates_c裏定義的這個目錄具有可寫可讀權限,默認情況下它的編譯目錄是當前目錄下的templates_c,出於同樣的理由我們將其明確的寫出來。
6:$smarty->left_delimiter與$smarty->right_delimiter:
指明在查找模板變量時的左右分割符。默認情況下為"{"與"}",但在實際中因為我們要在模板中使用<script>,Script中的函數定義難免會使用{},雖然它有自己的解決辦法,但習慣上我們將它重新定義
為"{#"與"#}"或是"<!--{"與"}-->"或其它標誌符,注意,如果在這裏定義了左右分割符後,在模板文件中相應的要使每一個變量使用與定義相同的符號,例如在這裏指定為"<{"與"}>",htm模板中也要
相應的將{$name}變成<{$name}>,這樣程序才可以正確的找到模板變量。
7:$smarty->cache("./cache"):
告訴Smarty輸出的模板文件緩存的位置。上一篇我們知道Smarty最大的優點在於它可以緩存,這裏就是設置緩存的目錄。默認情況下為當前目錄下的cache目錄,與templates_c目錄相當,在linux系統中
我們要確保它的可讀可寫性。
8: $smarty->cache_lifetime = 60 * 60 * 24:
這裏將以秒為單位進行計算緩存有效的時間。第一次緩存時間到期時當Smarty的caching變量設置為true時緩存將被重建。當它的取值為-1時表示建立起的緩存從不過期,為0時表示在程序每次執行時緩
存總是被重新建立。上面的設置表示將cache_lifetime設置為一天。
9: $smarty->caching = 1:
這個屬性告訴Smarty是否要進行緩存以及緩存的方式。它可以取3個值,0:Smarty默認值,表示不對模板進行緩存;1:表示Smarty將使用當前定義的cache_lifetime來決定是否結束cache;2:表示
Smarty將使用在cache被建立時使用cache_lifetime這個值。習慣上使用true與false來表示是否進行緩存。
10:$smarty->assign("name", "zaocha"):
該數的原型為assign(string varname, mixed var),varname為模板中使用的模板變量,var指出要將模板變量替換的變量名;其第二種原形為assign(mixed var),我們要在後面的例子詳細的講解這個成員函數的使用方法,assign是Smarty的核心函數之一,所有對模板變量的替換都要使用它。
11. $smarty->display("index.tpl"):
該函數原形為display(string varname),作用為顯示一個模板。簡單的講,它將分析處理過的模板顯示出來,這裏的模板文件不用加路徑,只要使用一個文件名就可以了,它路徑我們已 經在$smarty->templates(string path)中定義過了。
程序執行完後我們可以打開當前目錄下的templates_c與cache目錄,就會發現在下邊多出一些%%的目錄,這些目錄就是Smarty的編譯與緩存目錄,它由程序自動生成,不要直接對這些生成的文件進行修改。
以上我簡單的把Smarty程序中的一些常用的基本元素介紹了一下,在後邊的例子中你可以看到將它們將被多次的使用。
參考資料