smarty3從入門到精通詳解

主頁 > 學習 > php >

張兵 次瀏覽

摘要:smarty是一個使用PHP寫出來的模板PHP模板引擎,它提供了邏輯與外在內容的分離,簡單的講,目的就是要使用PHP程序員同美工分離,使用的程序員改變程序的邏輯內容不會影響到美工的頁面

1、安裝Smarty3.1.4
一、什么是smarty?
smarty是一個使用PHP寫出來的模板PHP模板引擎,它提供了邏輯與外在內容的分離,簡單的講,
目的就是要使用PHP程序員同美工分離,使用的程序員改變程序的邏輯內容不會影響到美工的頁面設計,
美工重新修改頁面不會影響到程序的程序邏輯,這在多人合作的項目中顯的尤為重要。
二、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的地方:
1. 需要實時更新的內容。例如像股票顯示,它需要經常對數據進行更新,這類型的程序使用smarty會使模板處理速度變慢。
2. 小項目。小項目因為項目簡單而美工與程序員兼于一人的項目,使用smarty會喪失php開發迅速的優點。
打開smarty的官方網站,www.smarty.net/download.php。下載Smarty 3.0rc4,
目前仍然是處于rc版本(Release.Candidate.就是發行候選版本,與beta版本相比,不再有功能的增加,主要著重于除錯!)。
有tar.gz和zip分別適用于linux和windows版本。

下載好后tar –zxvf Smarty 3.0rc4.tar.gz
目錄中,demo文件夾為示例文件。Libs為程序文件。
/libs/Smarty.class.php   #主文件
/libs/sysplugins/  #內部plugin
/libs /plugins/   #外部plugin,可自由擴充
/demo/cahce/   #放置緩存文件
/demo/configs /   #放置可以載入的配置文件
/demo/templates/   #放置模板文件
/demo/templates_c/    #放置對模板編譯后的文件
最好在需要進行smarty處理的文件的目錄中創建與demo中的相同的文件夾(注意文件夾具有web用戶寫權限),
當然也可以更改文件夾名和路徑,默認值為處于被smarty處理的文件的同級目錄。Smarty3.1.4需要php5.0以上。
2、調試Smarty3.1.4
創建自己的文件,比如index.php。
在templates目錄中創建模板index.tpl(幾乎可以是任何文本文件的擴展名,
常用的是tpl,php,html,不建議使用后兩者,因為可以從瀏覽器直接訪問而不安全。
可以對apache的httpd.conf進行設置,禁止直接訪問.tpl文件。或者將templats目錄放在網站文檔樹之外。)
[Index.php]
require_once(“../../Smarty-3.0rc4/libs/Smarty.class.php”);
$smarty = new smarty();
$smarty->assign(‘name’,’韓靈稚’);
$smarty->display(‘templates/index.tpl ‘);
[Index.tpl]的代碼:
<html><body>
<span>你好, {$name}</span>
</body></html>
Smarty編譯時的處理過程是源php文件->模板文件(可能多次調用)->源php文件。。。
也就是說不影響原php文件的其他處理和輸出。所以smarty模板文件可以是完整的html,也可以是其中一部分。

3、Smarty3.1.4基礎
3.1 smarty處理過程
smarty將php源文件,首先編譯成中間文件(也是php),如果啟用緩存,再根據編譯文件生成緩存文件(也是php),需要緩存的部分全部是硬編碼。
之后的每次訪問都會訪問編譯文件(如果編譯文件已經存在),一次編譯多次調用(可以是單文件的多次,也可以是多文件的多次),
如果啟用緩存且有緩存文件而且沒有過期,則直接訪問緩存文件,跳過編譯文件。編譯文件一經生成,就不會被自動更新,除非模板文件或者配置文件更改。
源php文件修改是不會引發重新編譯的。一旦編譯文件重新生成,緩存文件也必然重新生成。
Smarty允許有兩種特殊的編譯設置存在:
1、 任何時候都不自動重新編譯(上線階段):只有沒有該文件的編譯文件時才生成,
模板文件或者配置文件的更改,不會引發重新編譯。
$smarty->setCompile_check(false)
#默認為true,false表示任何時候都不在發生文件變更的情況下生成編譯文件,除了無編譯文件。
$smarty->getCompile_check()    #獲得當前編譯檢查的設置
2、任何時候都重新編譯(調試階段):任何時候都重新編譯。
$smarty->setForce_compile(true)  #默認為false,true表示每次都重新編譯(啟用緩存的話,每次都重新緩存)
$smarty->getForce_compile()    #獲得當前強制編譯的設置
3.2 分界符
在模板文件中,區分普通html代碼和smarty代碼靠的是分界符。默認情況下是“{ }“,但是與js和css相沖突。
可以進行變更。在3.0中模板標簽將不支持空格,如{ $abc }在Smarty2中可以識別的,
但是3.0里頭就不行了,必須這樣{$abc},這樣是為了能夠更好的支持javascript和css。
$smarty->left_delimiter = “<{“;   #左分界符,2.0屬性,3.0沿用
$smarty->right_delimiter = “}>”;   #右分界符,2.0屬性,3.0沿用
注意:將默認分界符修改后,在3.0模板中仍然不支持空格,比如<{ $abc }>,無效。
3.3 注釋

