Smarty是一個php模板引擎。更準確的說,它分開了邏輯程序和外在的內容,提供了一種易於管理的方法。能夠描述爲應用程序員和美工扮演了不一樣的角色,由於在大多數狀況下 ,他們不多是同一我的。例如,你正在建立一個用於瀏覽新聞的網頁,新聞標題,標籤欄,做者和內容等都是內容要素,他們並不包含應該怎樣去呈現。在Smarty的程序裏,這些被忽略了。模板設計者們編輯模板,組合使用html標籤和模板標籤去格式化這些要素的輸出(html表格,背景色,字體大小,樣式表,等等)。有一天程序員想要改變文章檢索的方式(也就是程序邏輯的改變)。這個改變不影響模板設計者,內容仍將準確的輸出到模板。一樣的,哪天美工吃多了想要徹底重作界面,也不會影響到程序邏輯。所以,程序員能夠改變邏輯而不須要從新構建模板,模板設計者能夠改變模板而不影響到邏輯。javascript
如今簡短的說一下什麼是smarty不作的。smarty不嘗試將邏輯徹底和模板分開。若是邏輯程序嚴格的用於頁面表現,那麼它在模板裏不會出現問題。有個建議:讓應用程序邏輯遠離模板, 頁面表現邏輯遠離應用程序邏輯。這將在之後使內容更容易管理,程序更容易升級。php
Smarty的特色之一是"模板編譯"。意思是Smarty讀取模板文件而後用他們建立php腳本。這些腳本建立之後將被執行。所以並無花費模板文件的語法解析,同時每一個模板能夠享受到諸如Zend加速器(http://www.zend.com) 或者PHP加速器(http://www.php-accelerator.co.uk)。這樣的php編譯器高速緩存解決方案。html
Smaty的一些特色:java
很是很是的快!linux
用php分析器幹這個苦差事是有效的程序員
不須要多餘的模板語法解析,僅僅是編譯一次數組
僅對修改過的模板文件進行從新編譯緩存
能夠編輯'自定義函數'和自定義'變量',所以這種模板語言徹底能夠擴展服務器
能夠自行設置模板定界符,因此你可使用{}, {{}}, <!--{}-->, 等等架構
諸如 if/elseif/else/endif 語句能夠被傳遞到php語法解析器,因此 {if ...} 表達式是簡單的或者是複合的,隨你喜歡啦
若是容許的話,section之間能夠無限嵌套
引擎是能夠定製的.能夠內嵌php代碼到你的模板文件中,雖然這可能並不須要(不推薦)
內建緩存支持
獨立模板文件
可自定義緩存處理函數
插件體系結構
1.引擎定義
PHP模板
如何使PHP腳本從設計中獨立出來?這是在PHP郵件列表上所提問的最多的問題之一。雖然PHP被標榜爲「HTML嵌入式語言」,在寫過許多PHP和HTML混合式的工程以後,一個分離表單和內容的想法產生了。並且,在許多公司裏規劃設計者的角色和程序設計者是分開的。因而,這樣的一個模板解決方案產生了……
例如在一個公司,一個應用程序的開發流程以下:在提交計劃文檔以後,界面設計者[美工]製做了網站的外觀模型,而後把它交給後臺程序員。程序員使用PHP實現商業邏輯,同時使用外觀模型作成基本架構。而後工程被返回到HTML頁面設計者繼續完善。就這樣工程可能在後臺程序員和頁面設計者之間來來回回好幾回。因爲後臺程序員不喜歡干預任何有關HTML標籤,同時也不須要美工們和PHP代碼混在一塊兒;美工設計者只須要配置文件,動態區塊和其餘的界面部分,沒必要要去接觸那些錯綜複雜的PHP代碼。所以,這時候有一個很好的模板支持就顯得很重要了。
縱觀現今存在的許多PHP模板解決方案(好比PHPLIB),大多數都只是提供了用模板取代變量和將動態區塊的功能有限的格式化的基本方法。可是咱們的需求比這個要高的多。咱們徹底不想要PHP程序員去設計HTML頁面,但是這又是不可避免的。例如:若是美工想要在動態區塊之間交替不一樣的背景顏色,他就可能得和程序員預先說好。一樣,美工們也應該有本身對於頁面設計的配置文件,這一樣能夠經過變量把他們拉到模板裏邊去
2.主要優勢
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開發迅速的優勢。
3.簡明教程
一. 安裝
下載最新版本的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>
</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;
$smarty->left_delimiter = "{#"; //從新定義邊界,由於默認邊界「{}「符,在html頁面中嵌入js腳本文件編寫代碼段時使用的就是」{}「符,自定義邊界符還能夠是<{ }>, {/ /} 等
$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"}
4.使用判斷
模板文件中可使用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}
5.循環數組
在Smarty裏使用循環遍歷數組的方法是section,如何賦值遍歷都是在模板中解決,php源文件中只要一個assign就能解決問題。
示例:
{*thisexamplewillprintoutallthevaluesofthe$custidarray*}
{sectionname=customerloop=$custid}
id:{$custid[customer]}
{/section}
OUTPUT:
id:1000
id:1001
id:1002
6.常見問題
8.解釋程序
咱們能夠看到,smarty的程序部分實際就是符合php語言規範的一組代碼,咱們依次來解釋一下:
1:/**/語句:
包含的部分爲程序篇頭註釋。主要的內容應該爲對程序的做用,版權與做者及編寫時間作一個簡單的介紹,這在smarty中不是必需的,但從程序的風格來說,這是一個好的風格。
2:include_once語句:
它將安裝到網站的smarty文件包含到當前文件中,注意包含的路徑必定要寫正確。
3:$smarty=newSmarty():
這一句新建一個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:
指明在查找模板變量時的左右分割符。默認狀況下爲"{"與"}",但在實際中由於咱們要在模板中使用
爲"{#"與"#}"或是""或其它標誌符,注意,若是在這裏定義了左右分割符後,在模板文件中相應的要使每個變量使用與定義相同的符號,例如在這裏指定爲"<{"與"}>",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(stringvarname,mixedvar),varname爲模板中使用的模板變量,var指出要將模板變量替換的變量名;其第二種原形爲assign(mixedvar),咱們要在後面的例子詳細的講解這個成員函數的使用方法,assign是Smarty的核心函數之一,全部對模板變量的替換都要使用它。
11.$smarty->display("index.tpl"):
該函數原形爲display(stringvarname),做用爲顯示一個模板。簡單的講,它將分析處理過的模板顯示出來,這裏的模板文件不用加路徑,只要使用一個文件名就能夠了,它路徑咱們已經在$smarty->templates(stringpath)中定義過了。
程序執行完後咱們能夠打開當前目錄下的templates_c與cache目錄,就會發如今下邊多出一些%%的目錄,這些目錄就是Smarty的編譯與緩存目錄,它由程序自動生成,不要直接對這些生成的文件進行修改。
把Smarty程序中的一些經常使用的基本元素介紹了一下,在後邊的例子中你能夠看到將它們將被屢次的使用。