Smarty是一個php模板引擎,它分開了邏輯程式和外在的內容,提供了一種易於管理的方法.
Smarty要求web伺服器運行php4.0.6和以上版本.
smarty安裝需要smarty庫檔案。可以去官方網站http://smarty.php.net下載。
網上講了很多安裝的教程,但是我都沒有成功,所以直接把整個目錄名改為smarty直接複製到了網站所在的目錄下,然後開啟
http://網站路徑/smarty/demo/index.php,顯示正常,應該算是安裝成功了。
基本文法
所有的smarty標籤都被加上了定界符.在smarty裡,所有定界符以外的內容都是靜態,當smarty遇到了模板標籤,將嘗試解釋他們,然後再以恰當的方式輸出.
預設情況下是 {和},但它們是可定製的.定製方法是:
$smarty->left_delimiter = '<!--{';
$smarty->right_delimiter = '}-->';
1.注釋
模板注釋被*號包圍,例如 {* this is a comment *}
smarty注釋將不被輸出.它是模板內在的注釋.
2.變數
模板變數以$開頭,可以包含數字,字母和底線。
config_file變數是例外要用#變數名#的方法引用
3.函數
smarty標籤輸出一個變數或者調用某種函數.
在定界符內函數和其屬性將被處理和輸出.例如:
{funcname attr1="val" attr2="val"}.
funcname為函數的名稱比如:include等,attr1,attr2為屬性名稱,val為屬性相應的值。
在模板裡無論是內建函數還是自訂函數都有相同的文法.
內建函數將在smarty內部工作,例如 {if}, {section} 和{strip}.他們不能被修改.
自訂函數通過外掛程式機制起作用,它們是增益集函數,可以隨意修改,自行添加.
例如 {html_options} and {html_select_date}
4.屬性
靜態數值不需要加引號,布爾值(真或假)也不需要引號,可以是true,on,yes或者false,off,no. 但是字串例外.變數同樣被用到了,它們也不能加引號.
5.在字串中插入變數
只能識別數字,字母,底線和[]的組合,如果為複雜的形式需要用``將變數隔起來。比如{func var="test $foo.bar test"} 中只能識別變數$foo,要識別$foo.bar,需要寫成{func var="test `$foo.bar` test"}的格式。
6.一些保留字的顯示方法
在模板中如果要將smarty的一些保留字作為語言的內容顯示出來,比如顯示分隔字元,預設為{}的方法是: {ldelim},{rdelim} 或者{$smarty.ldelim},{$smarty.rdelim} 或者可以把{}放在{literal} .. {/literal} 中間輸出。
smarty的保留變數
{$smarty}保留變數可以被用於訪問一些特殊的模板變數.
以下是全部.
頁面請求變數
以下是訪問頁面請求變數諸如get,post,cookies,server,enviroment和session變數的例子. 例如{$smarty.server.SERVER_NAME}取得伺服器變數,{$smarty.env.PATH}取得系統內容變數path, {$smarty.request.username}取得get/post/cookies/server/env的複合變數。
{$smarty.now}變數用於訪問目前時間戳.
可以用 date_format調節器格式化輸出. 例如{$smarty.now|date_format:"%Y-%m-%d %H:%M:%S"}
{$smarty.const}
你可以直接存取PHP常量. 例如{$smarty.const._MY_CONST_VAL}
{$smarty.capture}
可以通過 {capture}..{/capture}結構 截取的輸出可以使用{$smarty} 變數訪問.
{$smarty.config}
{$smarty}變數 可以訪問已經載入的config變數.
例如 {$smarty.config.foo}就可以表示 {#foo#}.
{$smarty.section}, {$smarty.foreach}
{$smarty} 變數可以訪問'section'和'foreach'迴圈的屬性.
{$smarty.template}
顯示當前被處理的模板的名字.
{$smarty.version}
顯示smarty模板的版本
{$smarty.ldelim}
顯示左分隔字元
{$smarty.rdelim}
顯示右分隔字元
變數調節器
變數調節器用於變數,自訂函數和字串.
可以使用'|'符號和調節器名稱應用調節器.
變數調節器由賦予的參數值決定其行為.
參數由':'符號分開.
如果你用變數調節器調節陣列變數,結果是數組的每個值都被調節.如果你想要調節器調節整個數組,你必須在調節器名字前加上@符號.
例如: {$articleTitle|@count}(這將會在輸出 $articleTitle 數組裡的數目)
capitalize
將變數裡的所有單詞首字大寫. 參數值boolean型決定帶數位詞是否首字大寫。預設不大寫
count_characters
計算變數值裡的字元數.參數值boolean型決定是否計算空格數。預設不計算空格
cat
將cat裡的參數值串連到給定的變數後面.預設為空白。
count_paragraphs
計算變數裡的段落數量
count_sentences
計算變數裡句子的數量
count_words
計算變數裡的詞數
date_format
日期格式
第一個參數控制日期格式.
如果傳給date_format的資料是空的,將使用第二個參數作為預設時間
%a - 星期幾的簡寫
%A - 星期幾的全寫
%b - 月份的簡寫
%B - 月份的全寫
%c - 日期時間06/12/05 11:15:10
%C - 世紀時間
%d - 一個月的第幾號(從 01 到 31)
%D - 同 %m/%d/%y
%e - 一個月的第幾號,號為單數則前面加一空格 (從 1 到 31)
%g - 世紀
%G - 世紀 [0000,9999]
%h - 同%b
%H - 24小時形式的小時(從00到23)
%I - 12小時形式的小時(從01到 12)
%j - 一年中的第幾天(從 001 到 366)
%k - 24小時形式的小時,單數字前面加空格. (從 0 到 23)
%l - 12小時形式的小時,單數字前面加空格.(range 1 to 12)
%m - 月份 (range 01 to 12)
%M - 分
%n - 分行符號
%p - 顯示早上還是下午`am' 或 `pm'
%r - a.m. 或 p.m.形式的時間
%R - 24小時形式的時間
%S - 秒
%t - tab符號
%T - 同%H:%M:%S
%u - 用 [1,7],表示星期幾
%U - 計算是該年的第幾個星期,從該年的第一個星期天開始計算
%V - 計算是該年的第幾個星期, 從 01 到 53, 第一個星期必須至少有4天在這一年, 星期天作為這個星期的第一天
%w - 用數位形式表示是星期的第幾天, 星期天 為 0
%W - 用數位形式是該年的第幾個星期,從該年的第一個星期一開始計算
%x - 顯示日期:月/日/年
%X - 顯示時間:小時:分鐘:秒
%y - 不包括世紀的年份
%Y - 包括世紀的年份
%Z - 時區
%% - 輸出%
其中有些有時不能正常輸出。
default
預設
為空白變數設定一個預設值.
當變數為空白或者未分配的時候,將由給定的預設值替代輸出.
escape
轉碼
參數值為html,htmlall,url,quotes,hex,hexentity,javascript。預設是html轉碼
indent
縮排
在每行縮排字串,第一個參數指定縮排多少個字元,預設是4個字元.第二個參數,指定縮排用什麼字元代替。
lower
小寫
This is used to lowercase a variable.
將變數字串小寫
nl2br
分行符號替換成<br />
regex_replace
正則替換
尋找和替換Regex.必須有兩個參數,參數1是替換Regex. 參數2使用什麼文本字串來替換
replace
替換
簡單的搜尋和替換字串必須有兩個參數,參數1是將被替換的字串. 參數2是用來替換的文本
spacify
spacify是在字串的每個字元之間插入空格或者其他的字串. 參數表示將在兩個字元之間插入的字串,預設為一個空格。
string_format 字串格式化
是一種格式化浮點數的方法.例如十進位數.使用sprintf文法格式化。參數是必須的,規定使用的格式化方式。%d表示顯示整數,%.2f表示截取兩個浮點數。
strip 去除(多餘空格)
替換所有重複的空格,換行和tab為單個或者指定的字串. 如果有參數則是指定的字串。
strip_tags 去除所有html標籤
truncate 截取
參數1,規定截取的字元數.預設是80個.
第二個參數指定在截取的那段字串後加上什麼字元.預設為...
第三個參數決定是否精確截取,預設情況下為false,則smarty不會分割單詞。
upper 將變數改為大寫
wordwrap 行寬約束
第一個參數指定段落的寬度(也就是多少個字元一行,超過這個字元數換行).預設80.
第二個參數指定在約束點使用什麼字元(預設是分行符號\n).
第三個參數決定是否精確截取字元,預設情況下是不精確截取,就是截取時不能分開單詞。
內建函數
內建函數不能擅自修改。
capture
capture函數的作用是收集模板輸出的資料到一個變數裡,而不是把它們輸出到頁面.例如任何在 {capture name="foo"}和{/capture}之間的資料都被收到了由函數的名稱屬性指定的變數{$foo}裡,或者{$smarty.capture.foo}裡。如果函數沒有名字屬性,將使用"default".每個{capture}都必須對應{/capture},也不能嵌套使用capture函數。
config_load
引用設定檔
file是必須的,說明要包含進來的設定檔名稱,section說明要載入的部分的名稱,scope被處理的變數的範圍.必須是local,parent或者global.
local的意思是變數將在本模板裡被載入.
parent 的意思是變數將在本模板和上級模板被載入.
global的意思是變數將應用到所有的模板.預設為local。變數是否在上級模板可視,預設為no。如果scope屬性已經有了,這個值將被忽略.
foreach,foreachelse
foreach迴圈是選擇性的section迴圈.用於遍曆關聯陣列.foreach的文法比section簡單的多,但是作為一個折中它只能用於簡單數組.
foreach必須的參數是from和item. from變數表示需要迴圈的數組的名稱,item表示當前元素的變數名,key表示當前關鍵字的變數名,name表示訪問foreach屬性的foreach迴圈名。迴圈可以互相嵌套,被嵌套的迴圈之間的名字必須是獨立的.foreachelse 在from變數沒有值的時候被執行
include
用來引用其他的模板。
file屬性是必須的用來表示所引用模板的名字,assign表示include檔案將要分配的輸出的變數。你可以自行用屬性名稱="屬性值"的方式定義任意個局部變數。
include_php
用來在模板中引入php指令碼。file是必須的用來表示php指令碼的路徑,once確定如果在模板中引用了php指令碼多次,是否只裝載一次。預設為true。
insert
用來包含php指令碼中的函數,name是必須的,表示所插入的指令碼的名稱,注意如果名稱是name,則包含的函數則是insert_name(),所以所有要插入的函數要有首碼insert_ 。如果用了assign屬性,則insert的輸出將會分配給模板變數而不會顯示。 script表示要引用的指令碼路徑。這個程式產生的內容將不會被緩衝,在每次調用該頁時重新執行,適用於廣告,投票,查詢結果等互動的地方。
if,elseif,else
if語句和和條件同php差不多,但每個詞之間必須用空格分割開。也有一些新的條件陳述式,列舉如下:eq相等,ne、neq不相等,gt大於,lt小於,gte、ge大於等於,lte、le 小於等於,not非,mod求模。is [not] div by是否能被某數整除,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
php
php標記可以讓模板中能直接使用php語言。
section,sectionelse
section用來迴圈顯示數組的資料,name和loop是必須的參數。name表示嵌套名. section 可以嵌套使用,但是名字必須各不相同。loop表示迴圈的次數. sectionelse在loop參數為空白的輸出。start用來規定迴圈開始的指標,如果值為負則從數組尾部計算開始的指標,預設為0.step表示迴圈的步數,為負則反向迴圈,預設為1.max設定迴圈的最大步數.show決定是否顯示section.
section也有自己的變數處理section屬性,用{$smarty.section.sectionname.varname} 來顯示.
index
index用來顯示當前迴圈的指標,從0開始.
index_prev
用來顯示前一次迴圈的指標,從-1開始
index_next
用來顯示後一次迴圈的指標.
iteration
顯示當前迴圈的次數,從1開始.
first
如果當前迴圈為第一個迴圈,則值為true.
last
如果當前迴圈為最後一個迴圈,則值為true.
rownum
同iteration.
loop
顯示最後一次迴圈的指標,可以用在section中間的任何地方,也可以用在section之後.
show
show 決定是否顯示section.
total
顯示總共迴圈的次數,可以用在section中間的任何地方,也可以用在section之後.
strip
去掉多餘的空格
常規函數
assign
assign用來在執行模板時分配變數值.var,value是必須的參數.var為要分配值的變數名,value為分配的值.
counter
counter用來輸出一個計數. 可以用多個計數,但是名字必須各不相同.name表示計數器名,預設為default.start表示計數的初始值,預設為1.skip計數的間隔,預設為1.direction表示計數方向,up或down,預設為up.print表示是否列印該值,預設為true.assign定義模板變數,計數器的輸出將被分配到assign定義的變數中.
cycle
Cycle用來迴圈顯示一組數值.name表示cycle名,values("值1","值2",...)表示迴圈顯示的一組數值.print表示是否顯示.advance決定是否顯示下一個數值. delimiter決定value的分隔字元,預設為逗號. assign定義模板變數,cycle的輸出將被分配到assign定義的變數中.
debug
debug可以顯示所有分配了值的變數,但是不顯示模板內容,output屬性決定顯示的格式html或javascript,預設是html.
eval
eval用來在變數裡插入變數。var是插入的變數名,assign把輸出分配給一個變數。
fetch
用來取得檔案內容,並輸出檔案內容,可以取得本地檔案,http檔案和ftp檔案,file是取得檔案的路徑, assign把輸出分配給一個變數。
html_checkboxes
html_checkbox用來用給定的資料建立checkbox。name表示checkbox的名稱,values表示checkbox的值,output表示checkbox的顯示,selected表示被選選項的值,options表示一組checkbox的值和顯示,separator表示分割每個checkbox的符號,labels表示給輸出添加標籤,預設為true。
html_image
html_image用來為一個圖片建立html標籤,如果height和width不分配值將會自動產生。file是圖片的路徑,height,width,alt同html標籤,basedir是圖片相對路徑開始的目錄的路徑,預設為伺服器根目錄。href定義圖片的連結。
html_options
輸出下拉式清單,參數有name,values,output,selected,options。
html_radios
輸出單選框,參數同複選框。
html_select_date
prefix定義各個下拉式清單名字的首碼,預設為Date_。time決定使用的時間,預設是目前時間。start_year決定下拉式清單開始的年份,可以用年份表示,也可以用與當前年份的相對年數來表示。預設是當前年份。end_year決定下拉式清單結束的年份,可以用年份表示,也可以用與當前年份的相對年數來表示。預設是當前年份。display_days決定是否顯示日期。display_months決定是否顯示月份。display_years決定是否顯示年份。month_format決定顯示月份的格式,預設為%B。day_format決定顯示日期的格式,預設為%02d。day_value_format決定日期值的格式,預設為%d。month_value_format決定月份值的格式,預設為%m。year_as_text決定是否將年份按文字格式設定輸出。reverse_years決定是否反向輸出各年份。field_array用來取得一組變數,可以用name[Day],name[Month],name[Year]的方式從form取得獲得的值。day_size,month_size,year_size添加大小標籤。all_extra,day_extra,month_extra,year_extra添加額外的屬性到select或input標籤。field_order決定年月日下拉式清單的順序,預設為MDY。field_separator不同下拉式清單之間的分隔字元,預設是\n。year_empty,month_empty,day_empty是在各下拉式清單第一欄顯示的內容。
html_select_time
prefix定義各個下拉式清單名字的首碼,預設為Time_。time決定使用的時間,預設是目前時間。display_hours決定是否顯示小時。display_minutes決定是否顯示分鐘。display_seconds決定是否顯示秒數。display_meridian 決定是否顯示上午或下午,即顯示am/pm。use_24_hours 決定是否24小時制。minute_interval 決定分鐘之間的間隔。second_interval 決定秒數之間的間隔。field_array用來取得一組變數,可以用name[Hour],name[Minute],name[Second]的方式從form取得獲得的值。all_extra,hour_extra,minute_extra,second_extra ,meridian_extra添加額外的屬性到select或input標籤。
html_table
loop定義用於迴圈的一組資料。cols決定列的數目,rows決定行的數目,如果其中一個為空白,另一個有值,則根據元素個數和有值的屬性來計算另一個的值,兩者的預設值為3。inner決定元素的列舉方向cols則列跟著列排列,rows則行跟著行排列,預設為cols。table_attr,tr_attr,td_attr分別為table,tr,td增加標籤,如果tr_attr,td_attr是數組,將會迴圈增加標籤。trailpad用來填充最後一行沒有值的儲存格,預設是 。hdir決定每行元素的排列方向,從左至右right或從右至左left,預設為right。vdir決定每列的排列方向,從上到下down或從下到上up,預設為down。
math
進行數字運算操作。equation和var是必須的。equation定義運算式,可以使用的運算子有+, -, /, *, abs, ceil, cos, exp, floor, log, log10, max, min, pi, pow, rand, round, sin, sqrt, srans and tan。var給運算變數賦值。format確定結果的格式。assign將輸出賦給一個參數。
mailto
使用mailto函數能使網路蜘蛛很難擷取你的email地址,但是能在網頁上正常顯示,因為他把email地址進行了加密處理。address是必須的,定義email地址。text是顯示在頁面上的常值內容,預設是email地址。encode是加密email地址的方式,可以是none,hex或javascript,預設是none。如果要把郵件發給其他的郵箱,可以用cc抄送,email地址之間用,分割。bcc則為密件副本。subject是郵件主題。newsgroups是發表內容的新聞群組,新聞群組之間用,隔開。extra添加附加標籤。followupto意思不知。
textformat
textformat用來格式化文本,他會去掉空格和特殊字元,和規定行寬和縮排。style規定當前的格式,indent規定縮排的位元。indent_first規定第一行的縮排。indent_char用來縮排的字元,預設是一個空格。wrap規定行寬,即一行的字元數,預設是80。wrap_char規定每行的分隔字元,預設是\n。wrap_cut決定是否分割單詞。assign將輸出分配給變數。
常量
SMARTY_DIR
是到smarty類目錄的完全路徑,必須以/結束。如果沒有定義,將會自動決定路徑.
SMARTY_CORE_DIR
是到smarty類core檔案目錄的完全路徑,必須以/結束。如果沒有定義,將會自動定義為smarty_dir路徑下面的子目錄.
變數
$template_dir
預設的模板目錄名,預設為"./templates".
$compile_dir
預設的編譯模板目錄名,預設為"./templates_c"
$config_dir
預設的config檔案目錄名,預設為"./configs".
$plugins_dir
預設的外掛程式目錄名,預設為"plugins".
$debugging
debugging控制台。即一個顯示變數的視窗.
$debug_tpl
debug視窗的模板
$debugging_ctrl
另一種控制debugging的方法。
$autoload_filters
對所有的模板使用過濾程式,這個變數是一個數組,其中關鍵字是過濾的類型,值是過濾的名字。
$compile_check
每次php執行將是否查看模板的內容是否改變。
$caching
決定是否快取檔案執行產生的檔案。
$cache_dir
預設的模板緩衝目錄名,預設為"./cache".
$cache_lifetime
緩衝的模板的到期時間,以秒計算. $caching值為-1則緩衝的模板永不到期.
最後我放個我用的例子.大家僅做一個參考吧
<?php
error_reporting(7);
$TurnDot = substr(PHP_OS, 0, 3) == 'WIN' ? ";" : ":" ;
$doc_root=$_SERVER['DOCUMENT_ROOT']; //預設擷取根路徑
//$doc_root="E:/Myweb/an-cool.com/Web" ; //這裡是指定路徑
$lib_root=".".$TurnDot.$doc_root."/shopadmin".$TurnDot.$doc_root."/shopadmin/inc".$TurnDot.$doc_root."/".$TurnDot.$doc_root."/jpgraph/src/".$TurnDot.$doc_root."/Smarty/libs/".$TurnDot.$doc_root."/Smarty";
ini_set("include_path",$lib_root);
include("conf.global.php"); //這裡是裝載一個全域設定檔.
$Templates_root = $doc_root."/templates"; //定義摸版根目錄
define("Templates",$Templates_root);
$templates = isset($INFO['templates']) ? $INFO['templates'] : 'default' ;
include_once('Smarty.class.php');
$tpl = new Smarty(); //建立smarty執行個體對象$tpl
$tpl->debugging = false;
$tpl->template_dir = Templates."/".$templates ; //設定模板目錄
$tpl->compile_dir = Templates."/".$templates ."/templates_c"; //設定編譯目錄
$tpl->cache_dir = $doc_root."/cache"; //設定緩衝目錄
$tpl->cache_lifetime = 60 * 60 * 24; //設定緩衝時間
$tpl->cache_lifetime = 0; //設定緩衝時間
$tpl->caching = false; //這裡是調試時設為false,發布時請使用true
$tpl->left_delimiter = '<{';
$tpl->right_delimiter= '}>';
$tpl->assign("template_dir", $INFO['site_url']."/templates/".$templates ); //摸板路徑
$tpl->assign("Site_Url", $INFO['site_url']); //主站URL
$tpl->assign("LanguageIs", $INFO['IS']); //語言套件類型
$tpl->assign("HtmlTitle", $INFO['site_title']); //TITLE內容
$tpl->assign("HtmlMeta", $INFO['meta_keyword']); //META內容
?>