{* smarty用*包含的文字為注釋內容 *}
如果默認分界符修改為“<{}>“, <{* smarty用*包含的文字為注釋內容 *}>。注釋中的模板變量無效。
3.4 模板包含文件
格式 {include file=”要包含的文件名稱 “}
Head.tpl
<span>這是頂部內容,歡迎你,{$name}</span><hr />
Index.tpl中加一下代碼
{include file=”head.tpl”}
輸出結果:
這是頂部內容,歡迎你,韓靈稚。
您好,韓靈稚!
除了包含其他配置文件,還可以包含html、php(需要開啟smarty支持php模板的選項,
最好使用include_php函數)。包含文件還可以使用傳參。
Head.tpl
<span>{$nr},歡迎你,{$name}</span><hr />
Index.tpl
{include file=”head.tpl” nr=”這是頂部內容”}
輸出結果同上。
3.5 載入配置文件
可以預先規定一系列的變量與值的對應,并放在配置文件中,在使用時載入。
配置文件一般放在configs文件夾中,可以自定義。
My.conf
gv = “my.conf中的全局變量”   #全局配置變量,任何時候調用,都將被載入
#如果$sections,未設置,顯示全部變量
[color]   #局部配置變量
fontcolor = “red”   #如果$sections,設置為red,只顯示全局變量和[color]中的變量
[size]  #局部配置變量
fontsize = “12px”   #如果$sections,設置為size,只顯示全局變量和[size]中的變量
調用配置文件有兩種方法,一種是在源文件處,一種是在模板文件處。
源文件處:$smarty->configLoad($config_file, $sections = null)
模板文件處:{config_load file=”載入的配置文件” section=”選取的局部變量(可選)”scope=“作用模板范圍(可選)“}
如果使用源文件的方法,載入的配置文件變量的作用模板范圍自動為global,
而且可以應用到多個模板中(smarty對象調用了多個模板)。
如果使用后者,靈活性更大。單個模板中config_load的scope參數的范圍可以是local
(本模板,只能本模板使用這些變量), parent(父模板或者文件) 或
global(同一個smarty對象所調用的所有模板,其他模板不需要再載入該配置文件)
在模板文件中使用配置變量
{#配置變量#}或者{$smarty.config.變量名稱}
【相關函數】
$smarty->getConfigVariable($variable)    #返回某個模板變量,該變量必須是parent或者是global
$smarty->getConfigVars($varname = null)   #返回模板變量數組,或者單個變量。
該變量或者變量組必須是parent或者是global
$smarty->clearConfig($varname = null)  #清除所有配置變量或者指定的一個配置變量
$smarty->setConfig_overwrite(false)   #如果設變量為真,則從配置文件中讀取出來的變量(如果變量名稱相同)
將會由最后一個值覆蓋。反之,變量將會放到一個數組中。
不能用數組索引去訪問,可以使用cycle函數。該屬性也有getConfig_overwrite函數。
$smarty->setConfig_booleanize(true);   #設置為true的話,
配置文件中的on/true/yes/1 和 off/false/no/0值會自動轉化為布爾值,
false將變為字符串(如果作為判斷條件,永遠為真)。
該屬性也有getConfig_booleanize函數。
3.6 環境配置
Smary腳本中是可以動態設置編譯、模板、緩存、配置路徑。
$smarty->template_dir = “./templates”;    #設置模板目錄,2.0設置方法,3.0沿用但不推薦
$smarty->compile_dir = “./templates_c”;   #設置編譯目錄,2.0設置方法,3.0沿用但不推薦
$smarty->config_dir = ‘./configs/’;        #設置配置目錄,2.0設置方法,3.0沿用但不推薦
$smarty->cache_dir = ‘./cache/’;         #設置緩存目錄,2.0設置方法,3.0沿用但不推薦
Smary在3.0中對屬性進行了封裝。可以使用如下方法進行訪問獲得目錄。
$smarty->getCacheDir();   #得到當前緩存目錄路徑
$smarty->getTemplateDir();   #得到當前模板目錄路徑的數組
$smarty->getConfigDir(); #得到當前 配置目錄路徑
$smarty->getCompileDir(); #得到當前編譯目錄路徑
$smarty->getPluginsDir()   #得到當前插件目錄路徑數組
同樣用下面的方法進行目錄設置
$smarty->setTemplateDir(“../smarty1/templates/”);    #設置新的模板目錄,
注意設置后模板目錄的數組只有該值一個,不管原來有幾個值。
$smarty->setCompileDir(“../smarty1/templates_c/”);   #設置新的編譯目錄
$smarty->setConfigDir(“../smarty1/configs/”);        #設置新的配置目錄
$smarty->setCacheDir(“../smarty1/cache/”);         #設置新的緩存目錄
$smarty->addTemplateDir(“templates”);     #引用的模板文件的路徑必須在模板目錄數值中,
否則報錯,由于仍然用原來的模板文件,所以添加上原來模板路徑,這樣模板數組中有兩個路徑。
$smarty->addPluginsDir(‘myplugins’);   #添加一個新的插件目錄,如果用set將取消插件數組,變為單指
【相關函數】
$smarty->utility->compileAllTemplates($extention = ‘.tpl’, $force_compile = false,
$time_limit = 0, $max_errors = null)   #直接編譯所有模板目錄下所有模板文件,用處不大。
$smarty->utility->clearCompiledTemplate($resource_name = null,
$compile_id = null, $exp_time = null)   #清除編譯目錄下的編譯文件或者指定條件的編譯文件。
$smarty-> setDefault_template_handler_func($fucname)
#該函數在模板不能從它的源目錄下獲取時會得到調用,沒有太大的意義,可以設置異常處理。

隨機新聞
急速赛车收