smarty手冊

 

Smarty 教 程 
Copyright © by ispi of Lincoln, Inc. - 05/05/2007
1
i
目 錄 
1、  模板設計................................................................................................................1
1.  基本語法................................................................................................................................................... 1 
Comments [註釋]................................................................................................................................. 1 
Functions [函數]................................................................................................................................... 1 
Attributes [屬性]................................................................................................................................... 1 
Embedding Vars in Double Quotes [雙引號裏值的嵌入].......................................................... 2 
Math[數學運算]...................................................................................................................................... 2 
2.  變量........................................................................................................................................................... 3 
Variables assigned from PHP [從PHP分配的變量]..................................................................... 3 
Associative arrays [關聯數組]................................................................................................... 4 
Array indexes[數組下標]............................................................................................................. 4 
Objects[對象]................................................................................................................................. 5 
Variables loaded from config files [從配置文件讀取的變量].................................................... 6 
{$smarty} reserved variable [{$smarty}保留變量].................................................................... 7 
Request variables[頁面請求變量]............................................................................................. 7 
{$smarty.now}.............................................................................................................................. 8
{$smarty.const}............................................................................................................................ 8 
{$smarty.capture}........................................................................................................................ 9 
{$smarty.config}.......................................................................................................................... 9 
{$smarty.section}, {$smarty.foreach}................................................................................... 9 
ii
{$smarty.template}..................................................................................................................... 9 
3.  Variable Modifiers [變量調節器].................................................................................................... 10 
capitalize [全部單詞首字符大寫].............................................................................................. 10 
count_characters[字符計數].................................................................................................... 11 
cat[鏈接字符串]............................................................................................................................ 12 
count_paragraphs[計算段數].................................................................................................. 12 
count_sentences[計算句數]..................................................................................................... 13 
count_words[計算詞數]............................................................................................................. 13 
date_format[格式化日期].......................................................................................................... 14 
default[默認值]............................................................................................................................ 15 
escape[編碼]................................................................................................................................. 16 
indent[縮進]................................................................................................................................. 17 
lower [小寫].................................................................................................................................. 18 
nl2br [換行符替換成<br />]..................................................................................................... 19 
regex_replace [正則替換]......................................................................................................... 19 
replace [替換].............................................................................................................................. 20 
spacify [插空]...............................................................................................................................21 
string_format [字符串格式化].................................................................................................. 22 
strip [去除(多餘空格)]................................................................................................................. 22 
strip_tags [去除html標籤]........................................................................................................ 23 
truncate [截取]............................................................................................................................ 24 
upper [大寫]................................................................................................................................. 25 
wordwrap [行寬約束]................................................................................................................. 26 
iii
4.  Combining Modifiers [組合使用變量調節器].............................................................................. 27 
5.  Built-in Functions [內建函數].......................................................................................................... 28 
capture [獲取頁面輸出].............................................................................................................. 28 
config_load [配置加載].............................................................................................................. 29 
foreach,foreachelse [循環處理數組]...................................................................................... 31 
include [包含文件]...................................................................................................................... 36 
include_php [包含PHP腳本].................................................................................................... 37 
insert [插入函數]......................................................................................................................... 38 
if,elseif,else.................................................................................................................................. 40 
ldelim,rdelim [輸出分隔符]....................................................................................................... 42 
literal [文本處理].......................................................................................................................... 42 
php [嵌入php腳本]..................................................................................................................... 43 
section,sectionelse [遍歷數組]............................................................................................... 43 
strip [去處首尾空格和回車]........................................................................................................ 55 
6.  Custom Functions[自定義函數]...................................................................................................... 56 
assign [爲模板變量賦值]............................................................................................................ 56 
counter [計數]............................................................................................................................. 56
cycle [輪轉使用值]....................................................................................................................... 58 
debug [調試輸出]........................................................................................................................ 59 
eval................................................................................................................................................. 60 
fetch [取文件、HTTP、FTP]..................................................................................................... 61 
html_checkboxes [html 複選框]............................................................................................ 62 
html_image [html 圖片].......................................................................................................... 64 
iv
html_options [html下拉列表]................................................................................................. 65 
html_radios [html 單選框]...................................................................................................... 67 
html_select_date [html 日期下拉列表]................................................................................. 69 
html_select_time [html 時間下拉列表]................................................................................ 74 
html_table [html 製表]............................................................................................................ 79 
math [數學運算]........................................................................................................................... 81 
mailto............................................................................................................................................ 82 
popup_init.................................................................................................................................... 84 
popup [建立javascript彈出窗口]............................................................................................. 85 
textformat [文本格式化]........................................................................................................... 91 
7.  Config Files [配置文件]..................................................................................................................... 95 
8.  Debugging Console [調試控制檯]................................................................................................. 97 
2、  Smarty For Programmers [程序員篇].............................................................98
9.  Constants [常量]................................................................................................................................. 98 
SMARTY_DIR [Smarty目錄].................................................................................................... 98 
10.  Variables [變量]........................................................................................................................... 98 
$template_dir [模板目錄變量]................................................................................................. 98 
$compile_dir [編譯目錄變量]................................................................................................... 98 
$config_dir [配置目錄變量]....................................................................................................... 99 
$plugins_dir [插件目錄變量]..................................................................................................... 99 
$debugging [調試變量]............................................................................................................. 99 
$debug_tpl [調試模板變量].................................................................................................... 100 
$debugging_ctrl [調試控制變量].......................................................................................... 100 
v
$global_assign [全局配置變量].............................................................................................. 100 
$undefined [未定義變量]........................................................................................................ 100 
$autoload_filters [自動加載過濾器變量]............................................................................. 101 
$compile_check [編譯檢查變量]............................................................................................ 101 
$force_compile [強迫編譯變量]............................................................................................. 101 
$caching [緩存變量]................................................................................................................. 102 
$cache_dir [緩存目錄變量]...................................................................................................... 102 
$cache_lifetime [緩存生存時間變量].................................................................................... 102 
$cache_handler_func [緩存處理函數變量].......................................................................... 103 
$cache_modified_check [緩存修正檢查變量].................................................................... 103 
$config_overwrite [配置覆蓋變量]....................................................................................... 103 
$config_booleanize [配置布爾化變量]................................................................................ 103 
$config_read_hidden [配置讀取隱藏變量]......................................................................... 104 
$config_fix_newlines [配置固定換行符變量]...................................................................... 104 
$default_template_handle r_func [默認模板處理函數變量].......................................... 104 
$php_handling [PHP處理變量]............................................................................................. 104 
$security [安全變量]................................................................................................................. 105 
$secure_dir [安全目錄變量].................................................................................................... 106 
$security_settings [安全配置變量]....................................................................................... 106 
$trusted_dir [信任目錄變量]................................................................................................... 107 
$left_delimiter [左結束符變量].............................................................................................. 107 
$right_delimiter [右結束符變量]........................................................................................... 107 
$compiler_class [編譯類變量]................................................................................................ 107 
vi
$request_vars_order [變量順序變量]................................................................................... 107 
$request_use_auto_globals [自動全局變量]...................................................................... 108 
$compile_id [編譯ID變量]....................................................................................................... 108 
$use_sub_dirs [子目錄變量]................................................................................................... 108 
$default_modifiers [默認修正器變量]................................................................................. 108 
$default_resource_type [默認源類型變量]......................................................................... 109 
11.  Methods [方法]......................................................................................................................... 109 
append [添加]............................................................................................................................ 109
append_by_ref [引用添加]...................................................................................................... 110 
assign [賦值]...............................................................................................................................111 
assign_by_ref [引用賦值].........................................................................................................111 
clear_all_assign [清除全部賦值]............................................................................................. 112 
clear_all_cache [清除全部緩存].............................................................................................. 112 
clear_assign [清除賦值]........................................................................................................... 113 
clear_cache [清除緩存]............................................................................................................ 113 
clear_compiled_tpl [清除已編譯模板].................................................................................. 114 
clear_config [清除配置]........................................................................................................... 114 
config_load [加載配置]............................................................................................................ 115 
display [顯示]............................................................................................................................. 115 
fetch [取得輸出的內容]............................................................................................................. 117 
get_config_vars [取配置變量的值]........................................................................................ 118 
get_registered_object [取得已註冊的對象]........................................................................ 119 
get_template_vars [取得模板變量的值]............................................................................... 119 
vii
is_cached [是否已被緩存]........................................................................................................ 120 
load_filter [加載過濾器]........................................................................................................... 120 
register_block [註冊一個塊]................................................................................................... 121 
register_compiler_function [註冊編譯函數]...................................................................... 122 
register_function [註冊函數]................................................................................................. 123 
register_modifier [註冊修飾器]............................................................................................. 123 
register_object [註冊對象]..................................................................................................... 124 
register_outputfilter [註冊輸出過濾器].............................................................................. 124 
register_postfilter [註冊提交過濾器]................................................................................... 125 
register_prefilter [註冊預過濾器].......................................................................................... 125 
register_resource [註冊資源]................................................................................................. 126 
trigger_error [觸發錯誤]......................................................................................................... 127 
template_exists [模板是否存在]............................................................................................ 127 
unregister_block [註銷一個塊].............................................................................................. 127 
unregister_compiler_function [註銷編譯函數]................................................................ 127 
unregister_function [註銷函數]............................................................................................ 128 
unregister_modifier [註銷修飾器]....................................................................................... 128 
unregister_object [註銷對象]................................................................................................ 128 
unregister_outputfilter [註銷輸出過濾器]......................................................................... 129 
unregister_postfilter [註銷提交過濾器].............................................................................. 129 
unregister_prefilter [註銷預過濾器].................................................................................... 129 
unregister_resource [註銷資源]........................................................................................... 129 
12.  Caching [緩存]........................................................................................................................... 130 
viii
Setting Up Caching [創建緩存]............................................................................................ 130 
Multiple Caches Per Page [每頁多個緩存]......................................................................... 133 
Cache Groups [緩存集合]....................................................................................................... 135 
Controlling Cacheability of Plugins' Output [控制插件輸出的緩衝能力]................. 136 
13.  Advanced Features [高級特徵]............................................................................................. 138 
Objects [對象]............................................................................................................................ 138
Prefilters [預過濾器]................................................................................................................. 140 
Postfilters [後過濾器]............................................................................................................... 141 
Output Filters [輸出過濾器]................................................................................................... 141 
Cache Handler Function [緩衝處理函數]........................................................................... 142 
Resources [資源]....................................................................................................................... 145 
14.  Extending Smarty With Plugins [利用插件擴展Smarty].............................................. 149 
How Plugins Work [插件如何工做]...................................................................................... 150 
Naming Conventions [命名約定]......................................................................................... 151 
Writing Plugins [編寫插件].................................................................................................... 152 
Template Functions [模板函數插件].................................................................................... 153 
Modifiers [修正器插件]............................................................................................................ 155 
Block Functions [區塊函數插件]........................................................................................... 156 
Compiler Functions [編譯函數插件].................................................................................... 158 
Prefilters/Postfilters [預濾器/補濾器插件]......................................................................... 159 
Output Filters [輸出過濾插件]............................................................................................... 161 
Resources [資源插件]............................................................................................................... 162 
Inserts [嵌入插件]..................................................................................................................... 164 
ix
3、  Appendixes [附錄]......................................................................................... 165
15.  Troubleshooting [疑難解答].................................................................................................. 165 
Smarty/PHP errors [錯誤]..................................................................................................... 165 
16.  Tips & Tricks [使用技巧和經驗]............................................................................................. 167 
Blank Variable Handling[空白變量處理]............................................................................ 167 
Default Variable Handling[默認變量處理]......................................................................... 167 
Passing variable title to header template[傳遞變量型標題給頭模板]....................... 168 
Dates[日期]................................................................................................................................. 169 
WAP/WML[WAP/WML]........................................................................................................ 170 
Componentized Templates[組合的模板]........................................................................... 171 
Obfuscating E-mail Addresses[拒絕電子郵件地址]........................................................ 173 
17.  Resources [相關資源]............................................................................................................... 174 
18.  BUGS [漏洞]................................................................................................................................174 
1
1、 模板設計 
1.  基本語法 
Comments [註釋] 
模板註釋被*號包圍,例如 {* this is a comment *} 。 
Functions [函數] 
每個 smarty 標籤輸出一個變量或者調用某種函數. 
在定界符內函數和變量將被處理和輸出. 
例如:
{funcname attr1="val" attr2="val"}. 
{$array} 
Attributes [屬性] 
大多數函數都帶有本身的屬性以便於明確說明或者修改他們的行爲.。 
smarty 函數的屬性很像 HTML 中的屬性.。 
靜態數值不須要加引號,可是字符串建議使用引號。 
若是用變量做屬性,它們也不能加引號。 
一些屬性用到了布爾值(真或假),它們不須要加引號,能夠是 true,on,yes 或者 false,off,no。 
2
例如:
{include file="header.tpl"} 
{include file=$includeFile} 
{include file=#includeFile#} 
{html_select_date display_days=yes} 
Embedding Vars in Double Quotes [雙引號裏值的嵌入] 
Smarty 能夠識別嵌入在雙引號中的只包含數字、字母、下劃線和中括號[]的變量。對於其餘的符號(句號、
對象相關的,等等)必須用兩個'`'(反引號,此符號和‘ ~ '在同一個鍵上,通常在 ESC 鍵下面一個鍵上)包
住。 
例如:
{func var="test $foo test"}  識別爲$foo 
{func var="test $foo_bar test"}  識別爲$foo_bar 
{func var="test $foo[0] test"}  識別爲$foo[0] 
{func var="test $foo[bar] test"}  識別爲$foo[bar] 
{func var="test $foo.bar test"}  識別爲$foo (而不是$foo.bar) 
{func var="test `$foo.bar` test"}  識別爲$foo.bar (用反引號"`"標記)
Math[數學運算] 
數學運算能夠直接應用於模版標記中的變量。 
例如:
{$foo+1} 
{$foo*$bar} 
{$foo->bar-$bar[1]*$baz->foo->bar()-3*7} 
{if ($foo+$bar.test%$baz*134232+10+$b+10)} 
3
{$foo|truncate:"`$fooTruncCount/$barTruncFactor-1`"} 
{assign var="foo" value="`$foo+$bar`"} 
2.  變量 
Smarty 有幾種不一樣類型的變量,變量的類型取決於被什麼符號所修飾。 
Smarty 的變量能夠直接被輸出或者做爲函數屬性和變量調節器(modifiers)的參數,或者用於內部的條
件表達式等等。 
若是要輸出一個變量,只要用定界符("{}")將它括起來就能夠。 
Variables assigned from PHP [從 PHP 分配的變量] 
調用從 PHP 分配的變量需在前加"$"符號.(同 php 同樣) 
調用模板內的 assign 函數分配的變量也是這樣.(也是用$加變量名來調用) 
例如:
index.php: 
$smarty = new Smarty;$smarty->assign('firstname', 'Doug'); 
$smarty->assign('lastLoginDate', 'January 11th, 2001'); 
$smarty->display('index.tpl'); 
index.tpl: 
Hello {$firstname}, glad to see you could make it. 
<p> 
{assign var="name" value="Bob"} 
Your last login was on {$name}. 
輸出結果:
Hello Doug, glad to see you could make it. 
4
<p> 
Your last login was on Bob. 
Associative arrays[關聯數組] 
Associative arrays [關聯數組] 
能夠經過'.'記號來引用由 PHP 分配的關聯數組變量 
例如:
index.php: 
$smarty = new Smarty; 
$smarty->assign('Contacts', 
array('fax' => '555-222-9876', 
'email' => 'zaphod@slartibartfast.com', 
'phone' => array('home' => '555-444-3333', 
'cell' => '555-111-1234'))); 
$smarty->display('index.tpl'); 
index.tpl: 
{$Contacts.fax}<br> 
{$Contacts.email}<br> 
{* you can print arrays of arrays as well *} 
{$Contacts.phone.home}<br> 
{$Contacts.phone.cell}<br> 
輸出結果:
555-222-9876<br> 
zaphod@slartibartfast.com<br> 
555-444-3333<br> 
555-111-1234<br> 
Array indexes[數組下標] 
5
能夠經過數組下標來引用數組,就像 PHP 中的語法同樣。 
例如:
index.php: 
$smarty = new Smarty; 
$smarty->assign('Contacts', 
array('555-222-9876', 
'zaphod@slartibartfast.com', 
array('555-444-3333', 
'555-111-1234'))); 
$smarty->display('index.tpl'); 
index.tpl: 
{$Contacts[0]}<br> 
{$Contacts[1]}<br> 
{* you can print arrays of arrays as well *} 
{$Contacts[2][0]}<br> 
{$Contacts[2][1]}<br> 
輸出結果:
555-222-9876<br> 
zaphod@slartibartfast.com<br> 
555-444-3333<br> 
555-111-1234<br> 
Objects[對象] 
能夠經過'->'標記來引用由 PHP 分配的對象的屬性。 
例如:
name: {$person->name}<br> 
email: {$person->email}<br> 
輸出結果: 
6
name: Zaphod Beeblebrox<br> 
email: zaphod@slartibartfast.com<br> 
Variables loaded from config files [從配置文件讀取的變量] 
配置文件中的變量須要經過用兩個"#"(嵌套在 smarty 界定符"{}"中)或者是 smarty 的保留變量
"$smarty.config."來調用,第二種語法在變量做爲屬性值並被引號括住的時候很是有用。 
{include file="#includefile#"} 這樣#includefile#將被看成字符處理,而不表示配置文件變量,但能夠
這樣表示 {include file="`$smarty.config.includefile`"}不要忘了加('`')反引號,或者用 smarty 界定
符("{}")。 
例如:
foo.conf: 
pageTitle = "This is mine" 
bodyBgColor = "#eeeeee" 
tableBorderSize = "3" 
tableBgColor = "#bbbbbb" 
rowBgColor = "#cccccc" 
index.tpl: 
{config_load file="foo.conf"} 
<html> 
<title>{#pageTitle#}</title> 
<body bgcolor="{#bodyBgColor#}"> 
<table border="{#tableBorderSize#}" bgcolor="{#tableBgColor#}"> 
<tr bgcolor="{#rowBgColor#}"> 
<td>First</td> 
<td>Last</td> 
<td>Address</td> 
</tr> 
</table> 
</body> 
</html> 
7
index.tpl: (改變語法) 
{config_load file="foo.conf"} 
<html> 
<title>{$smarty.config.pageTitle}</title> 
<body bgcolor="{$smarty.config.bodyBgColor}"> 
<table border="{$smarty.config.tableBorderSize}" bgcolor="{$smarty.config.tableBgColor}"> 
<tr bgcolor="{$smarty.config.rowBgColor}"> 
<td>First</td> 
<td>Last</td> 
<td>Address</td> 
</tr> 
</table> 
</body> 
</html> 
輸出結果:(兩種語法有一樣的輸出結果) 
<html> 
<title>This is mine</title> 
<body bgcolor="#eeeeee"> 
<table border="3" bgcolor="#bbbbbb"> 
<tr bgcolor="#cccccc"> 
<td>First</td> 
<td>Last</td> 
<td>Address</td> 
</tr> 
</table> 
</body> 
</html> 
{$smarty} reserved variable [{$smarty}保留變量] 
Request variables[頁面請求變量] 
就是 get,post,server,session 等變量,能夠訪問頁面請求的變量,例如 get, post, cookies, server, 
environment, session ...... 
8
例如:
{* 顯示來自URL(GET)page的變量的值URL (GET) http://www.domain.com/index.php?page=foo *} 
{$smarty.get.page} 
{* 顯示來自一個表單(POST)的變量"page" *} 
{$smarty.post.page} 
{* 顯示cookie "username"的值*} 
{$smarty.cookies.username} 
{* 顯示server變量"SERVER_NAME" *} 
{$smarty.server.SERVER_NAME} 
{* 顯示系統環境(env)的變量"PATH" *} 
{$smarty.env.PATH} 
{* 顯示PHP session變量"id" *} 
{$smarty.session.id} 
{* 顯示來自get/post/cookies/server/env的變量"username" *} 
{$smarty.request.username} 
{$smarty.now} 
能夠經過{$smarty.now}來訪問當前的時間戳(timestamp),能夠經過 date_format 變量調節器來爲特
定的輸出做處理。 
例如: 
{$smarty.now|date_format:"%Y-%m-%d %H:%M:%S"} 
{$smarty.const} 
9
能夠經過{$smarty.const}來直接訪問 PHP 常量 
例如: 
{$smarty.const._MY_CONST_VAL} 
{$smarty.capture} 
輸出獲取經過 {capture}..{/capture}結構能夠訪問用於{$smarty}的變量......???不明白。。。 
The output captured via {capture}..{/capture} construct can be accessed using {$smarty} variable. 
See section on capture for an example. 
{$smarty.config} 
{$smarty}變量能夠用於引用裝入的 config 變量,{$smarty.config.foo}等價於{#foo#},參考 
config_load 部分。 
{$smarty.section}, {$smarty.foreach} 
{$smarty}變量能夠用於引用 'section' 和 'foreach'循環的變量,參考 section 和 foreach 文檔。 
{$smarty.template} 
10
該變量包含當前正在被處理的模版的名字(文件名)。 
3.  Variable Modifiers [變量調節器] 
變量調節器用於變量,自定義函數和字符串。使用"|"符號分割被處理的變量,自定義函數或字符串和變量
調節器。變量調節器由賦予的參數值決定其行爲。參數由":"符號分開。 
語法: 
{被處理的變量,自定義函數或字符串 | 變量調節器名:變量調節器參數 1:變量調節器參數 2:......} 
若是給數組變量應用單值變量的調節,結果是數組的每一個值都被調節。若是隻想要調節器用一個值調節整
個數組,必須在調節器名字前加上@符號。 
例如:
{$articleTitle|@count}(這將會在$articleTitle 數組裏輸出元素的數目)
capitalize [全部單詞首字符大寫] 
將變量裏的全部單詞首字大寫。 
例如:
index.php: 
11
$smarty = new Smarty; 
$smarty->assign('articleTitle', 'Police begin campaign to rundown jaywalkers.'); 
$smarty->display('index.tpl'); 
index.tpl: 
{$articleTitle} 
{$articleTitle|capitalize} 
輸出結果:
Police begin campaign to rundown jaywalkers. 
Police Begin Campaign To Rundown Jaywalkers. 
count_characters[字符計數] 
參數位置 類型 是否必須 默認值 變量描述 
1 boolean No false  決定是否計算空格字符。 
例如:
index.php: 
$smarty = new Smarty; 
$smarty->assign('articleTitle', 'Cold Wave Linked to Temperatures.'); 
$smarty->display('index.tpl'); 
index.tpl: 
{$articleTitle} 
{$articleTitle|count_characters} 
{$articleTitle|count_characters:true} 
OUTPUT輸出: 
Cold Wave Linked to Temperatures. 
29 
33 
12
cat[鏈接字符串] 
參數位置 類型 是否必須 默認值 變量描述 
1 string No empty  將參數值鏈接到給定的變量後面. 
例如:
index.php: 
$smarty = new Smarty; 
$smarty->assign('articleTitle', "Psychics predict world didn't end"); 
$smarty->display('index.tpl'); 
index.tpl: 
{$articleTitle|cat:" yesterday."} 
輸出結果:
Psychics predict world didn't end yesterday. 
count_paragraphs[計算段數] 
計算變量裏的段落數量。 
例如:
index.php: 
$smarty = new Smarty; 
$smarty->assign('articleTitle', "War Dims Hope for Peace. Child's Death Ruins 
Couple's Holiday.\n\nMan is Fatally Slain. Death Causes Loneliness, Feeling of Isolation."); 
$smarty->display('index.tpl'); 
13
index.tpl: 
{$articleTitle} 
{$articleTitle|count_paragraphs} 
輸出結果:
War Dims Hope for Peace. Child's Death Ruins Couple's Holiday. 
Man is Fatally Slain. Death Causes Loneliness, Feeling of Isolation. 
2 
count_sentences[計算句數] 
計算變量裏句子的數量(統計變量中". "的數量)。 
例如:
index.php: 
$smarty = new Smarty; 
$smarty->assign('articleTitle', 'Two Soviet Ships Collide - One Dies. Enraged Cow Injures Farmer with Axe.'); 
$smarty->display('index.tpl'); 
index.tpl: 
{$articleTitle} 
{$articleTitle|count_sentences} 
輸出結果:
Two Soviet Ships Collide - One Dies. Enraged Cow Injures Farmer with Axe. 
2 
count_words[計算詞數] 
計算變量裏的詞數。 
14
例如:
index.php: 
$smarty = new Smarty; 
$smarty->assign('articleTitle', 'Dealers Will Hear Car Talk at Noon.'); 
$smarty->display('index.tpl'); 
index.tpl: 
{$articleTitle} 
{$articleTitle|count_words} 
輸出結果:
Dealers Will Hear Car Talk at Noon. 
7 
date_format[格式化日期] 
參數位置 類型 是否必須 默認值 變量描述 
1 string No %b %e, %Y  輸出日期的格式。 
2 string No n/a  輸入爲空時的默認時間格式。 
格式化從 php 函數 strftime()得到的時間和日期。 
Unix 或者 mysql 等的時間戳記(parsable by strtotime)均可以傳遞到 smarty。 
設計者可使用 date_format 徹底控制日期格式。 
若是傳給 date_format 的數據是空的,將使用第二個參數做爲時間格式。 ?????? 不明白。。。 
date_format 本質上是 php 的 strftime()函數的一個包裝。 
當 php 被編譯的時候你能夠或多或少的依靠系統的 strftime()轉換有效的區分符。 
能夠查看系統手冊的有效區分符的全表. 
15
例如:
index.php: 
$smarty = new Smarty; 
$smarty->assign('yesterday', strtotime('-1 day')); 
$smarty->display('index.tpl'); 
index.tpl: 
{$smarty.now|date_format} 
{$smarty.now|date_format:"%A, %B %e, %Y"} 
{$smarty.now|date_format:"%H:%M:%S"} 
{$yesterday|date_format} 
{$yesterday|date_format:"%A, %B %e, %Y"} 
{$yesterday|date_format:"%H:%M:%S"} 
輸出結果:
Feb 6, 2001 
Tuesday, February 6, 2001 
14:33:00 
Feb 5, 2001 
Monday, February 5, 2001 
14:33:00 
default[默認值] 
參數位置 類型 是否必須 默認值 變量描述 
1 string No empty  變量爲空的時候的默認輸出。 
爲空變量設置一個默認值,當變量爲空或者未分配的時候,將由給定的默認值替代輸出。 
例如:
index.php: 
16
$smarty = new Smarty; 
$smarty->assign('articleTitle', 'Dealers Will Hear Car Talk at Noon.'); 
$smarty->display('index.tpl'); 
index.tpl: 
{$articleTitle|default:"no title"} 
{$myTitle|default:"no title"} 
輸出結果:
Dealers Will Hear Car Talk at Noon. 
no title 
escape[編碼] 
參數位置 類型 是否必須 可能的值  默認值 變量描述 
1 string No html,htmlall,url,quotes, html 使
用何種編 
hex,hexentity,javascript  碼格式。 
用於 html 轉碼,url 轉碼,在沒有轉碼的變量上轉換單引號,十六進制轉碼,十六進制美化,或者 javascript 轉
碼。默認是 html 轉碼。 
例如:
index.php: 
$smarty = new Smarty; 
$smarty->assign('articleTitle', "'Stiff Opposition Expected to Casketless Funeral Plan'"); 
$smarty->display('index.tpl'); 
index.tpl: 
17
{$articleTitle} 
{$articleTitle|escape} 
{$articleTitle|escape:"html"} {* 轉換& " ' < > 標記*} 
{$articleTitle|escape:"htmlall"} {* 轉換所有HTML實體標記*} 
{$articleTitle|escape:"url"} {* 轉換爲url格式*} 
{$articleTitle|escape:"quotes"} {* 轉換爲引用格式*} 
<a href="mailto:{$EmailAddress|escape:"hex"}">{$EmailAddress|escape:"hexentity"}</a> 
輸出結果:
'Stiff Opposition Expected to Casketless Funeral Plan' 
&#039;Stiff Opposition Expected to Casketless Funeral Plan&#039; 
&#039;Stiff Opposition Expected to Casketless Funeral Plan&#039; 
&#039;Stiff Opposition Expected to Casketless Funeral Plan&#039; 
%27Stiff+Opposition+Expected+to+Casketless+Funeral+Plan%27 
\'Stiff Opposition Expected to Casketless Funeral Plan\' 
<a 
href="mailto:%62%6f%62%40%6d%65%2e%6e%65%74">&#x62;&#x6f;&#x62;&#x40;&#x6d;&#x65;&#x2e;
&#x6e;&#x65;&#x74;</a> 
indent[縮進] 
參數位置 類型 是否必須 默認值 變量描述 
1 integer No 4  決定縮進多少個字符。 
2 string No  一個空格 使用什麼字符來代替縮進。 
在每行縮進字符串,默認是 4 個字符。做爲可選參數,能夠指定縮進字符數。做爲第二個可選參數,你可
以指定縮進用什麼字符代替。使用縮進時若是是在 HTML 中,則須要使用&nbsp; (空格) 來代替縮進,否
則沒有效果。 
例如:
index.php: 
$smarty = new Smarty; 
18
$smarty->assign('articleTitle', 'NJ judge to rule on nude beach.'); 
$smarty->display('index.tpl'); 
index.tpl: 
{$articleTitle} 
{$articleTitle|indent} 
{$articleTitle|indent:10} 
{$articleTitle|indent:1:"\t"} 
輸出結果:
NJ judge to rule on nude beach. 
Sun or rain expected today, dark tonight. 
Statistics show that teen pregnancy drops off significantly after 25. 
NJ judge to rule on nude beach. 
Sun or rain expected today, dark tonight. 
Statistics show that teen pregnancy drops off significantly after 25. 
NJ judge to rule on nude beach. 
Sun or rain expected today, dark tonight. 
Statistics show that teen pregnancy drops off significantly after 25. 
NJ judge to rule on nude beach. 
Sun or rain expected today, dark tonight. 
Statistics show that teen pregnancy drops off significantly after 25. 
lower [小寫] 
將變量字符串小寫。 
例如:
index.php: 
$smarty = new Smarty; 
$smarty->assign('articleTitle', 'Two Convicts Evade Noose, Jury Hung.'); 
$smarty->display('index.tpl'); 
index.tpl: 
{$articleTitle} 
{$articleTitle|lower} 
19
輸出結果:
Two Convicts Evade Noose, Jury Hung. 
two convicts evade noose, jury hung. 
nl2br [換行符替換成<br />] 
全部的換行符將被替換成 <br />.功能同 PHP 中的 nl2br()函數同樣。 
例如:
index.php: 
$smarty = new Smarty; 
$smarty->assign('articleTitle', "Sun or rain expected\ntoday, dark tonight"); 
$smarty->display('index.tpl'); 
index.tpl: 
{$articleTitle|nl2br} 
輸出結果:
Sun or rain expected<br />today, dark tonight 
regex_replace [正則替換] 
參數位置 類型 是否必須 默認值 變量描述 
1 string Yes n/a  替換正則表達式 
2 string Yes n/a  用來替換的文本字符串 
尋找和替換正則表達式,欲使用其語法,參考 Php 手冊中的 preg_replace()函數。 
20
例如:
index.php: 
$smarty = new Smarty; 
$smarty->assign('articleTitle', "Infertility unlikely to\nbe passed on, experts say."); 
$smarty->display('index.tpl'); 
index.tpl: 
{* 使用空格替換每一個回車,tab,和換行符*} 
{$articleTitle} 
{$articleTitle|regex_replace:"/[\r\t\n]/":" "} 
輸出結果:
Infertility unlikely to 
be passed on, experts say. 
Infertility unlikely to be passed on, experts say. 
replace [替換] 
參數位置 類型 是否必須 默認值 變量描述 
1 string Yes n/a  被替換的文本字符串 
2 string Yes n/a  用來替換的文本字符串 
簡單的搜索和替換字符串。 
例如:
index.php: 
$smarty = new Smarty; 
$smarty->assign('articleTitle', "Child's Stool Great for Use in Garden."); 
$smarty->display('index.tpl'); 
21
index.tpl: 
{$articleTitle} 
{$articleTitle|replace:"Garden":"Vineyard"} {* 將"Garden"替換爲"Vineyard" *} 
{$articleTitle|replace:" ":" "} {* 將" "替換爲" " *} 
輸出結果:
Child's Stool Great for Use in Garden. 
Child's Stool Great for Use in Vineyard. 
Child's Stool Great for Use in Garden. 
spacify [插空] 
參數位置 類型 是否必須 默認值 變量描述 
1 string No  一個空格 在兩個字符之間插入的字符(串) 
在字符串的每一個字符之間插入空格或者其餘的字符(串)。 
例如:
index.php: 
$smarty = new Smarty; 
$smarty->assign('articleTitle', 'Something Went Wrong in Jet Crash, Experts Say.'); 
$smarty->display('index.tpl'); 
index.tpl: 
{$articleTitle} 
{$articleTitle|spacify} 
{$articleTitle|spacify:"^^"} 
輸出結果:
Something Went Wrong in Jet Crash, Experts Say. 
S o m e t h i n g W e n t W r o n g i n J e t C r a s h , E x p e r t s S a y . 
22
S^^o^^m^^e^^t^^h^^i^^n^^g^^ ^^W^^e^^n^^t^^ ^^W^^r^^o^^n^^g^^ ^^i^^n^^ ^^J^^e^^t^^ 
^^C^^r^^a^^s^^h^^,^^ ^^E^^x^^p^^e^^r^^t^^s^^ ^^S^^a^^y^^. 
string_format [字符串格式化] 
參數位置 類型 是否必須 默認值 變量描述 
1 string Yes n/a  使用的格式化方式 
是一種格式化字符串的方法,例如格式化爲十進制數等等,使用 sprintf 語法格式化。 
例如:
index.php: 
$smarty = new Smarty; 
$smarty->assign('number', 23.5787446); 
$smarty->display('index.tpl'); 
index.tpl: 
{$number} 
{$number|string_format:"%.2f"} 
{$number|string_format:"%d"} 
輸出結果:
23.5787446 
23.58 
24 
strip [去除(多餘空格)] 
參數位置 類型 是否必須 默認值 變量描述 
23
1 string No  一個空格 替換空格的字符串 
用一個空格或一個給定字符替換全部重複空格,換行和製表符。 
若是要去除模板文本中的區塊,使用 strip 函數。 
例如:
index.php: 
$smarty = new Smarty; 
$smarty->assign('articleTitle', "Grandmother of\neight makes\t hole in one."); 
$smarty->display('index.tpl'); 
index.tpl: 
{$articleTitle} 
{$articleTitle|strip} 
{$articleTitle|strip:"&nbsp;"} 
輸出結果:
Grandmother of 
eight makes hole in one. 
Grandmother of eight makes hole in one. 
Grandmother&nbsp;of&nbsp;eight&nbsp;makes&nbsp;hole&nbsp;in&nbsp;one. 
strip_tags [去除 html 標籤] 
去除<和>標籤,包括在<和>之間的任何內容。 
例如:
index.php: 
$smarty = new Smarty; 
$smarty->assign('articleTitle', "Blind Woman Gets <font face=\"helvetica\">New Kidney</font> from Dad she 
24
Hasn't Seen in <b>years</b>."); 
$smarty->display('index.tpl'); 
index.tpl: 
{$articleTitle} 
{$articleTitle|strip_tags} 
輸出結果:
Blind Woman Gets <font face="helvetica">New Kidney</font> from Dad she Hasn't Seen in <b>years</b>. 
Blind Woman Gets New Kidney from Dad she Hasn't Seen in years. 
truncate [截取] 
參數位置 類型 是否必須 默認值 變量描述 
1 integer No 80  截取字符的數量 
2 string No  ... 截取後追加在截取詞後面的字符串 
3 boolean No false  是截取到詞的邊界(假)仍是精確到字符
(真) 
從字符串開始處截取某長度的字符,默認是 80 個。 
也能夠指定第二個參數做爲追加在截取字符串後面的文本字串,該追加字串被計算在截取長度中。 
默認狀況下,smarty 會截取到一個詞的末尾(不截斷摸個單詞)。 
若是要精確的截取多少個字符,可把第三個參數改成"true"。 
例如:
index.php: 
$smarty = new Smarty; 
$smarty->assign('articleTitle', 'Two Sisters Reunite after Eighteen Years at Checkout Counter.'); 
25
$smarty->display('index.tpl'); 
index.tpl: 
{$articleTitle} 
{$articleTitle|truncate} 
{$articleTitle|truncate:30} 
{$articleTitle|truncate:30:""} 
{$articleTitle|truncate:30:"---"} 
{$articleTitle|truncate:30:"":true} 
{$articleTitle|truncate:30:"...":true} 
輸出結果:
Two Sisters Reunite after Eighteen Years at Checkout Counter. 
Two Sisters Reunite after Eighteen Years at Checkout Counter. 
Two Sisters Reunite after... 
Two Sisters Reunite after 
Two Sisters Reunite after--- 
Two Sisters Reunite after Eigh 
Two Sisters Reunite after E... 
upper [大寫] 
將變量中所有的英文字符轉換爲大寫,若是變量中包含中文字符,則忽略。 
例如:
index.php: 
$smarty = new Smarty; 
$smarty->assign('articleTitle', "If Strike isn't Settled Quickly it may Last a While."); 
$smarty->display('index.tpl'); 
index.tpl: 
{$articleTitle} 
{$articleTitle|upper} 
輸出結果:
26
If Strike isn't Settled Quickly it may Last a While. 
IF STRIKE ISN'T SETTLED QUICKLY IT MAY LAST A WHILE. 
wordwrap [行寬約束] 
參數位置 類型 是否必須 默認值 變量描述 
1 integer No 80  指定段落(句子)的寬度 
2 string No \n  使用什麼字符約束 
3 boolean No false  是約束到詞的邊界(假)仍是精確到字符
(真) 
能夠指定段落的寬度(也就是多少個字符一行,超過這個字符數換行),默認 80。 
第二個參數可選,能夠指定在約束點使用什麼字符(默認是換行符\n)。 
默認狀況下 smarty 將截取到詞尾,若是想精確到設定長度的字符,將第三個參數設爲 ture(中文會出現
亂碼!!)。 
例如:
index.php: 
$smarty = new Smarty; 
$smarty->assign('articleTitle', "Blind woman gets new kidney from dad she hasn't seen in years."); 
$smarty->display('index.tpl'); 
index.tpl: 
{$articleTitle} 
{$articleTitle|wordwrap:30} 
{$articleTitle|wordwrap:20} 
27
{$articleTitle|wordwrap:30:"<br>\n"} 
{$articleTitle|wordwrap:30:"\n":true} 
輸出結果:
Blind woman gets new kidney from dad she hasn't seen in years. 
Blind woman gets new kidney 
from dad she hasn't seen in 
years. 
Blind woman gets new 
kidney from dad she 
hasn't seen in 
years. 
Blind woman gets new kidney<br> 
from dad she hasn't seen in years. 
Blind woman gets new kidney fr 
om dad she hasn't seen in year 
s. 
4.  Combining Modifiers [組合使用變量調節器] 
對於同一個變量,你可使用多個變量調節器。它們將按照從左到右的順序依次組合使用。使用時必需要
用"|"字符做爲它們之間的分隔符。 
例如:
index.php: 
$smarty = new Smarty; 
$smarty->assign('articleTitle', 'Smokers are Productive, but Death Cuts Efficiency.'); 
$smarty->display('index.tpl'); 
index.tpl: 
{$articleTitle} 
28
{$articleTitle|upper|spacify} 
{$articleTitle|lower|spacify|truncate} 
{$articleTitle|lower|truncate:30|spacify} 
{$articleTitle|lower|spacify|truncate:30:". . ."} 
輸出結果:
Smokers are Productive, but Death Cuts Efficiency. 
S M O K E R S A R E P R O D U C T I V E , B U T D E A T H C U T S E F F I C I E N C Y . 
s m o k e r s a r e p r o d u c t i v e , b u t d e a t h c u t s... 
s m o k e r s a r e p r o d u c t i v e , b u t . . . 
s m o k e r s a r e p. . . 
5.  Built-in Functions [內建函數] 
Smarty 自帶一些內建函數,內建函數是模板語言的一部分,用戶不能建立名稱和內建函數同樣的自定義
函數,也不能修改內建函數。 
capture [獲取頁面輸出] 
屬性名 類型 是否必須 默認值 描述 
name string no default  數據採集區域名稱 
assign string no n/a  數據採集區域在哪分配給變量 
capture 函數的做用是捕獲模板輸出的數據並將其存儲到一個變量裏,而不是把它們輸出到頁面. 
任何在 {capture name="foo"}和{/capture}之間的數據將被存儲到變量$foo 中,該變量由 name 屬性指
定. 
29
在模板中經過 $smarty.capture.foo 訪問該變量. 
若是沒有指定 name 屬性,函數默認將使用 "default" 做爲參數. 
{capture}必須成對出現,即以{/capture}做爲結尾,該函數不能嵌套使用. 
警告:當但願捕獲包含{insert}命令的數據時要特別注意,若是打開了緩存並但願將{insert}命令輸出到緩
存中,不要捕獲該區域的數據。 
例如:
{* 該例在捕獲到內容後輸出一行包含數據的表格,若是沒有捕獲到就什麼也不輸出*} 
{capture name="banner"} 
{include file="get_banner.tpl"} 
{/capture} 
{if $smarty.capture.banner ne ""} {* 若是$smarty.capture.banner不等於(ne)空("")*} 
<tr> 
<td> 
{$smarty.capture.banner} 
</td> 
</tr> 
{/if} 
config_load [配置加載] 
屬性  類型  是否必須  缺省值  描述 
file  string  Yes  n/a  待包含的配置文件的
名稱 
section  string  No  n/a  配置文件中待加載部
分的名稱 
scope  string  no  local  加載數據的做用域,
30
屬性  類型  是否必須  缺省值  描述 
取值必須爲 local, 
parent 或 global. 
local 說明該變量的
做用域爲當前模板. 
parent 說明該變量
的做用域爲當前模板
和當前模板的父模板
(調用當前模板的模
板). global 說明該
變量的做用域爲全部
模板. 
global  boolean  No  No  說明加載的變量是否
全局可見,等同於 
scope=parent. 注
意: 當指定了 scope 
屬性時,能夠設置該
屬性,但模板忽略該
屬性值而以 scope 
屬性爲準。 
該函數用於從配置文件中加載變量. 更多信息請查看 [配置文件]。 
31
例如:
{config_load file="colors.conf"} 
<html> 
<title>{#pageTitle#}</title> 
<body bgcolor="{#bodyBgColor#}"> 
<table border="{#tableBorderSize#}" bgcolor="{#tableBgColor#}"> 
<tr bgcolor="{#rowBgColor#}"> 
<td>First</td> 
<td>Last</td> 
<td>Address</td> 
</tr> 
</table> 
</body> 
</html> 
配置文件有可能包含多個部分,此時可使用附加屬性 section 指定從哪一部分中取得變量。 
注意:配置文件中的 section 和模板內建函數 section 只是命名相同,絕不相干。 
foreach,foreachelse [循環處理數組] 
屬性  類型  是否必須  缺省值  描述 
from  string  Yes  n/a  待循環數組的名稱 
item  string  Yes  n/a  當前處理元素的變量
名稱 
key  string  No  n/a
當前處理元素的鍵名
name  string  No  n/a  該循環的名稱,用於
32
屬性  類型  是否必須  缺省值  描述 
訪問該循環 
foreach 是除 section 以外處理循環的另外一種方案(根據不一樣須要選擇不一樣的方案)。 
foreach 用於處理簡單數組(數組中的元素的類型一致),它的格式比 section 簡單許多,缺點是隻能處理
簡單數組。 
foreach 必須和 /foreach 成對使用,且必須指定 from 和 item 屬性。 
將 from 屬性指定的數組中的數據遍歷處理到 item 屬性指定的變量中。 
參考 foreach (array_expression as $key => $value) 
from <=> array_expression;item <=> $value;key <=> $key。 
name 屬性能夠任意指定(字母、數字和下劃線的組合)。 
foreach 能夠嵌套,但必須保證嵌套中的 foreach 名稱惟一。 
from 屬性(一般是數組)決定循環的次數。 
foreachelse 語句在 from 屬性沒有值的時候被執行。 (from 屬性所指定的值爲空時,可用 foreachelse
語句指定——不然-幹什麼) 
foreach 循環有本身的變量名,使用該變量名能夠訪問該循環. 使用方 法爲
{$smarty.foreach.foreachname.varname},其中 foreachname 即在 foreach 中指定的 name 屬性。
例如:
foreach 演示
{* 該例將輸出數組$custid 中的全部元素的值*} 
{foreach from=$custid item=curr_id} 
id: {$curr_id}<br> 
{/foreach} 
33
輸出結果:
id: 1000<br> 
id: 1001<br> 
id: 1002<br> 
foreach 鍵的演示
{* 
數組定義以下: 
$smarty->assign("contacts", array(array("phone" => "1", "fax" => "2", "cell" => "3"), 
array("phone" => "555-4444", "fax" => "555-3333", "cell" => "760-1234"))); 
*} 
{* 鍵就是數組的下標,請參看關於數組的解釋*} 
{foreach name=outer item=contact from=$contacts} 
{foreach key=key item=item from=$contact} 
{$key}: {$item}<br> 
{/foreach} 
{/foreach} 
輸出結果:
phone: 1<br> 
fax: 2<br> 
cell: 3<br> 
phone: 555-4444<br> 
fax: 555-3333<br> 
cell: 760-1234<br> 
.index 
index 包含當前數組索引,從"0"開始。 
例如:
<table> 
{foreach from=$items key=myId item=i name=foo} 
{if $smarty.foreach.foo.index % 5 ==0} {* $smarty.foreach.foo.index對5求餘*} 
<tr><th>Title</th></tr> 
{/if} 
34
<tr><td>{$i.label}</td></tr> 
{/foreach} 
</table> 
.iteration 
iteration 包含當前循環的執行次數,老是從 1 開始,每執行一次自加 1。 
例如:
{* 輸出0|1, 1|2, 2|3, ... 等等*} 
{foreach from=$myArray item=i name=foo} 
{$smarty.foreach.foo.index}|{$smarty.foreach.foo.iteration}, 
{/foreach} 
.first 
當前 foreach 循環第一次執行時 first 被設置成 true。 
例如:
{* 當循環第一次執行時顯示LATEST , o不然顯示id *} 
<table> 
{foreach from=$items key=myId item=i name=foo} 
<tr> 
<td>{if $smarty.foreach.foo.first}LATEST{else}{$myId}{/if}</td> 
<td>{$i.label}</td> 
</tr> 
{/foreach} 
</table> 
.last 
35
當前 foreach 循環執行到最後一遍時 last 被設置成 true. 
例如:
{* 在列表最後添加水平線*} 
{foreach from=$items key=part_id item=prod name=products} 
<a href="#{$part_id}">{$prod}</a>{if $smarty.foreach.products.last}<hr>{else},{/if} 
{foreachelse} 
... content ... 
{/foreach} 
.show 
show 是 foreach 的一個參數. 取值爲布爾值 true 或 false. 若是指定爲 false 該循環不顯示,若是循
環指定了 foreachelse 子句,該子句顯示與否也取決於 show 的取值. 
如何使用??? 
.total 
total 用於顯示循環執行的次數,能夠在循環中或循環執行後調用. 
例如:
{* 在最後顯示行數*} 
{foreach from=$items key=part_id item=prod name=foo} 
{$prod.label}<hr/> 
{if $smarty.foreach.foo.last} 
<div id="total">{$smarty.foreach.foo.total} items</div> 
{/if} 
{foreachelse} 
... something else ... 
36
{/foreach} 
include [包含文件] 
Include 標籤用於在當前模板中包含其它模板. 當前模板中的變量在被包含的模板中可用。 
屬性  類型  是否必須  缺省值  描述 
file  string  Yes  n/a  待包含的模板文件名
assign  string  No  n/a  該屬性指定一個變量
保存待包含模板的輸
出 
[var ...]  [var type]  No  n/a  傳遞給待包含模板的
本地參數,只在待包
含模板中有效 
必須指定 file 屬性,該屬性指明模板資源的位置。 
若是設置了 assign 屬性,該屬性對應的變量名用於保存待包含模板的輸出,這樣待包含模板的輸出就不
會直接顯示了。 
例如:
{include file="header.tpl" title="Main Menu" table_bgcolor="#c0c0c0"} 
{* 模版body *} 
{include file="footer.tpl" logo="http://my.domain.com/logo.gif"} 
37
include_php [包含 PHP 腳本] 
inluce_php 函數用於在模板中包含 php 腳本,若是設置了安全模式,被包含的腳本必須位於 
$trusted_dir 路徑下。 include_php 函數必須設置 file 屬性,該屬性指明被包含 php 文件的路徑,
能夠是 $trusted_dir 的相對路徑,也能夠是絕對路徑。 
include_php 是解決模板部件化的好方法,它使得 php 代碼從模板文件中被分離出來. 舉個例子:假設
有一個從數據庫中動態取出數據用於顯示站點導航的模板,你能夠將取得數據內容的 php 邏輯部分分離
出來保存在一個單獨的文件夾下,並在模板開始的位置包含該 php 腳本. 那麼就能夠在任何地方包含此
模板而不用擔憂以前數據庫信息是否已被程序取出. 
屬性  類型  是否必須  缺省值  描述 
file  string  Yes  n/a  待包含 php 文件的名
稱 
once  boolean  No  true  若是待包含 php 文件
已被包含是否仍然包
含(相似 php 中的
include_once 函數)
assign  string  No  n/a  該屬性指定一個變量
保存待包含 php 文件
的輸出 
38
即便是在模板中屢次地調用 php 文件,默認狀況下它們只被包含一次. 你能夠設置 once 屬性從而指明
每次調用都從新包含該文件. 若是將 once 屬性設置爲 false,每次調用該文件都將被從新包含. 
若是設置了 assign 屬性,該屬性對應的變量名用於保存待包含 php 的輸出,這樣待包含 php 文件的
輸出就不會直接顯示了。 
在待包含 php 文件中能夠經過 $this 訪問 smarty 對象. 
例如:
load_nav.php 
------------- 
<?php 
// 從mysql數據庫中取得數據,將數據賦給模板變量require_once("MySQL.class.php"); 
$sql = new MySQL; 
$sql->query("select * from site_nav_sections order by name",SQL_ALL); 
$this->assign('sections',$sql->record); 
?> 
index.tpl 
--------- 
{* 絕對路徑或$trusted_dir 的相對路徑*} 
{include_php file="/path/to/load_nav.php"} 
{foreach item="curr_section" from=$sections} 
<a href="{$curr_section.url}">{$curr_section.name}</a><br> 
{/foreach} 
insert [插入函數] 
Insert 函數相似於 inluce 函數,不一樣之處是 insert 所包含的內容不會被緩存,每次調用該模板都會重
新執行該函數. 
39
例如你在頁面上端使用一個帶有廣告條位置的模板,廣告條能夠包含任何 HTML、圖象、FLASH 等混合
信息. 所以這裏不能使用一個靜態的連接,同時咱們也不但願該廣告條被緩存. 這就須要在 insert 函數指
定:#banner_location_id# 和 #site_id# 值(從配置文件中取),同時須要一個函數取廣告條的內容信息. 
屬性  類型  是否必須  缺省值  描述 
name  string  Yes  n/a  插入函數的名稱 
assign  string  No  n/a  該屬性指定一個變量
保存待插入函數輸出
script  string  No  n/a
插入函數前須要先包
含的 php 腳本名稱 
[var ...]  [var type]  No  n/a  傳遞給待插入函數的
本地參數 
例如:
{* 取得banner 的例子*} 
{insert name="getBanner" lid=#banner_location_id# sid=#site_id#} 
在此例中,咱們使用了 getBanner 做爲 name 屬性,同時傳遞了 #banner_location_id# 和 #site_id# 
兩個參數. 接下來 Smarty 在你的 php 程序中搜索名爲 insert_getBanner() 的函 數,
#banner_location_id# 和 #site_id# 的值被組合成一個數組做爲函數的第一個參數傳遞給該函數. 爲了
避免函數命名混亂,全部的 insert 函數都必須以 insert_ 開頭. 你的 insert_getBanner() 函數根據傳遞
的參數執行並返回執行的結果. 這些結果就顯示在模板中調用該函數的位置. 在此例中 Smarty 調用該函
數相似 insert_getBanner(array("lid"=>"12345","sid"=>67890"));並將返回的結果顯示在調用的位置. 
40
若是設置了 assign 屬性,該屬性對應的變量名用於保存待包含函數的輸出,這樣待包含函數的輸出就不
會直接顯示了.注意:賦給模板變量的輸出信息在緩存的時候一樣無效. 
若是指定了 script 屬性,在調用函數並執行前將先包含(只包含一次)script 指定的 php 腳本. 這是爲了
防止被調用的函數不存在,先調用包含該函數的 php 腳本將避免該狀況. 
Smarty 對象做爲函數的第二個參數被傳遞,在待包含函數中能夠經過 $this 訪問並修改 smarty 對象
信息. 
技術要點: 使模板的一部分不被緩存。若是打開了緩存,即便是在緩存頁面中, insert 函數也不會被緩
存,每次調用頁面它們都會被動態加載, 該特性能夠普遍應用於廣告條、投票、實時天氣預報、搜索結
果、反饋信息等區域。 
if,elseif,else 
Smarty 中的 if 語句和 php 中的 if 語句同樣靈活易用,並增長了幾個特性以適宜模板引擎. if 必須於 
/if 成對出現. 可使用 else 和 elseif 子句. 可使用如下條件修飾詞:eq、ne、neq、gt、lt、lte、le、
gte、ge、is even、is odd、is not even、is not odd、not、mod、div by、even by、odd by、==、!=、
>、<、<=、>=. 使用這些修飾詞時必須和變量或常量用空格格開. 
例如:
{if $name eq "Fred"} 
Welcome Sir. 
{elseif $name eq "Wilma"} 
Welcome Ma'am. 
{else} 
Welcome, whatever you are. 
41
{/if} 
{* 使用"或(or)"邏輯*} 
{if $name eq "Fred" or $name eq "Wilma"} 
... 
{/if} 
{* 同上*} 
{if $name == "Fred" || $name == "Wilma"} 
... 
{/if} 
{* 下面的語法不會工做,元素之間必須用空格隔開*} 
{if $name=="Fred" || $name=="Wilma"} 
... 
{/if} 
{* 可以使用括號*} 
{if ( $amount < 0 or $amount > 1000 ) and $volume >= #minVolAmt#} 
... 
{/if} 
{* 能夠嵌入php函數調用*} 
{if count($var) gt 0} 
... 
{/if} 
{* 測試值是偶數(even)仍是奇數(odd)*} 
{if $var is even} 
... 
{/if} 
{if $var is odd} 
... 
{/if} 
{if $var is not odd} 
... 
{/if} 
{* 測試值是否可被4整除*} 
{if $var is div by 4} 
... 
{/if} 
{* 測試值是不是2的偶數。例如:
0=even, 1=even, 2=odd, 3=odd, 4=even, 5=even, etc. *} 
42
{if $var is even by 2} 
... 
{/if} 
{* 測試值是不是3的偶數。例如:
0=even, 1=even, 2=even, 3=odd, 4=odd, 5=odd, etc. *} 
{if $var is even by 3} 
... 
{/if} 
ldelim,rdelim [輸出分隔符] 
ldelim 和 rdelim 用於輸出分隔符,也就是大括號 "{" 和 "}". 模板引擎老是嘗試解釋大括號內的內容,
所以若是須要輸出大括號,請使用此方法. 
例如:
{ldelim}funcname{rdelim} is how functions look in Smarty! 
輸出結果:
{funcname} is how functions look in Smarty! 
literal [文本處理] 
Literal 標籤區域內的數據將被看成文本處理,此時模板將忽略其內部的全部字符信息. 該特性用於顯示有
可能包含大括號等字符信息的 javascript 腳本. 當這些信息處於 {literal}{/literal} 標籤中時,模板引擎將
不分析它們,而直接顯示. 
例如:
{literal} 
<script language=javascript> 
43
<!-- 
function isblank(field) { 
if (field.value == '') 
{ return false; } 
else 
{ 
document.loginform.submit(); 
return true; 
} 
} 
// --> 
</script> 
{/literal} 
php [嵌入 php 腳本] 
php 標籤容許在模板中直接嵌入 php 腳本. 是否處理這些語句取決於$php_handling 的設置. 該語句
一般不須要使用,固然若是你很是瞭解此特性或認爲必需要用,也可使用. 
例如:
{php} 
// including a php script directly 
// from the template. 
include("/path/to/display_weather.php"); 
{/php} 
section,sectionelse [遍歷數組] 
屬性目錄 
index 
44
index_prev 
index_next 
iteration 
first 
last 
rownum 
loop 
show 
total 
屬性  類型  是否必須  缺省值  描述 
name  string  Yes  n/a  該循環的名稱 
loop  [$variable_name]  Yes  n/a  決定循環次數的變量
名稱 
start  integer  No  0  循環執行的初始位置. 
若是該值爲負數,開
始位置從數組的尾部
算起. 例如:若是數組
中有 7 個元素,指定
start 爲-2,那麼指向
當前數組的索引爲 5. 
非法值(超過了循環
45
屬性  類型  是否必須  缺省值  描述 
數組的下限)將被自
動調整爲最接近的合
法值. 
step  integer  No  1  該值決定循環的步長. 
例如指定 step=2 將
只遍歷下標爲 0、24 等的元素. 若是
step 爲負值,那麼遍
歷數組的時候從後向
前遍歷. 
max  integer  No  1  設定循環最大執行次
數. 
show  boolean  No  true  決定是否顯示該循環.
模板的 section 用於遍歷數組中的數據. section 標籤必須成對出現. 必須設置 name 和 loop 屬性。 
名稱能夠是包含字母、數字和下劃線的任意組合. 能夠嵌套但必須保證嵌套的 name 惟一. 變量 loop 
(一般是數組)決定循環執行的次數. 當須要在 section 循環內輸出變量時,必須在變量後加上中括號包含
着的 name 變量。 sectionelse 當 loop 變量無值時被執行。 
例如:
section 函數演示
46
{* 下面的例子會輸出數組變量$custid 中的全部的值*} 
{section name=customer loop=$custid} {* 使用數組變量做爲設定循環次數loop的值*} 
id: {$custid[customer]}<br> {* 使用"被遍歷數組變量名[section名(name)]"做爲數組遍歷的輸出*} 
{/section} 
輸出結果:
id: 1000<br> 
id: 1001<br> 
id: 1002<br> 
loop 變量演示
{* loop 變量只決定循環的次數。
能夠訪問任何來自section 內部的變量。
這個例子假設$custid, $name$address 數組包含相同數量的值。
*} 
{section name=customer loop=$custid} 
id: {$custid[customer]}<br> 
name: {$name[customer]}<br> 
address: {$address[customer]}<br> 
<p> 
{/section} 
輸出結果:
id: 1000<br> 
name: John Smith<br> 
address: 253 N 45th<br> 
<p> 
id: 1001<br> 
name: Jack Jones<br> 
address: 417 Mulberry ln<br> 
<p> 
id: 1002<br> 
name: Jane Munson<br> 
address: 5605 apple st<br> 
<p> 
section 名稱演示
{* section 的名稱能夠隨便取,這個名稱用於section 內部數據的引用*} 
{section name=mydata loop=$custid} 
47
id: {$custid[mydata]}<br> 
name: {$name[mydata]}<br> 
address: {$address[mydata]}<br> 
<p> 
{/section} 
嵌套section 演示
{* 嵌套能夠隨便嵌入很深,在嵌套的section 中,能夠訪問複雜的數據結構,例如多維數組。
在這個例子中,$contact_type[customer] 是與當前customer 相關類型的數組。*} 
{section name=customer loop=$custid} 
id: {$custid[customer]}<br> 
name: {$name[customer]}<br> 
address: {$address[customer]}<br> 
{section name=contact loop=$contact_type[customer]} 
{$contact_type[customer][contact]}: {$contact_info[customer][contact]}<br> 
{/section} 
<p> 
{/section} 
輸出結果:
id: 1000<br> 
name: John Smith<br> 
address: 253 N 45th<br> 
home phone: 555-555-5555<br> 
cell phone: 555-555-5555<br> 
e-mail: john@mydomain.com<br> 
<p> 
id: 1001<br> 
name: Jack Jones<br> 
address: 417 Mulberry ln<br> 
home phone: 555-555-5555<br> 
cell phone: 555-555-5555<br> 
e-mail: jack@mydomain.com<br> 
<p> 
id: 1002<br> 
name: Jane Munson<br> 
address: 5605 apple st<br> 
home phone: 555-555-5555<br> 
cell phone: 555-555-5555<br> 
e-mail: jane@mydomain.com<br> 
<p> 
section 遍歷多維數組演示
48
{section name=customer loop=$contacts} 
name: {$contacts[customer].name}<br> 
home: {$contacts[customer].home}<br> 
cell: {$contacts[customer].cell}<br> 
e-mail: {$contacts[customer].email}<p> 
{/section} 
輸出結果:
name: John Smith<br> 
home: 555-555-5555<br> 
cell: 555-555-5555<br> 
e-mail: john@mydomain.com<p> 
name: Jack Jones<br> 
home phone: 555-555-5555<br> 
cell phone: 555-555-5555<br> 
e-mail: jack@mydomain.com<p> 
name: Jane Munson<br> 
home phone: 555-555-5555<br> 
cell phone: 555-555-5555<br> 
e-mail: jane@mydomain.com<p> 
sectionelse 演示
{* 若是$custid 沒有值(爲空),sectionelse 將執行*} 
{section name=customer loop=$custid} 
id: {$custid[customer]}<br> 
{sectionelse} 
there are no values in $custid. 
{/section} 
Section 循環也有可供調用的變量名. 經過以下方式調用:
{$smarty.section.sectionname.varname}. 
index 
index 用於顯示當前循環的索引,從 0 開始(若是指定了 start 屬性,那麼由該值開始),每次加 1(若是指
定了 step 屬性,那麼由該值決定). 
若是沒有指定 step 和 start 屬性,此值的做用和 iteration 相似,只不過從 0 開始而已. 
49
section 的index 屬性演示
{section name=customer loop=$custid} 
{$smarty.section.customer.index} id: {$custid[customer]}<br> 
{/section} 
輸出結果:
0 id: 1000<br> 
1 id: 1001<br> 
2 id: 1002<br> 
index_prev 
index_prev 用於顯示上一個循環索引值. 循環開始時,此值爲-1. 
section 的index_prev 屬性演示
{section name=customer loop=$custid} 
{$smarty.section.customer.index} id: {$custid[customer]}<br> 
{* 供參考:$custid[customer.index] 和$custid[customer] 是一樣的意思*} 
{if $custid[customer.index_prev] ne $custid[customer.index]} 
The customer id changed<br> 
{/if} 
{/section} 
輸出結果:
0 id: 1000<br> 
The customer id changed<br> 
1 id: 1001<br> 
The customer id changed<br> 
2 id: 1002<br> 
The customer id changed<br> 
index_next 
50
index_next 用於顯示下一個循環索引值. 循環執行到最後一次時,此值仍然比當前索引值大 1(若是指定
了 step,取決於此值). 
index_next 屬性演示
{section name=customer loop=$custid} 
{$smarty.section.customer.index} id: {$custid[customer]}<br> 
{if $custid[customer.index_next] ne $custid[customer.index]} 
The customer id will change<br> 
{/if} 
{/section} 
輸出結果:
0 id: 1000<br> 
The customer id will change<br> 
1 id: 1001<br> 
The customer id will change<br> 
2 id: 1002<br> 
The customer id will change<br> 
iteration 
iteration 用於顯示循環的次數. 
注意:iteration 不像 index 屬性受 start、step 和 max 屬性的影響,該值老是從 1 開始(index 是從 0 開
始的). 
rownum 是 iteration 的別名,二者等同. 
section 的iteration 屬性演示
{section name=customer loop=$custid start=5 step=2} 
51
current loop iteration: {$smarty.section.customer.iteration}<br> 
{$smarty.section.customer.index} id: {$custid[customer]}<br> 
{if $custid[customer.index_next] ne $custid[customer.index]} 
The customer id will change<br> 
{/if} 
{/section} 
輸出結果:
current loop iteration: 1 
5 id: 1000<br> 
The customer id will change<br> 
current loop iteration: 2 
7 id: 1001<br> 
The customer id will change<br> 
current loop iteration: 3 
9 id: 1002<br> 
The customer id will change<br> 
first 
若是當前循環第一次執行,first 被設置爲 true. 
section 的first 屬性演示
{section name=customer loop=$custid} 
{if $smarty.section.customer.first} 
<table> 
{/if} 
<tr><td>{$smarty.section.customer.index} id: 
{$custid[customer]}</td></tr> 
{if $smarty.section.customer.last} 
</table> 
{/if} 
{/section} 
輸出結果:
<table> 
52
<tr><td>0 id: 1000</td></tr> 
<tr><td>1 id: 1001</td></tr> 
<tr><td>2 id: 1002</td></tr> 
</table> 
last 
若是當前循環執行到最後一次,last 被設置爲 true. 
section 的last 屬性演示
{section name=customer loop=$custid} 
{if $smarty.section.customer.first} 
<table> 
{/if} 
<tr><td>{$smarty.section.customer.index} id: 
{$custid[customer]}</td></tr> 
{if $smarty.section.customer.last} 
</table> 
{/if} 
{/section} 
輸出結果:
<table> 
<tr><td>0 id: 1000</td></tr> 
<tr><td>1 id: 1001</td></tr> 
<tr><td>2 id: 1002</td></tr> 
</table> 
rownum 
rownum 用於顯示循環的次數. 該屬性是 iteration 的別名,二者等同. 
53
section 的rownum 屬性演示
{section name=customer loop=$custid} 
{$smarty.section.customer.rownum} id: {$custid[customer]}<br> 
{/section} 
輸出結果:
1 id: 1000<br> 
2 id: 1001<br> 
3 id: 1002<br> 
loop 
loop 用於顯示該循環上一次循環時的索引值. 該值能夠用於循環內部或循環結束後. 
section 的loop 屬性演示
{section name=customer loop=$custid} 
{$smarty.section.customer.index} id: {$custid[customer]}<br> 
{/section} 
There were {$smarty.section.customer.loop} customers shown above. 
輸出結果:
0 id: 1000<br> 
1 id: 1001<br> 
2 id: 1002<br> 
There were 3 customers shown above. 
show 
show 是 section 的參數. show 取值爲布爾值 truefalse. 若是設置爲 false,該循環將不顯示. 如
果指定了 sectionelse 子句,該語句是否顯示也取決於該值. 
54
section 的show 屬性演示
{* $show_customer_info 來自PHP應用的傳遞,用於管理是否顯示section *} 
{section name=customer loop=$custid show=$show_customer_info} 
{$smarty.section.customer.rownum} id: {$custid[customer]}<br> 
{/section} 
{if $smarty.section.customer.show} 
the section was shown. 
{else} 
the section was not shown. 
{/if} 
輸出結果:
1 id: 1000<br> 
2 id: 1001<br> 
3 id: 1002<br> 
the section was shown. 
total 
total 用於顯示循環執行總的次數. 能夠在循環中或執行結束後調用此屬性. 
section 的total 屬性演示
{section name=customer loop=$custid step=2} 
{$smarty.section.customer.index} id: {$custid[customer]}<br> 
{/section} 
There were {$smarty.section.customer.total} customers shown above. 
輸出結果:
0 id: 1000<br> 
2 id: 1001<br> 
4 id: 1002<br> 
55
There were 3 customers shown above. 
strip [去處首尾空格和回車] 
Web 開發者屢次遇到空格和回車影響 HTML 輸出的情形(瀏覽器的"特性"),爲了獲得特定的結果,所以
你不得不在模板裏運行全部的標籤. 一般在難以理解或難以處理的模板中遇到此問題. 
Smarty 在顯示前將除區任何位於 {strip}{/strip} 標記中數據的首尾空格和回車. 這樣能夠保證模板容易
理解且不用擔憂多餘的空格致使問題. 
技術要點:{strip}{/strip} 不會影響模版變量的內容,參見 strip 變量調節器。 
strip 標籤演示
{* 下面的會被輸出爲一行*} 
{strip} 
<table border=0> 
<tr> 
<td> 
<A HREF="{$url}"> 
<font color="red">This is a test</font> 
</A> 
</td> 
</tr> 
</table> 
{/strip} 
輸出結果:
<table border=0><tr><td><A HREF="http://my.domain.com"><font color="red">This is a 
test</font></A></td></tr></table> 
請注意上例,全部行都以 HTML 標籤開頭結尾. 全部行被組織到一塊兒運行. 若是在行首和行尾有文本的話,
它們也會被組織到一塊兒,就有可能獲得你不想獲得的結果. 
56
6.  Custom Functions[自定義函數] 
用戶可使用 Smarty 自帶的一組自定義函數。 
assign [爲模板變量賦值] 
assign 用於在模板被執行時爲模板變量賦值. 
屬性  類型  是否必須  缺省值  描述 
var  string  Yes  n/a  被賦值的變量名 
value  string  Yes  n/a  賦給變量的值 
assign 函數演示
{assign var="name" value="Bob"} 
The value of $name is {$name}. 
輸出結果:
The value of $name is Bob. 
counter [計數] 
counter 用於輸出一個記數過程. counter 保存了每次記數時的當前記數值. 用戶能夠經過調節 interval 
57
和 direction 調節該值. 也能夠決定是否輸出該值. 若是須要同時運行多個計數器,必須爲它們指定不一樣
的名稱. 若是沒有指定名稱,模板引擎使用 "default" 做爲缺省值. 
若是指定了 "assign" 這個特殊屬性,該計數器的輸出值將被賦給由 assign 指定的模板變量,而不是直
接輸出. 
屬性  類型  是否必須  缺省值  描述 
name  string  No  default  計數器的名稱 
start  number  No  1  記數器初始值 
skip  number  No  1  記數器間隔、步長 
direction  string  No  up  記數器方向,(增/減)
print  boolean  No  true  是否輸出值 
assign  string  No  n/a  輸出值將被賦給模板
變量的名稱 
counter 函數演示
{* initialize the count *} 
{counter start=0 skip=2 print=false} 
{counter}<br> 
{counter}<br> 
{counter}<br> 
{counter}<br> 
輸出結果:
2<br> 
4<br> 
6<br> 
8<br> 
58
cycle [輪轉使用值] 
Cycle 用於輪轉使用一組值. 該特性使得在表格中交替輸出顏色或輪轉使用數組中的值變得很容易. 
若是須要在模板中使用多個輪轉,須要給出惟一的 name 屬性. 
用戶能夠設置 print 屬性爲 false 強制不輸出當前值. 該特性能夠很方便地略過某個值. 
advance 屬性用於重複使用某個值. 當該屬性設置爲 false 時,下次調用該輪轉時將輸出一樣的值. 
若是指定了 "assign" 這個特殊屬性,該輪轉的輸出值將被賦給由 assign 指定的模板變量,而不是直接
輸出. 
屬性  類型  是否必須  缺省值  描述 
name  string  No  default  輪轉的名稱 
values  mixed  Yes  N/A  待輪轉的值,能夠是
用逗號分隔的列表
(請查看 delimiter 
屬性)或一個包含多
值的數組. 
print  boolean  No  true  是否輸出值 
advance  boolean  No  true  是否使用下一個值
(爲 false 時使用當
前值) 
delimiter  string  No  ,  指出 values 屬性中
59
屬性  類型  是否必須  缺省值  描述 
使用的分隔符,默認
是逗號. 
assign  string  No  n/a  輸出值將被賦給模板
變量的名稱 
cycle 函數演示
{section name=rows loop=$data} 
<tr bgcolor="{cycle values="#eeeeee,#d0d0d0"}"> 
<td>{$data[rows]}</td> 
</tr> 
{/section} 
輸出結果:
<tr bgcolor="#eeeeee"> 
<td>1</td> 
</tr> 
<tr bgcolor="#d0d0d0"> 
<td>2</td> 
</tr> 
<tr bgcolor="#eeeeee"> 
<td>3</td> 
</tr> 
debug [調試輸出] 
{debug} 將調式信息輸出到頁面上. 該函數是否可用取決於 Smarty 的 debug 設置. 
該函數在運行時取得數據,所以不能顯示使用中的模板,只能顯示運行時被賦值的變量. 
不過仍是能夠看到全部模板內當前可用的變量. 
60
屬性  類型  是否必須  缺省值  描述 
output  string  No  html  輸出類型,html 或
javascript 
eval 
eval 按處理模板的方式計算取得變量的值. 該特性可用於在配置文件中的標籤/變量中嵌入其它模板標籤
/變量. 
若是指定了 "assign" 這個特殊屬性,該函數的輸出值將被賦給由 assign 指定的模板變量,而不是直接
輸出. 
技術要點: 待求值處理的變量被看成模板來處理. 它們和模板同樣遵循一樣的結構和安全特性. 
技術要點: 待求值處理的變量每次調用時被重編譯,不保存編譯版本! 但當打開緩衝設置時,該輸出會被
其它模板緩衝. 
屬性  類型  是否必須  缺省值  描述 
var  mixed  Yes  n/a  待求值的變量(或字
符串) 
assign  string  No  n/a  輸出值將被賦給模板
變量的名稱 
eval 函數演示
61
setup.conf 
---------- 
emphstart = <b> 
emphend = </b> 
title = Welcome to {$company}'s home page! 
ErrorCity = You must supply a {#emphstart#}city{#emphend#}. 
ErrorState = You must supply a {#emphstart#}state{#emphend#}. 
index.tpl 
--------- 
{config_load file="setup.conf"} 
{eval var=$foo} 
{eval var=#title#} 
{eval var=#ErrorCity#} 
{eval var=#ErrorState# assign="state_error"} 
{$state_error} 
輸出結果:
This is the contents of foo. 
Welcome to Foobar Pub & Grill's home page! 
You must supply a <b>city</b>. 
You must supply a <b>state</b>. 
fetch [取文件、HTTP、FTP] 
fetch 用於從本地文件系統、HTTP 或 FTP 上取得文件並顯示文件的內容. 若是文件名稱以"http://"開頭,
將取得該網站頁面並顯示. 若是文件名稱以"ftp://"開頭,將從 ftp 服務器取得該文件並顯示. 
若是指定了 "assign" 這個特殊屬性,該函數的輸出值將被賦給由 assign 指定的模板變量,而不是直接
輸出.(Smarty 版本 1.5.0 新特性) 
技術要點:該函數不支持 HTTP 重定向,若是要取得 web 默認頁,好比想取得 www.domain.com 的主
頁資料,可是不知道主頁的具體名稱,多是 index.php 或 index.htm 或 default.php 等等,能夠直接
62
使用該站點的 url,記得在 url 結尾處加上反斜線. 
技術要點: 若是模板的安全設置打開了,當取本地文件時只能取位於定義爲安全文件夾下的資料. 
($secure_dir) 
屬性  類型  是否必須  缺省值  描述 
file  string  Yes  n/a  待請求的文件,http
或 ftp 方式. 
assign  string  No  n/a  輸出值將被賦給模板
變量的名稱 
fetch 函數演示
{* 在模版中包括javascript *} 
{fetch file="/export/httpd/www.domain.com/docs/navbar.js"} 
{* 在模版中嵌入來自其它web站點的天氣文本*} 
{fetch file="http://www.myweather.com/68502/"} 
{* 經過ftp取得新聞新聞標題文件*} 
{fetch file="ftp://user:password@ftp.domain.com/path/to/currentheadlines.txt"} 
{* 分配已取得的內容到模版變量*} 
{fetch file="http://www.myweather.com/68502/" assign="weather"} 
{if $weather ne ""} 
<b>{$weather}</b> 
{/if} 
html_checkboxes [html 複選框] 
自定義函數 html_checkboxes 根據給定的數據建立複選按鈕組. 該函數能夠指定哪些元素被選定. 要麼
63
必須指定 values 和 ouput 屬性,要麼指定 options 替代. 全部的輸出與 XHTML 兼容. 
上表未提到的其它參數在 <input> 標籤中以"名稱/屬性"對的方式顯示. 
屬性  類型  是否必須  缺省值  描述 
name  string  No  checkbox  複選按鈕組的名稱 
values  array  Yes, 或指定 
options 屬性 
n/a  包含複選按鈕組值的
數組 
output  array  Yes, 或指定 
options 屬性 
n/a  包含複選按鈕組顯示
值的數組 
selected  string/array  No  empty  已選定的元素或元素
數組 
options  associative array  Yes,或指定 values 
屬性 
n/a  包含值和顯示的關聯
數組 
separator  string  No  empty  分隔每一個複選按鈕的
字符串 
labels  boolean  No  true  是否爲每一個複選按鈕
添加 <label> 標籤
html_checkboxes 函數演示
index.php: 
require('Smarty.class.php'); 
$smarty = new Smarty; 
$smarty->assign('cust_ids', array(1000,1001,1002,1003)); 
$smarty->assign('cust_names', array('Joe Schmoe','Jack Smith','Jane Johnson','Charlie Brown')); 
64
$smarty->assign('customer_id', 1001); 
$smarty->display('index.tpl'); 
index.tpl: 
{html_checkboxes values=$cust_ids checked=$customer_id output=$cust_names separator="<br />"} 
index.php: 
require('Smarty.class.php'); 
$smarty = new Smarty; 
$smarty->assign('cust_checkboxes', array( 
1000 => 'Joe Schmoe', 
1001 => 'Jack Smith', 
1002 => 'Jane Johnson', 
1003 => 'Charlie Brown')); 
$smarty->assign('customer_id', 1001); 
$smarty->display('index.tpl'); 
index.tpl: 
{html_checkboxes name="id" options=$cust_checkboxes checked=$customer_id separator="<br />"} 
輸出結果:
<label><input type="checkbox" name="checkbox[]" value="1000" />Joe Schmoe</label><br /> 
<label><input type="checkbox" name="checkbox[]" value="1001" checked="checked" />Jack Smith</label><br 
/> 
<label><input type="checkbox" name="checkbox[]" value="1002" />Jane Johnson</label><br /> 
<label><input type="checkbox" name="checkbox[]" value="1003" />Charlie Brown</label><br /> 
<label><input type="checkbox" name="id[]" value="1000" />Joe Schmoe</label><br /> 
<label><input type="checkbox" name="id[]" value="1001" checked="checked" />Jack Smith</label><br /> 
<label><input type="checkbox" name="id[]" value="1002" />Jane Johnson</label><br /> 
<label><input type="checkbox" name="id[]" value="1003" />Charlie Brown</label><br /> 
html_image [html 圖片] 
自定義函數 html_image 產生一個圖象的 HTML 標籤. 若是沒有提供高度和寬度值,將根據圖象的實際
大小自動取得. 
65
basedir 是相對圖象路徑的基路徑. 若是沒有給出該屬性,將依據 WEB 服務器的根路徑(環境變量 
DOCUMENT_ROOT)爲準. 若是模板的安全設置打開了,圖象的位置必須位於爲安全文件夾下. 
href 是圖象連接指向的位置. 若是設置了該屬性,圖象兩側將被加上超級連接標籤,造成一個圖象連接. 
技術要點: html_image 須要訪問磁盤以獲取圖象的尺寸. 若是不使用緩衝,爲了優化性能,通常狀況下建
議使用靜態圖象標籤而避免使用 html_iamge. 
屬性  類型  是否必須  缺省值  描述 
file  string  Yes  n/a  圖象文件的名稱或路
徑 
border  string  No  0  圖象邊框大小 
height  string  No  actual image 
height
顯示圖象高度 
width  string  No  actual image width 顯示圖象寬度 
basedir  string  no  web server doc 
root
圖象文件位置的相對
路徑 
alt  string  no  ""  可選圖象描述(鼠標
指向圖象或圖象文件
不存在時顯示的字符
串信息) 
href  string  no  n/a  圖象連接到的地址 
html_options [html 下拉列表] 
66
自定義函數 html_options 根據給定的數據建立選項組. 該函數能夠指定哪些元素被選定. 要麼必須指定 
values 和 ouput 屬性,要麼指定 options 替代. 
若是給定值是數組,將做爲 OPTGROUP 處理,且支持遞歸. 全部的輸出與 XHTML 兼容. 
若是指定了可選屬性 name,該選項列表將將被置於<select name="groupname"></select>標籤對中. 
若是沒有指定,那麼只產生選項列表. 
上表未提到的其它參數在 <select> 標籤中以"名稱/屬性"對的方式顯示. 若是沒有指定可選屬性 name 
這些參數將被忽略. 
屬性  類型  是否必須  缺省值  描述 
values  array  Yes, unless using 
options attribute
n/a  包含下拉列表各元素
值的數組 
output  array  Yes, unless using 
options attribute
n/a  包含下拉列表各元素
顯示值的數組 
selected  string/array  No  empty  已選定的元素或元素
數組 
options  associative array  Yes, unless using 
values and output
n/a  包含值和顯示的關聯
數組 
name  string  No  empty  下拉菜單的名稱 
html_options 函數演示
index.php: 
67
require('Smarty.class.php'); 
$smarty = new Smarty; 
$smarty->assign('cust_ids', array(1000,1001,1002,1003)); 
$smarty->assign('cust_names', array('Joe Schmoe','Jack Smith','Jane 
Johnson','Carlie Brown')); 
$smarty->assign('customer_id', 1001); 
$smarty->display('index.tpl'); 
index.tpl: 
<select name=customer_id> 
{html_options values=$cust_ids selected=$customer_id output=$cust_names} 
</select> 
index.php: 
require('Smarty.class.php'); 
$smarty = new Smarty; 
$smarty->assign('cust_options', array( 
1001 => 'Joe Schmoe', 
1002 => 'Jack Smith', 
1003 => 'Jane Johnson', 
1004 => 'Charlie Brown')); 
$smarty->assign('customer_id', 1001); 
$smarty->display('index.tpl'); 
index.tpl: 
<select name=customer_id> 
{html_options options=$cust_options selected=$customer_id} 
</select> 
輸出結果:(both examples) 
<select name=customer_id> 
<option value="1000">Joe Schmoe</option> 
<option value="1001" selected="selected">Jack Smith</option> 
<option value="1002">Jane Johnson</option> 
<option value="1003">Charlie Brown</option> 
</select> 
html_radios [html 單選框] 
68
自定義函數 html_radios 根據給定的數據建立單選按鈕組. 該函數能夠指定哪一個元素被選定. 要麼必須
指定 values 和 ouput 屬性,要麼指定 options 替代. 全部的輸出與 XHTML 兼容. 
上表未提到的其它參數在 <input> 標籤中以"名稱/屬性"對的方式顯示. 
屬性  類型  是否必須  缺省值  描述 
name  string  No  radio  單選按鈕列表的名稱
values  array  Yes, 或指定 
options 屬性 
n/a  包含單選按鈕值的數
組 
output  array  Yes, 或指定 
options 屬性 
n/a  包含單選按鈕顯示值
的數組 
checked  string  No  empty  已選定的元素 
options  associative array  Yes, 或指定 values 
屬性 
n/a  包含值和顯示的關聯
數組 
separator  string  No  empty  分隔每一個單選按鈕的
字符串 
html_radios 函數演示
index.php: 
require('Smarty.class.php'); 
$smarty = new Smarty; 
$smarty->assign('cust_ids', array(1000,1001,1002,1003)); 
$smarty->assign('cust_names', array('Joe Schmoe','Jack Smith','Jane 
Johnson','Carlie Brown')); 
$smarty->assign('customer_id', 1001); 
$smarty->display('index.tpl'); 
69
index.tpl: 
{html_radios values=$cust_ids checked=$customer_id output=$cust_names separator="<br />"} 
index.php: 
require('Smarty.class.php'); 
$smarty = new Smarty; 
$smarty->assign('cust_radios', array( 
1001 => 'Joe Schmoe', 
1002 => 'Jack Smith', 
1003 => 'Jane Johnson', 
1004 => 'Charlie Brown')); 
$smarty->assign('customer_id', 1001); 
$smarty->display('index.tpl'); 
index.tpl: 
{html_radios name="id" options=$cust_radios checked=$customer_id separator="<br />"} 
輸出結果:(both examples) 
<input type="radio" name="id[]" value="1000">Joe Schmoe<br /> 
<input type="radio" name="id[]" value="1001" checked="checked"><br /> 
<input type="radio" name="id[]" value="1002">Jane Johnson<br /> 
<input type="radio" name="id[]" value="1003">Charlie Brown<br /> 
html_select_date [html 日期下拉列表] 
自定義函數 html_select_date 用於建立日期下拉菜單. 它能夠顯示任意年月日. 
屬性  類型  是否必須  缺省值  描述 
prefix  string  No  Date_  變量名稱前綴 
time  timestamp/YYYY-MM-DD No  UNIX 時間戳或
年-月-日 
使用時間類型
(data/time) 
70
屬性  類型  是否必須  缺省值  描述 
start_year  string  No  年份或與當前年
份的相對值 
下拉列表中第一個年
份,或與當前年份的相
對值(正/負 幾年) 
end_year  string  No  同start_year 下拉列表中最後一個
年份,或與當前年份的
相對值(正/負 幾年) 
display_days  boolean  No  true  是否顯示天 
display_months  boolean  No  true  是否顯示月 
display_years  boolean  No  true  是否顯示年 
month_format  string  No  %B  月份的表示方法
(strftime) 
day_format  string  No  %02d  天顯示的格式
(sprintf) 
day_value_format  string  No  %d  天的表示方法
(sprintf) 
year_as_text  boolean  No  false  是否以文本方式顯示
年份 
reverse_years  boolean  No  false  逆序顯示年份 
field_array  string  No  null  若是指定了名稱,選定
的區域將以
71
屬性  類型  是否必須  缺省值  描述 
[Day],[Year],[Month]
的形式返回給 PHP(待
考) 
day_size  string  No  null  若是給定,爲標籤添加
大小屬性 
month_size  string  No  null  若是給定,爲標籤添加
大小屬性 
year_size  string  No  null  若是給定,爲標籤添加
大小屬性 
all_extra  string  No  null  若是給定,爲全部標籤
添加附加屬性 
day_extra  string  No  null  若是給定,爲標籤添加
附加屬性 
month_extra  string  No  null  若是給定,爲標籤添加
附加屬性 
year_extra  string  No  null  若是給定,爲標籤添加
附加屬性 
field_order  string  No  MDY  顯示區域的順序 
field_separator  string  No  \n  各區域間輸出的分隔
字符串 
72
屬性  類型  是否必須  缺省值  描述 
month_value_format  string  No  %m  月份值的 strftime 表
示方法,默認爲 %m 
html_select_date 函數演示
{html_select_date} 
輸出結果:
<select name="Date_Month"> 
<option value="1">January</option> 
<option value="2">February</option> 
<option value="3">March</option> 
<option value="4">April</option> 
<option value="5">May</option> 
<option value="6">June</option> 
<option value="7">July</option> 
<option value="8">August</option> 
<option value="9">September</option> 
<option value="10">October</option> 
<option value="11">November</option> 
<option value="12" selected>December</option> 
</select> 
<select name="Date_Day"> 
<option value="1">01</option> 
<option value="2">02</option> 
<option value="3">03</option> 
<option value="4">04</option> 
<option value="5">05</option> 
<option value="6">06</option> 
<option value="7">07</option> 
<option value="8">08</option> 
<option value="9">09</option> 
<option value="10">10</option> 
<option value="11">11</option> 
<option value="12">12</option> 
<option value="13" selected>13</option> 
<option value="14">14</option> 
<option value="15">15</option> 
73
<option value="16">16</option> 
<option value="17">17</option> 
<option value="18">18</option> 
<option value="19">19</option> 
<option value="20">20</option> 
<option value="21">21</option> 
<option value="22">22</option> 
<option value="23">23</option> 
<option value="24">24</option> 
<option value="25">25</option> 
<option value="26">26</option> 
<option value="27">27</option> 
<option value="28">28</option> 
<option value="29">29</option> 
<option value="30">30</option> 
<option value="31">31</option> 
</select> 
<select name="Date_Year"> 
<option value="2001" selected>2001</option> 
</select> 
{* 開始和結束年份與當前年份相關*} 
{html_select_date prefix="StartDate" time=$time start_year="-5" end_year="+1" display_days=false} 
輸出結果:(current year is 2000) 
<select name="StartDateMonth"> 
<option value="1">January</option> 
<option value="2">February</option> 
<option value="3">March</option> 
<option value="4">April</option> 
<option value="5">May</option> 
<option value="6">June</option> 
<option value="7">July</option> 
<option value="8">August</option> 
<option value="9">September</option> 
<option value="10">October</option> 
<option value="11">November</option> 
<option value="12" selected>December</option> 
</select> 
<select name="StartDateYear"> 
<option value="1999">1995</option> 
<option value="1999">1996</option> 
<option value="1999">1997</option> 
<option value="1999">1998</option> 
<option value="1999">1999</option> 
74
<option value="2000" selected>2000</option> 
<option value="2001">2001</option> 
</select> 
html_select_time [html 時間下拉列表] 
自定義函數 html_select_time 用於建立時間下拉菜單. 它能夠顯示任意時分秒. 
屬性  類型  是否必須  缺省值  描述 
prefix  string  No  Time_  變量名稱前綴 
time  timestamp  No  UNIX 時間戳或年--日 
使用時間類型
(data/time) 
display_hours  boolean  No  true  是否顯示小時 
display_minutes  boolean  No  true  是否顯示分鐘 
display_seconds  boolean  No  true  是否顯示秒 
display_meridian  boolean  No  true  是否顯示正午界(上
午/下午) 
use_24_hours  boolean  No  true  是否使用 24 小時制
minute_interval  integer  No  1  分鐘下拉列表的間隔
second_interval  integer  No  1  秒鐘下拉列表的間隔
field_array  string  No  n/a  輸出值到該值指定的
75
屬性  類型  是否必須  缺省值  描述 
數組 
all_extra  string  No  null  若是給定,爲標籤添
加附加屬性 
hour_extra  string  No  null  若是給定,爲標籤添
加附加屬性 
minute_extra  string  No  null  若是給定,爲標籤添
加附加屬性 
second_extra  string  No  null  若是給定,爲標籤添
加附加屬性 
meridian_extra  string  No  null  若是給定,爲標籤添
加附加屬性 
html_select_time 函數演示
{html_select_time use_24_hours=true} 
輸出結果:
<select name="Time_Hour"> 
<option value="00">00</option> 
<option value="01">01</option> 
<option value="02">02</option> 
<option value="03">03</option> 
<option value="04">04</option> 
<option value="05">05</option> 
<option value="06">06</option> 
<option value="07">07</option> 
<option value="08">08</option> 
<option value="09" selected>09</option> 
76
<option value="10">10</option> 
<option value="11">11</option> 
<option value="12">12</option> 
<option value="13">13</option> 
<option value="14">14</option> 
<option value="15">15</option> 
<option value="16">16</option> 
<option value="17">17</option> 
<option value="18">18</option> 
<option value="19">19</option> 
<option value="20">20</option> 
<option value="21">21</option> 
<option value="22">22</option> 
<option value="23">23</option> 
</select> 
<select name="Time_Minute"> 
<option value="00">00</option> 
<option value="01">01</option> 
<option value="02">02</option> 
<option value="03">03</option> 
<option value="04">04</option> 
<option value="05">05</option> 
<option value="06">06</option> 
<option value="07">07</option> 
<option value="08">08</option> 
<option value="09">09</option> 
<option value="10">10</option> 
<option value="11">11</option> 
<option value="12">12</option> 
<option value="13">13</option> 
<option value="14">14</option> 
<option value="15">15</option> 
<option value="16">16</option> 
<option value="17">17</option> 
<option value="18">18</option> 
<option value="19">19</option> 
<option value="20" selected>20</option> 
<option value="21">21</option> 
<option value="22">22</option> 
<option value="23">23</option> 
<option value="24">24</option> 
<option value="25">25</option> 
<option value="26">26</option> 
<option value="27">27</option> 
<option value="28">28</option> 
<option value="29">29</option> 
77
<option value="30">30</option> 
<option value="31">31</option> 
<option value="32">32</option> 
<option value="33">33</option> 
<option value="34">34</option> 
<option value="35">35</option> 
<option value="36">36</option> 
<option value="37">37</option> 
<option value="38">38</option> 
<option value="39">39</option> 
<option value="40">40</option> 
<option value="41">41</option> 
<option value="42">42</option> 
<option value="43">43</option> 
<option value="44">44</option> 
<option value="45">45</option> 
<option value="46">46</option> 
<option value="47">47</option> 
<option value="48">48</option> 
<option value="49">49</option> 
<option value="50">50</option> 
<option value="51">51</option> 
<option value="52">52</option> 
<option value="53">53</option> 
<option value="54">54</option> 
<option value="55">55</option> 
<option value="56">56</option> 
<option value="57">57</option> 
<option value="58">58</option> 
<option value="59">59</option> 
</select> 
<select name="Time_Second"> 
<option value="00">00</option> 
<option value="01">01</option> 
<option value="02">02</option> 
<option value="03">03</option> 
<option value="04">04</option> 
<option value="05">05</option> 
<option value="06">06</option> 
<option value="07">07</option> 
<option value="08">08</option> 
<option value="09">09</option> 
<option value="10">10</option> 
<option value="11">11</option> 
<option value="12">12</option> 
<option value="13">13</option> 
78
<option value="14">14</option> 
<option value="15">15</option> 
<option value="16">16</option> 
<option value="17">17</option> 
<option value="18">18</option> 
<option value="19">19</option> 
<option value="20">20</option> 
<option value="21">21</option> 
<option value="22">22</option> 
<option value="23" selected>23</option> 
<option value="24">24</option> 
<option value="25">25</option> 
<option value="26">26</option> 
<option value="27">27</option> 
<option value="28">28</option> 
<option value="29">29</option> 
<option value="30">30</option> 
<option value="31">31</option> 
<option value="32">32</option> 
<option value="33">33</option> 
<option value="34">34</option> 
<option value="35">35</option> 
<option value="36">36</option> 
<option value="37">37</option> 
<option value="38">38</option> 
<option value="39">39</option> 
<option value="40">40</option> 
<option value="41">41</option> 
<option value="42">42</option> 
<option value="43">43</option> 
<option value="44">44</option> 
<option value="45">45</option> 
<option value="46">46</option> 
<option value="47">47</option> 
<option value="48">48</option> 
<option value="49">49</option> 
<option value="50">50</option> 
<option value="51">51</option> 
<option value="52">52</option> 
<option value="53">53</option> 
<option value="54">54</option> 
<option value="55">55</option> 
<option value="56">56</option> 
<option value="57">57</option> 
<option value="58">58</option> 
<option value="59">59</option> 
79
</select> 
<select name="Time_Meridian"> 
<option value="am" selected>AM</option> 
<option value="pm">PM</option> 
</select> 
html_table [html 製表] 
自定義函數 html_table 將數組中的數據填充到 HTML 表格中. cols 屬性決定表格有多少列. 
table_attr , tr_attr 和 td_attr 屬性決定表格中 tr 和 td 標籤的一些附加屬性. 若是 tr_attr 和 td_attr 
屬性值爲數組,將輪流使用其中的值. 若是指定了 trailpad 屬性,將在表尾最後一行附加一些數據. 
屬性  類型  是否必須  缺省值  描述 
loop  array  Yes  n/a  待遍歷的數組 
cols  integer  No  3  表格的列數目 
table_attr  string  No  border="1"  表格的屬性 
tr_attr  string  No  empty  行標籤屬性(或輪轉
數組) 
td_attr  string  No  empty  列標籤屬性(或輪轉
數組) 
trailpad  string  No  &nbsp;  最後一行附加的數據
(若是有的話) 
hdir  string  No  right  行的對齊方式,可能
的值爲 left 或 
80
屬性  類型  是否必須  缺省值  描述 
right
vdir  string  No  down  列的對齊方式,可能
的值爲 up或 
down
html_table 函數演示
index.php: 
require('Smarty.class.php'); 
$smarty = new Smarty; 
$smarty->assign('data',array(1,2,3,4,5,6,7,8,9)); 
$smarty->assign('tr',array('bgcolor="#eeeeee"','bgcolor="#dddddd"')); 
$smarty->display('index.tpl'); 
index.tpl: 
{html_table loop=$data} 
{html_table loop=$data cols=4table_attr='border="0"'} 
{html_table loop=$data cols=4 tr_attr=$tr} 
輸出結果:
<table border="1"> 
<tr><td>1</td><td>2</td><td>3</td></tr> 
<tr><td>4</td><td>5</td><td>6</td></tr> 
<tr><td>7</td><td>8</td><td>9</td></tr> 
</table> 
<table border="0"> 
<tr><td>1</td><td>2</td><td>3</td><td>4</td></tr> 
<tr><td>5</td><td>6</td><td>7</td><td>8</td></tr> 
<tr><td>9</td><td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td></tr> 
</table> 
<table border="1"> 
<tr bgcolor="#eeeeee"><td>1</td><td>2</td><td>3</td><td>4</td></tr> 
<tr bgcolor="#dddddd"><td>5</td><td>6</td><td>7</td><td>8</td></tr> 
<tr bgcolor="#eeeeee"><td>9</td><td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td></tr> 
</table> 
81
math [數學運算] 
math 容許模板設計者在模板中進行數學表達式運算. 在表達式中可使用任何數值類型的變量,結果在 
math 標籤的位置輸出. 表達式中使用的變量被當作參數傳遞給函數,能夠是模板變量或靜態值. 目前可
以使用的運算符有:+, -, /, *, abs, ceil, cos, exp, floor, log, log10, max, min, pi, pow, rand, round, sin, 
sqrt, srans 和 tan .關於數學函數的詳細信息,請查看 PHP 文檔. 
若是指定了 "assign" 這個特殊屬性,該函數的輸出值將被賦給由 assign 指定的模板變量,而不是直接
輸出. 
技術要點: 因爲使用了 php 的 eval() 函數,math 函數的執行效率不高. 在 PHP 中作數學運算效率會
更高一些,所以要儘量在 PHP 中作數學運算,將結果賦給模板變量. 相似在 section 循環,應明確避
免反覆調用 math 函數. 
屬性  類型  是否必須  缺省值  描述 
equation  string  Yes  n/a  待執行的表達式 
format  string  No  n/a  結果的格式(聽從
sprintf 函數) 
var  numeric  Yes  n/a  表達式變量值 
assign  string  No  n/a  輸出值將被賦給模板
變量的名稱 
[var ...]  numeric  Yes  n/a  表達式變量值 
82
math 函數演示
{* $height=4, $width=5 *} 
{math equation="x + y" x=$height y=$width} 
輸出結果:
9 
{* $row_height = 10, $row_width = 20, #col_div# = 2, assigned in template *} 
{math equation="height * width / division" 
height=$row_height 
width=$row_width 
division=#col_div#} 
輸出結果:
100 
{* 可使用圓括號*} 
{math equation="(( x + y ) / z )" x=2 y=10 z=2} 
輸出結果:
6 
{* 能夠爲輸出格式提供格式參數*} 
{math equation="x + y" x=4.4444 y=5.0000 format="%.2f"} 
輸出結果:
9.44 
mailto 
mailto 自動生成電子郵件連接,並根據選項決定是否對地址信息編碼. 電子郵件地址編碼使得網絡嗅探程
序難以收集到電子郵件地址信息. 
83
技術要點: 儘管可使用 hex 進制編碼,但 javascript 已經算得上是很完全的編碼形式了. 
屬性  類型  是否必須  缺省值  描述 
address  string  Yes  n/a  電子郵件地址 
text  string  No  n/a  郵件連接上顯示的文
本,默認爲電子郵件
地址 
encode  string  No  none  編碼方式,可選值爲 
none,hex 或
javascript 
cc  string  No  n/a  郵件抄送地址,多條
地址信息以逗號分隔
bcc  string  No  n/a  郵件暗送地址,多條
地址信息以逗號分隔
subject  string  No  n/a  郵件主題 
newsgroups  string  No  n/a  發送到新聞組的地
址,多條地址信息以
逗號分隔 
followupto  string  No  n/a  追蹤地址信息,多條
信息以逗號分隔 
extra  string  No  n/a  其它須要傳遞給連接
84
屬性  類型  是否必須  缺省值  描述 
的信息,如 css 樣式
mailto 函數演示
{mailto address="me@domain.com"} 
{mailto address="me@domain.com" text="send me some mail"} 
{mailto address="me@domain.com" encode="javascript"} 
{mailto address="me@domain.com" encode="hex"} 
{mailto address="me@domain.com" subject="Hello to you!"} 
{mailto address="me@domain.com" cc="you@domain.com,they@domain.com"} 
{mailto address="me@domain.com" extra='class="email"'} 
輸出結果:
<a href="mailto:me@domain.com" >me@domain.com</a> 
<a href="mailto:me@domain.com" >send me some mail</a> 
<SCRIPT language="javascript">eval(unescape('%64%6f%63%75%6d%65%6e%74%2e%77%72%6 
9%74%65%28%27%3c%61%20%68%72%65%66%3d%22%6d%61%69%6c%74%6f%3a%6d%65%40%64%6f
%6d% 
61%69%6e%2e%63%6f%6d%22%20%3e%6d%65%40%64%6f%6d%61%69%6e%2e%63%6f%6d%3c%2f%61
%3e 
%27%29%3b'))</SCRIPT> 
<a href="mailto:%6d%65@%64%6f%6d%61%69%6e.%63%6f%6d" >&#x6d;&#x65;&#x40;&#x64;& 
#x6f;&#x6d;&#x61;&#x69;&#x6e;&#x2e;&#x63;&#x6f;&#x6d;</a> 
<a href="mailto:me@domain.com?subject=Hello%20to%20you%21" >me@domain.com</a> 
<a href="mailto:me@domain.com?cc=you@domain.com%2Cthey@domain.com" >me@domain.com</a> 
<a href="mailto:me@domain.com" class="email">me@domain.com</a> 
popup_init 
popup 函數整合了 overLib(用於彈出窗口的函數庫) 庫. 這些函數用於上下文敏感信息如幫助窗口或工
具提示. 若是準備使用 popup 函數,在頁首必須先調用 popup_init 函數. overLib 由 Erik Bosrup 開
發,其主頁位於 http://www.bosrup.com/web/overlib/. 
在 Smarty 2.1.2 版中沒有帶 overLib 庫. 必須下載該庫,將 overlib.js 文件置於文檔根目錄下,調用 
85
popup_init 的時候將該文件的相對路徑做爲參數"src"傳遞. 
popup_init 函數演示
{* popup_init 必須在頁面頂部被調用一次*} 
{popup_init src="/javascripts/overlib.js"} 
popup [建立 javascript 彈出窗口] 
popup 用於建立 javascript 彈出窗口. 
屬性  類型  是否必須  缺省值  描述 
text  string  Yes  n/a  彈出窗口中要顯示的
內容,文本或超文本
trigger  string  No  onMouseOver  觸發彈出窗口的條
件,可選擇
onMouseOver(鼠標
通過)或 onClick(鼠
標單擊) 
sticky  boolean  No  false  彈出窗口始終顯示,
直到關閉 
caption  string  No  n/a  標題文本內容 
fgcolor  string  No  n/a  彈出窗口內部顏色 
bgcolor  string  No  n/a  彈出窗口邊框顏色 
86
屬性  類型  是否必須  缺省值  描述 
textcolor  string  No  n/a  彈出窗口內部文字顏
色 
capcolor  string  No  n/a  彈出窗口標題顏色 
closecolor  string  No  n/a  設置"關閉"文本信息
的顏色 
textfont  string  No  n/a  設置內容文本使用的
字體類型 
captionfont  string  No  n/a  設置標題文本的字體
closefont  string  No  n/a  設置"關閉"文本信息
的字體類型 
textsize  string  No  n/a  設置內容文本使用的
字體大小 
captionsize  string  No  n/a  設置標題文本使用的
字體大小 
closesize  string  No  n/a  設置"關閉"文本信息
的字體大小 
width  integer  No  n/a  sets the width of 
the box 設置寬度 
height  integer  No  n/a  sets the height of 
the box 設置高度 
87
屬性  類型  是否必須  缺省值  描述 
left  boolean  No  false  使彈出窗口位於鼠標
左側 
right  boolean  No  false  使彈出窗口位於鼠標
右側 
center  boolean  No  false
使彈出窗口的中間位
置和鼠標位置重合 
above  boolean  No  false  使彈出窗口位於鼠標
上側. 注: 僅在設置
了 height 屬性時有
效 
below  boolean  No  false  使彈出窗口位於鼠標
下側 
border  integer  No  n/a  決定彈出窗口的邊框
厚度 
offsetx  integer  No  n/a  橫向顯示位置偏移量
offsety  integer  No  n/a  縱向顯示位置偏移量
fgbackground  url to image  No  n/a  使用背景圖片代替背
景顏色 
bgbackground  url to image  No  n/a
使用背景圖片代替邊
88
屬性  類型  是否必須  缺省值  描述 
框顏色. 注 1: 必須設
置 bgcolor 爲"",邊
框顏色纔不會顯示.2: 當有關閉連接
時,Netscape 會從新
渲染表格,看起來可
能會有點問題. 
closetext  string  No  n/a  自定義關閉連接顯示
文本 
noclose  boolean  No  n/a  不顯示關閉連接 
status  string  No  n/a  設置狀態欄顯示的文
本 
autostatus  boolean  No  n/a  設置彈出窗口狀態欄
顯示的文本爲當前窗
口狀態欄顯示的文本.: 該設置將覆蓋
status 的設置 
autostatuscap  string  No  n/a  設置狀態欄顯示的文
本爲標題欄顯示的信
息. 注: 該設置將覆
蓋 status 和
89
屬性  類型  是否必須  缺省值  描述 
autostatus 設置 
inarray  integer  No  n/a  該屬性告訴 overLib
在 ol_text 數組中讀
該屬性指定的索引的
元素到 text 中. 該屬
性能夠代替 text 屬性
caparray  integer  No  n/a  該屬性告訴 overLib
在 ol_caps 數組中讀
該屬性指定的索引的
元素到 caption 中. 
capicon  url  No  n/a  彈出前先顯示該圖象
snapx  integer  No  n/a  橫向將彈出窗口附着
於指定位置 
snapy  integer  No  n/a  縱向將彈出窗口附着
於指定位置 
fixx  integer  No  n/a  鎖定彈出窗口的橫向
位置. 注: 該設置將
覆蓋其它橫向設置 
fixy  integer  No  n/a  鎖定彈出窗口的縱向
位置. 注: 該設置將
90
屬性  類型  是否必須  缺省值  描述 
覆蓋其它縱向設置 
background  url  No  n/a  設置圖象做爲輸出表
格區塊的背景 
padx  integer,integer  No  n/a  在背景圖象後附加橫
向空白. 注: 該屬性
有兩個參數 
pady  integer,integer  No  n/a  在背景圖象後附加縱
向空白. 注: 該屬性
有兩個參數 
fullhtml  boolean  No  n/a  容許用戶徹底控制背
景圖片上的 HTML. 
HTML 代碼位於
"text"屬性中 
frame  string  No  n/a  控制彈出窗口在不一樣
的框架中. 關於此函
數更多詳細信息,請
查閱 overlib 文檔. 
timeout  string  No  n/a  調用特定 javascript
腳本函數,將返回值
顯示在彈出窗口中. 
91
屬性  類型  是否必須  缺省值  描述 
delay  integer  No  n/a  使得彈出窗口像一個
工具提示,窗口將顯
示到該屬性指定的時
間(毫秒) 
hauto  boolean  No  n/a  自動決定彈出窗口位
於鼠標的左側或右側.
vauto  boolean  No  n/a  自動決定彈出窗口位
於鼠標的上側或下側.
popup 函數演示
{* popup_init 必須在頁面頂部被調用一次*} 
{popup_init src="/javascripts/overlib.js"} 
{* 當移動鼠標通過時,用彈出窗口建立一個連接*} 
<A href="mypage.html" {popup text="This link takes you to my page!"}>mypage</A> 
{* 能夠在彈出窗口文本中使用html、連接等*} 
<A href="mypage.html" {popup sticky=true caption="mypage contents" 
text="<UL><LI>links<LI>pages<LI>images</UL>" snapx=10 snapy=10}>mypage</A> 
textformat [文本格式化] 
textformat 用於格式化文本. 該函數主要清理空格和特殊字符, 對段落按單詞邊界換行和行縮進等段落格
式化處理. 
92
屬性  類型  是否必須  缺省值  描述 
style  string  No  n/a  預處理風格 
indent  number  No  0  單行縮進的字符數目
indent_first  number  No  0  首行縮進的字符數目
indent_char  string  No  (single space)  填充縮進區域的字符
(或字符串) 
wrap  number  No  80  單行長度,超過該長
度自動折行 
wrap_char  string  No  \n  折行使用的字符(或
字符串),被附加在行
尾 
wrap_cut  boolean  No  false  若是設置爲真,換行
時不考慮換行點所在
位置是否爲完整單
詞,直接換行. 反之將
在單詞的邊界處換行.
assign  string  No  n/a  輸出值將被賦給模板
變量的名稱 
textformat 函數演示
{textformat wrap=40} 
This is foo. 
93
This is foo. 
This is foo. 
This is foo. 
This is foo. 
This is foo. 
This is bar. 
bar foo bar foo foo. 
bar foo bar foo foo. 
bar foo bar foo foo. 
bar foo bar foo foo. 
bar foo bar foo foo. 
bar foo bar foo foo. 
bar foo bar foo foo. 
{/textformat} 
輸出結果:
This is foo. This is foo. This is foo. 
This is foo. This is foo. This is foo. 
This is bar. 
bar foo bar foo foo. bar foo bar foo 
foo. bar foo bar foo foo. bar foo bar 
foo foo. bar foo bar foo foo. bar foo 
bar foo foo. bar foo bar foo foo. 
{textformat wrap=40 indent=4} 
This is foo. 
This is foo. 
This is foo. 
This is foo. 
This is foo. 
This is foo. 
This is bar. 
bar foo bar foo foo. 
bar foo bar foo foo. 
bar foo bar foo foo. 
bar foo bar foo foo. 
94
bar foo bar foo foo. 
bar foo bar foo foo. 
bar foo bar foo foo. 
{/textformat} 
輸出結果:
This is foo. This is foo. This is 
foo. This is foo. This is foo. This 
is foo. 
This is bar. 
bar foo bar foo foo. bar foo bar foo 
foo. bar foo bar foo foo. bar foo 
bar foo foo. bar foo bar foo foo. 
bar foo bar foo foo. bar foo bar 
foo foo. 
{textformat wrap=40 indent=4 indent_first=4} 
This is foo. 
This is foo. 
This is foo. 
This is foo. 
This is foo. 
This is foo. 
This is bar. 
bar foo bar foo foo. 
bar foo bar foo foo. 
bar foo bar foo foo. 
bar foo bar foo foo. 
bar foo bar foo foo. 
bar foo bar foo foo. 
bar foo bar foo foo. 
{/textformat} 
輸出結果:
This is foo. This is foo. This 
is foo. This is foo. This is foo. 
This is foo. 
95
This is bar. 
bar foo bar foo foo. bar foo bar 
foo foo. bar foo bar foo foo. bar 
foo bar foo foo. bar foo bar foo 
foo. bar foo bar foo foo. bar foo 
bar foo foo. 
{textformat style="email"} 
This is foo. 
This is foo. 
This is foo. 
This is foo. 
This is foo. 
This is foo. 
This is bar. 
bar foo bar foo foo. 
bar foo bar foo foo. 
bar foo bar foo foo. 
bar foo bar foo foo. 
bar foo bar foo foo. 
bar foo bar foo foo. 
bar foo bar foo foo. 
{/textformat} 
輸出結果:
This is foo. This is foo. This is foo. This is foo. This is foo. This is 
foo. 
This is bar. 
bar foo bar foo foo. bar foo bar foo foo. bar foo bar foo foo. bar foo 
bar foo foo. bar foo bar foo foo. bar foo bar foo foo. bar foo bar foo 
foo. 
7.  Config Files [配置文件] 
96
配置文件有利於設計者管理文件中的模板全局變量。最簡單的例子就是模板色彩變量。通常狀況下你若是
想改變一個程序的外觀色彩,你就必須經過去更改每個文件的顏色變量。若是有這個配置文件的話,色
彩變量就能夠保存在一個地方,只要改變這個配置文件就能夠實現你色彩的更新。 
配置文件語法演示:
# global variables 
pageTitle = "Main Menu" 
bodyBgColor = #000000 
tableBgColor = #000000 
rowBgColor = #00ff00 
[Customer] 
pageTitle = "Customer Info" 
[Login] 
pageTitle = "Login" 
focus = "username" 
Intro = """This is a value that spans more 
than one line. you must enclose 
it in triple quotes.""" 
# hidden section 
[.Database] 
host=my.domain.com 
db=ADDRESSBOOK 
user=php-user 
pass=foobar 
配置文件變量值可以在引號中使用,可是沒有必要。你能夠用單引號或者雙引號。若是你有一個不僅在一
個區域內使用的變量值,你可使用三引號(""")將它完整的封狀起來,能夠把它們放進配置文件,只要沒
有語法錯誤。建議在程序行前使用 「#」加一些註釋信息來標示。 
上面關於配置文件的例子共有兩個部分。每部分的名稱都是用一個「[]」給括起來。每部分的名稱命名規則
就是任意的字符串,只要不包括有符號「[」或者「]」。例子開頭的四個變量都是全局變量,也就是說不只僅是
能夠在一個區域內使用。這些變量老是從配置文件中載入。若是某個特定的局部變量已經載入,這樣全局
97
變量和局部變量都還能夠載入。若是當某個變量名既是全局變量又是局部變量時,局部變量將被優先賦予
值來使用。若是在一個局部中兩個變量名相同的話,最後一個將被賦值使用。 
配置文件是經過內建函數載入到模板 { config_load } 
能夠在某個段時期經過預先想好的變量名或者局部名隱藏變量或者完整的一個節。當你的應用程序讀取配
置文件和取得有用數據而不用讀取模板時這個很是有用,若是你有第三方來作模板編輯的話,能夠確定的
說它們不能經過載入配置文件到模板而讀取到任何有用的數據。 
8.  Debugging Console [調試控制檯] 
SMARTY 裏面包括有一個調式控制檯。它能夠告訴你模板裏面包含的全部內容,同時也能夠爲當前使用模
板中的變量和配置文件變量賦值。一個叫 debug.tpl 的模板包含了不少控制調式控制檯格式化的
SMARTY 類,在 SMARTY 中把變量 $debugging 設置爲 true ,若是須要的話設置變量 $debug_tpl 爲
模板源文件路徑(在 SMARTY_DIR 用已經自定義)。當你載入頁面時,有一個 JAVASCRIPT 控制檯窗口
將彈出且告訴你全部模板中包含的名稱和當前頁已經賦值的變量。若是要了解某個模板的詳細變量,能夠
去看 {debug} 模板定義函數章節。若是要關閉掉調試控制檯,設置變量 $debugging 爲 false 就能夠
了。若是你開啓了 $debugging ctrl 選項,也能夠經過放置 SMARTY_DEBUG 在 URL 來臨時打開調
試控制檯。 
技術提示:當你使用函數 fetch() API 時調試控制檯不能用,在使用 display() 時纔可使用。它將自動
地把 javascript 添加到已經應用模板的每個按扭中。若是你不喜歡 javascript ,你能夠編輯文件 
debug.tpl 模板,格式化輸出爲你本身喜歡的格式。調試數據是沒有被緩存的,而且 debug.tpl 信息也
沒有包含在調試控制檯的輸出文件中。 
注意:每一個模板和配置文件的載入都是以秒來計算的,甚至是以幾分之一秒。 
98
2、 Smarty For Programmers [程序員篇] 
9.  Constants[常量] 
SMARTY_DIR [Smarty 目錄] 
定位 Smarty 類文件的完整系統路徑,若是沒有定義 Smarty 目錄,Smarty 將會試着自動建立合適的值。
若是定義了,路徑必需要以斜線結束。 
SMARTY_DIR 演示
// 設置到smarty 的路徑
define("SMARTY_DIR","/usr/local/lib/php/Smarty/"); 
require_once(SMARTY_DIR."Smarty.class.php"); 
10. Variables [變量] 
$template_dir [模板目錄變量] 
該變量定義默認模板目錄的名字。當包含文件時,若是不提供一個源類型(即源地址),那麼將會到模板
目錄中尋找。默認狀況下,目錄是:「./templates」 ,也就是說他將會在和 php 執行腳本相同的目錄下尋找
模板目錄。 
技巧注意:不推薦把模板目錄放在 web 服務器根目錄下。 
$compile_dir [編譯目錄變量] 
99
該變量定位編譯模板的目錄名字。默認狀況下,目錄是:「./templates_c」,也就是說他將會在和 php 執行
腳本相同的目錄下尋找編譯目錄。 
技巧:該設置必須是一個相對或絕對路徑。包含路徑不用於寫文件。 
技巧:不推薦把編譯目錄放在 web 服務器根目錄下。 
$config_dir [配置目錄變量] 
該變量定義用於存放模板配置文件的目錄,默認狀況下,目錄是:「./configs」,也就是說他將會在和 php
執行腳本相同的目錄下尋找配置目錄。 
技巧:不推薦把編譯目錄放在 web 服務器根目錄下。 
$plugins_dir [插件目錄變量] 
該變量定義 Smarty 尋找所需插件的目錄。默認是在 SMARTY 目錄下的「plugins」目錄。若是提供了一個
相對路徑,Smarty 將首先在 SMARTY 目錄下尋找,而後到當前工做目錄下尋找,繼而到 php 包含路徑
中的每一個路徑中尋找。 
技巧:爲了獲取最好性能,不要將插件目錄安裝成必須使用 php 包含路徑的境地。最好用一個絕對路徑名
字,或者是一個相對 SMARTY 目錄或當前工做目錄的路徑。 
$debugging [調試變量] 
它能啓動調試控制檯。該控制檯是一個 javascript 窗口,該窗口告訴你被包含的模板和應用於當前模板頁
100
面的變量。 
$debug_tpl [調試模板變量] 
該變量定義用於調試控制檯的模板文件名字。默認狀況下,其名字爲:debug.tpl,位於 Smarty 目錄中。
$debugging_ctrl [調試控制變量] 
該變量做用是容許以交替的方式啓動調試設置。NONE 表示不容許交替方式。URL 表示當關鍵詞
SMARTY_DEBUG 出如今 QUERY_STRING(查詢字符串)中時,針對此腳本的調用,調試被啓動。若是
$debugging 變量是真,則忽略其調試控制變量值。 
$global_assign [全局配置變量] 
定義一組老是隱式地做用於模板引擎的變量列表。這對於使全局變量或服務器變量可用於全部模板是很方
便的,由於無需手工配置它們。在全局配置中的每一元素應當要麼是一全局變量的名字,要麼是一鍵/值
對(鍵是 全局數組 名,值是 對應該全 局數組的 變量數組)。$SCRIPT_NAME 變量默認屬於
$HTTP_SERVER_VARS 數組。 
技巧:服務器變量能夠經過$smarty 變量得到,如{$smarty.server.SCRIPT_NAME}。參看$smarty變量
一節。 
$undefined [未定義變量] 
101
該變量爲 Smarty 設定沒有獲得定義的變量的值,默認爲空.當前僅用來設定全局配置中的未定義變量爲一
個默認值. 
$autoload_filters [自動加載過濾器變量] 
若是但願在每次模板調用過程當中加載過濾器,你能夠指定他們使用此變量,Smarty 將自動爲你加載它們.該
變量是一個聯合數組,在數組中鍵是過濾器類型,值是過濾器名字所組成的數組. 
例如: 
$smarty->autoload_filters = array('pre' => array('trim', 'stamp'), 
'output' => array('convert')); 
$compile_check [編譯檢查變量] 
每次調用 PHP 應用程序,Smarty 會試着查看自上次編譯時間以來,當前模板是否被修改過.若是修改過了,
她會從新編譯那個模板.若是模板尚未被編譯過,她將編譯模板而無論編譯檢查如何設置.默認狀況下編譯
檢查這個變量設置爲 true.一旦一個應用程序投入產品中(模板將不會修改了),就再也不須要編譯檢查這一步
了.爲了最大性能,肯定將$compile_check 設爲"false".注意:若是設爲了"false",雖然模板文件被修改,但你
不會看到修改結果,由於模板沒有獲得從新編譯.若是啓動了緩存和編譯檢查,一旦有關模板文件或配置文件
被更新,緩存文件將會重建. 
$force_compile [強迫編譯變量] 
強迫 Smarty 每次調用(從新)編譯模板時.這項設置不受$compile_check 的限制.默認狀況下,它是無效的.
102
它對於開發和調試很方便.但它決不能使用於產品環境下.若是啓動了緩存,每次將會從新生成緩存文件. 
$caching [緩存變量] 
告訴 Smarty 是否緩存模板的輸出.默認狀況下,她設爲 0,或無效.若是模板產生冗餘內容,建議打開緩存.這樣
有利於得到良好的性能增益.你也能夠爲同一模板設有多個緩存.當值爲 1 或 2 時啓動緩存.1 告訴 Smarty 
使用當前的$cache_lifetime 變量判斷緩存是否過時.2 告訴 Smarty 使用生成緩存時的 cache_lifetime
值.用這種方式你正好能夠在獲取模板以前設置緩存生存時間,以便較精確地控制緩存什麼時候失效. 
若是啓動了編譯檢查,一旦任何的模板文件或配置文件(有關緩存部分的配置文件)被修改,緩存的內容將會
從新生成.若是啓動了強迫編譯,緩存的內容將總會從新生成. 
$cache_dir [緩存目錄變量] 
這是存放模板緩存的目錄名.默認狀況下,它是:"./cache",也就是說你能夠在和 php 執行腳本相同目錄下尋
找緩存目錄.你也能夠用你本身的自定義緩存處理函數來控制緩存文件,它將會忽略這項設置. 
技巧:這項設置必須是一個相對或絕對路徑.包含路徑不用於寫文件. 
技巧:不推薦將此目錄放在 web 服務器根目錄下. 
$cache_lifetime [緩存生存時間變量] 
該變量定義模板緩存有效時間段的長度(單位:秒),一旦這個時間失效,則緩存將會從新生成.若是要想實現所
有效果,$caching 必須因$cache_lifetime 須要而設爲"true".值爲-1 時,將強迫緩存永不過時.0 值將致使緩
存老是從新生成(僅有利於測試,一個更有效的使緩存無效的方法是設置$caching = false.) 
103
若是啓動了強迫編譯,則緩存文件每次將會從新生成.要想有效地中止緩存,你能夠利用 clear_all_cache() 
函數清除全部的緩存文件,或者利用 clear_cache() 函數清除個別文件(或文件組). 
技巧:若是你想給某些模板設定它們本身的緩存生存時間,你能夠在調用 display()或 fetch()函數以前,經過
設置$caching = 2,而後設置$cache_lifetime 爲一個惟一值來實現. 
$cache_handler_func [緩存處理函數變量] 
能夠提供一個自定義函數來處理緩存文件,而不是經過變量$cache_dir 使用內置方法.詳見:cache handler 
function section 
$cache_modified_check [緩存修正檢查變量] 
若是設置該變量爲真,Smarty 將分析客戶端發送來的 If-Modified-Since 頭信息.若是緩存文件時間戳自上
次訪問以來沒有改變,則發送一個"304 Not Modified"頭,而不是緩存文件內容.這種方式僅工做於沒有 
{insert} 標記的緩存內容. 
$config_overwrite [配置覆蓋變量] 
若是設該變量爲真,則從配置文件中讀取出來的變量將會互相覆蓋.不然,變量將會放到一個數組中.若是你
想把配置文件中的數據存儲到數組裏,這種方式是頗有用的,僅僅列出每一個元素屢次就能夠了.默認狀況下,
設爲真. 
$config_booleanize [配置布爾化變量] 
104
若是該變量設爲真,配置文件中的 on/true/yes 和 off/false/no 值會自動轉化爲布爾值.這樣的話,你就可
以在模板中像{if #foobar#} ... {/if}這樣使用這些值了.若是 foobar 爲 on, true 或 yes,那麼 {if}語句就會
執行了.默認狀況下,該變量值爲真. 
$config_read_hidden [配置讀取隱藏變量] 
若是設爲真,在配置文件中的隱藏節塊(******不會翻譯啦)能夠從模板中讀取出來.典型的你會設爲假,這樣
你能夠在配置文件裏存放敏感數據,例如數據庫參數,而不用擔憂模板會調用他們.默認狀況下,該變量設爲
假. 
$config_fix_newlines [配置固定換行符變量] 
若是該變量設爲真,那麼在配置文件中的 mac 和 dos 換行符(\r and \r\n)在語法解析時將會轉換爲\n. 
默認狀況下,該變量爲真. 
$default_template_handle r_func [默認模板處理函數變量] 
該函數在模板不能從它的源目錄下獲取時會獲得調用. 
$php_handling [PHP 處理變量] 
該變量告訴 Smarty 怎樣處理嵌入到模板中的 php 代碼.有四種可能的設置,默認爲
105
SMARTY_PHP_PASSTHRU.注意:改變量的設置不會影響模板裏面{php}{/php}標記中的 php 代碼. 
SMARTY_PHP_PASSTHRU - 原樣輸出標記. 
SMARTY_PHP_QUOTE - 做爲 html 實體引用標記 
SMARTY_PHP_REMOVE - 從模板中移出標記. 
SMARTY_PHP_ALLOW - 將做爲 php 代碼執行標記. 
極度不同意將 php 代碼嵌入到模板中. 
$security [安全變量] 
安全變量要麼是真,要麼是假.默認爲假.當你不信任模板中的可編輯部分(例如經過 ftp 方式上傳編輯的),並
想經過模板語言減少系統非安全的風險時,安全變量設爲真比較適合.設爲真會將下面的規則強加於模板語
言中,除非特別地用$security_settings 覆蓋. 
若是變量$php_handling 設爲了 SMARTY_PHP_ALLOW,則會隱式地被修改 成
SMARTY_PHP_PASSTHRU 
PHP 函數在 IF 語句中是不容許的,除了在$security_settings 中另行指出. 
106
模板僅能夠包含於$secure_dir 數組列出的目錄中. 
本地文件僅能夠用{fetch}獲取於$secure_dir 數組列出的目錄中. 
不容許有{php}{/php}標記. 
PHP 函數不容許做爲修正器,除了在$security_settings 中指出. 
$secure_dir [安全目錄變量] 
這是一個與安全有關的本地目錄數組變量.當啓動安全變量時{include} 和 {fetch}會用到此數組變量. 
$security_settings [安全配置變量] 
用於當啓動安全變量時覆蓋或另行指定安全配置.有如下幾種可能的配置: 
PHP_HANDLING - 真或假.若是真,則不檢查$php_handling 的配置. 
IF_FUNCS - 這是一個可容許包含在 if 語句中的 php 函數名數組. 
INCLUDE_ANY - 真或假.若是真,能夠從文件系統中包含任何模板,而無論$secure_dir 目錄設置如何. 
PHP_TAGS - 真或假.若是真,{php}{/php}容許在模板中存在. 
107
MODIFIER_FUNCS - 這是一個可用做修正器的 php 函數名數組. 
$trusted_dir [信任目錄變量] 
信任目錄變量僅用在$security 啓動以後.這是一個全部創建信任的目錄數組變量.你能夠將 php 腳本放到
這些信任目錄中,這些腳本會直接在模板裏以{include_php}標記獲得執行. 
$left_delimiter [左結束符變量] 
用於模板語言中,默認是"{". 
$right_delimiter [右結束符變量] 
用於模板語言中,默認是"}". 
$compiler_class [編譯類變量] 
指定 Smarty 用來編譯模板的編譯類名.默認爲:'Smarty_Compiler'.僅適合於高級用戶. 
$request_vars_order [變量順序變量] 
請求變量的順序在這裏配置,相似於 php.ini 中的變量順序. 
108
$request_use_auto_globals [自動全局變量] 
指定 Smarty 是否使用 php 的$HTTP_*_VARS[]數組變量(默認$request_use_auto_globals=false)或$_*[]
數組($request_use_auto_globals=true)變量.這對使用了{$smarty.request.*}, {$smarty.get.*}等標記的
模板有影響.值得注意的是:若是設置$request_use_auto_globals 爲真,variable.request.vars.order 就無
效了但 php 的 gpc_order 配置值還有做用. 
$compile_id [編譯 ID 變量] 
永久的編譯鑑別號.做爲一個可選辦法將相同的編譯號傳遞給每一個函數調用,你能夠設置這個編譯 id,隨後此
id 將會被隱含地使用. 
$use_sub_dirs [子目錄變量] 
若是你的 php 環境不容許 Smarty 建立子目錄,則設此變量爲假.子目錄很是有用,因此儘量的使用他們. 
$default_modifiers [默認修正器變量] 
這是一個修正器數組變量,這些修 正器隱式地做用於模板中的每一個變量.例如:針 對 HTML,用 數 組
('escape:"htmlall"')默認地忽略每一個變量;爲了使一個變量免除於默認修正器,請將參數爲"nodefaults"的
特殊"smarty"修正器做用於它,例如:{$var|smarty:nodefaults}. 
109
$default_resource_type [默認源類型變量] 
該變量告訴 smarty 隱式地使用什麼源類型.默認值爲'file',也就是說,$smarty->display('index.tpl');和
and $smarty->display('file:index.tpl');從意思上是同樣的.祥見 resource 一章。 
11. Methods [方法] 
append [添加] 
void append (mixed var) 
void append (string varname, mixed var) 
void append (string varname, mixed var, boolean merge) 
添加指定的元素到數組中。若是是添加一個字符串,該字符串會被轉換爲數組格式後再進行添加。所添加
的數據能夠採用 名稱, 數值的格式,或者是使用 「=>」鏈接的聯合數組格式。若是第三個可選參數被指定
爲 TRUE,所添加的數據會和數組中現有數據進行合併,而不是直接添加。 
注意:使用第三個參數「merge」時要考慮到數組的索引,因此,若是添加和被添加的數組都是以數字爲索
引,他們會互相覆蓋,或者產生不連續的索引。這並不象 PHP 中的 array_merge()函數,後者會刪除原有
的數字索引,從新對索引進行編號。 
110
添加演示:
// passing name/value pairs 以  名稱,數值  的方式添加
$smarty->append("Name","Fred");$smarty->append("Address",$address); 
// passing an associative array 以聯合數組的方式添加
$smarty->append(array("city" => "Lincoln","state" => "Nebraska")); 
append_by_ref [引用添加] 
void append_by_ref (string varname, mixed var) 
void append_by_ref (string varname, mixed var, boolean merge) 
本函數用於採用引用的方式把變量的值添加到原有值以後。若是採用引用的方式添加了一個變量,那麼當
這個變量的值改變時,被添加的值也隨之改變。對於對象,append_by_ref()函數也可以避免對於被添加
對象的內存拷貝。關於變量引用的進一步解釋能夠查看 PHP 手冊。若是第三個可選參數設置爲 true,數
值將會和現有數組合並,而不是添加在數組後面。 
注意:使用第三個參數「merge」時要考慮到數組的索引,因此,若是添加和被添加的數組都是以數字爲索
引,他們會互相覆蓋,或者產生不連續的索引。這並不象 PHP 中的 array_merge()函數,後者會刪除原有
的數字索引,從新對索引進行編號。 
引用添加演示:
// appending name/value pairs 以  名稱,數值
$smarty->append_by_ref("Name",$myname); 
$smarty->append_by_ref("Address",$address); 
111
assign [賦值] 
void assign (mixed var) 
void assign (string varname, mixed var) 
用來賦值到模板中。能夠指定一對 名稱/數值 ,也能夠指定包含 名稱/數值 的聯合數組。 
賦值演示:
// passing name/value pairs 名稱/數值  方式
$smarty->assign("Name","Fred"); 
$smarty->assign("Address",$address); 
// passing an associative array 聯合數組方式
$smarty->assign(array("city" => "Lincoln","state" => "Nebraska")); 
assign_by_ref [引用賦值] 
void assign_by_ref (string varname, mixed var) 
採用引用的方式賦值到模板中,而不是在模板中建立一個數值的副本。引用的概念能夠查看 PHP 手冊的
變量引用部分。 
注意:本函數用於採用引用的方式賦值到模板中。若是把一個變量採用引用的方式賦值後,變量的值又被
改變了,那麼在模板中將會看到變量改變後的值。對於對象,assign_by_ref()函數也避免了對象的內存拷
112
貝。進一步的解釋能夠查看 PHP 手冊的變量引用部分。 
引用賦值演示:
// passing name/value pairs 
$smarty->assign_by_ref("Name",$myname); 
$smarty->assign_by_ref("Address",$address); 
clear_all_assign [清除全部賦值] 
void clear_all_assign () 
清除全部已賦值到模板中的值。 
清除全部賦值演示:
// 清除全部已賦值的變量
$smarty->clear_all_assign(); 
clear_all_cache [清除全部緩存] 
void clear_all_cache (int expire time) 
清除全部模板緩存。做爲可選參數「expire time」,你能夠指定一個以秒爲單位的最小時間,超過這個時間
的緩存都將被清除掉。 
清除全部緩存演示:
// 清除所有緩存 
113
$smarty->clear_all_cache(); 
clear_assign [清除賦值] 
void clear_assign (string var) 
清除指定模板變量的值。能夠指定單獨的一個變量名稱,或者是一個數組。 
清除賦值演示:
// 清除一個變量
$smarty->clear_assign("Name"); 
// 清除多個變量
$smarty->clear_assign(array("Name","Address","Zip")); 
clear_cache [清除緩存] 
void clear_cache (string template [, string cache id [, string compile id [, int expire time]]]) 
清除指定模板的緩存。若是這個模板有多個緩存,你能夠用第二個參數指定要清除緩存的緩存號,還能夠
經過第三個參數指定編譯號。你能夠把模板分組,以即可以方便的清除一組緩存。更多的信息能夠查看緩
存部分。第四個參數是可選的,用來指定超過某一時間(以秒爲單位)的緩存纔會被清除。 
清除緩存演示:
// 清除某一模板的緩存
$smarty->clear_cache("index.tpl"); 
// 清除某一模板的多個緩存中指定緩存號的一個 
114
$smarty->clear_cache("index.tpl","CACHEID"); 
clear_compiled_tpl [清除已編譯模板] 
void clear_compiled_tpl (string tpl_file) 
清除指定模板資源的編譯版本,若是不指定則清除全部已編譯模板。除非特殊的須要,通常狀況下不須要
使用該函數。 
(Fwolf:這個函數並不會刪除模板自己,而是刪除 templates_c 目錄中存放的編譯後生成的文件,這些編
譯後的文件會在下一次頁面調用的時候再一次被生成。) 
清除已編譯模板演示:
清除指定模板資源的編譯文件
$smarty->clear_compiled_tpl("index.tpl"); 
清除全部已編譯的模板文件
$smarty->clear_compiled_tpl(); 
clear_config [清除配置] 
void clear_config ([string var]) 
清除全部配置變量,若是指定了變量名稱,則只清除所指定的配置變量。 
清除配置演示:
// 清除全部配置變量
$smarty->clear_config(); 
115
清除一個配置變量
$smarty->clear_config('foobar'); 
config_load [加載配置] 
void config_load (string file [, string section]) 
加載配置文件,並將其中的數據傳送到模板中,它的功能和 config_load 函數是同樣的。 
注意:到 Smarty 2.4.0 爲止,已賦值的模板變量對於 fetch()和 display()方法是共享調用的,而使用
config_load()加載的變量是全局的。而且在編譯時配置文件也將被編譯,以加快執行速度,而且遵照
force_compile 和 compile_check 設置。 
加載配置演示:
// 加載配置變量
$smarty->config_load('my.conf'); 
加載其中一節
$smarty->config_load('my.conf','foobar'); 
display [顯示] 
void display (string template [, string cache_id [, string compile_id]]) 
顯示模板,須要指定一個合法的模板資源的類型和路徑。還能夠經過第二個可選參數指定一個緩存號,相
關的信息能夠查看緩存。 
116
經過第三個可選參數,能夠指定一個編譯號。這在你想把一個模板編譯成不一樣版本時使用,好比針對不一樣
的語言編譯模板。編譯號的另一個做用是,若是你有多個$template_dir 模板目錄,但只有一個
$compile_dir 編譯後存檔目錄,這時能夠爲每個$template_dir 模板目錄指定一個編譯號,以免相同
的模板文件在編譯後會互相覆蓋。相對於在每一次調用 display()的時候都指定編譯號,也能夠經過設置
$compile_id 編譯號屬性來一次性設定。 
顯示演示:
include("Smarty.class.php"); 
$smarty = new Smarty; 
$smarty->caching = true; 
只有在緩存不存在時才調用數據庫
if(!$smarty->is_cached("index.tpl")) 
{ 
// 裝入數據
$address = "245 N 50th"; 
$db_data = array( 
"City" => "Lincoln", 
"State" => "Nebraska", 
"Zip" = > "68502" 
); 
$smarty->assign("Name","Fred"); 
$smarty->assign("Address",$address); 
$smarty->assign($db_data); 
} 
// 顯示輸出
$smarty->display("index.tpl"); 
經過模板資源的語法來使用不在$template_dir 模板目錄下的文件。 
顯示模板資源演示:
// 絕對路徑
$smarty->display("/usr/local/include/templates/header.tpl"); 
117
// 絕對路徑(另一種方式)
$smarty->display("file:/usr/local/include/templates/header.tpl"); 
// WINDOS平臺下的絕對路徑(必須使用「file:」前綴)
$smarty->display("file:C:/www/pub/templates/header.tpl"); 
// 從模板資源"db"中調用
$smarty->display("db:header.tpl"); 
fetch [取得輸出的內容] 
string fetch (string template [, string cache_id [, string compile_id]]) 
返回一個模板輸出的內容(HTML 代碼),而不是直接顯示出來,須要指定一個合法的模板資源的類型和
路徑。你還能夠經過第二個可選參數指定一個緩存號,相關的信息能夠查看緩存。 
經過第三個可選參數,能夠指定一個編譯號。這在你想把一個模板編譯成不一樣版本時使用,好比針對不一樣
的語言編譯模板。編譯號的另一個做用是,若是你有多個$template_dir 模板目錄,但只有一個
$compile_dir 編譯後存檔目錄,這時能夠爲每個$template_dir 模板目錄指定一個編譯號,以免相同
的模板文件在編譯後會互相覆蓋。相對於在每一次調用 display()的時候都指定編譯號,也能夠經過設置
$compile_id 編譯號屬性來一次性設定。 
取得輸出的內容演示:
include("Smarty.class.php"); 
$smarty = new Smarty; 
$smarty->caching = true; 
只有在緩存不存在時才調用數據庫
if(!$smarty->is_cached("index.tpl")) 
118
{ 
// 裝入數據
$address = "245 N 50th"; 
$db_data = array( 
City" => "Lincoln", 
"State" => "Nebraska", 
"Zip" = > "68502" 
); 
$smarty->assign("Name","Fred"); 
$smarty->assign("Address",$address); 
$smarty->assign($db_data); 
} 
// 捕獲輸出
$output = $smarty->fetch("index.tpl"); 
// 對將要輸出的內容進行處理
echo $output; 
get_config_vars [取配置變量的值] 
array get_config_vars ([string varname]) 
返回指定配置變量的值。若是不指定變量名稱,則會返回一個包含全部已加載配置變量的值的數組。 
取配置變量的值演示:
// 獲得已加載配置變量「foo」的值
$foo = $smarty->get_config_vars('foo'); 
// 獲得全部已加載配置變量的值
$config_vars = $smarty->get_config_vars(); 
// 輸出
print_r($config_vars); 
119
get_registered_object [取得已註冊的對象] 
array get_registered_object (string object_name) 
返回一個已註冊對象的引用。用於在一個自定義函數裏直接調用已註冊的對象。 
取得已註冊的對象演示:
function smarty_block_foo($params, &$smarty) { 
if (isset[$params['object']]) { 
// 取得已註冊對象的引用/地址
$obj_ref =& $smarty->&get_registered_object($params['object']); 
// 如今就可使用$obj_ref來直接調用對象了,它直接指向該對象,而不是一個拷貝
} 
} 
get_template_vars [取得模板變量的值] 
array get_template_vars ([string varname]) 
返回一個指定的已賦值的模板變量的值。若是不指定參數,則返回一個包含全部已賦值模板變量的值的數
組。 
取得模板變量的值演示:
// 獲得一個已賦值的模板變量的值
$foo = $smarty->get_template_vars('foo'); 
// 獲得全部已賦值的模板變量的值
$tpl_vars = $smarty->get_template_vars(); 
// 查看 
120
print_r($tpl_vars); 
is_cached [是否已被緩存] 
void is_cached (string template, [string cache_id]) 
在指定模板的緩存存在是返回真。只有在緩存設置爲真時纔可用。 
是否已被緩存演示:
$smarty->caching = true; 
if(!$smarty->is_cached("index.tpl")) { 
// 調用數據庫,並對變量進行賦值
...... 
} 
$smarty->display("index.tpl"); 
若是模板有多個緩存的話,能夠經過第二個可選參數指定緩存號。 
多緩存模板的判斷演示:
$smarty->caching = true; 
if(!$smarty->is_cached("index.tpl","FrontPage")) { 
// 調用數據庫,並對變量進行賦值
...... 
} 
$smarty->display("index.tpl","FrontPage"); 
load_filter [加載過濾器] 
121
void load_filter (string type, string name) 
這個函數用來加載過濾器插件。第一個參數指定過濾器的類型,只能是下列之一:「pre」,「post」,或者是
「output」。第二個參數指定過濾器插件的名稱,好比「trim」。 
加載過濾器插件演示:
// 裝入名爲'trim'  的預過濾器
$smarty->load_filter('pre', 'trim'); 
// 裝入另外一個名爲'datefooter'  的預過濾器
$smarty->load_filter('pre', 'datefooter'); 
// 裝入名爲'compress'  的輸出過濾器
$smarty->load_filter('output', 'compress'); 
register_block [註冊一個塊] 
void register_block (string name, mixed impl, bool cacheable, array or null cache_attrs) 
用來動態註冊/定義塊函數插件。前兩個參數指定塊函數名稱和執行函數的名稱。 
執行函數的格式能夠是一個包含函數名稱的字符串;也能夠是一個 array(&$object, $method)數組形式,
其中&$object 是一個對象的引用,而$method 是它的一個方法;還能夠是一個 array(&$ class, $method)
數組形式,其中$class 是一個類的名稱,$method 是類中的一個方法。 
$cacheable$cache_attrs 參數在大多數狀況下能夠省略。它們的使用方法能夠查看控制插件輸出的
緩存。 
122
註冊一個塊演示:
/* PHP */ 
$smarty->register_block("translate", "do_translation"); 
function do_translation ($params, $content, &$smarty, &$repeat) { 
if (isset($content)) { 
$lang = $params['lang']; 
// 對$content 進行轉換
...... 
return $translation; 
} 
} 
{* template *} 
{translate lang="br"} 
Hello, world! 
{/translate} 
register_compiler_function [註冊編譯函數] 
void register_compiler_function (string name, mixed impl, bool cacheable) 
動態註冊一個編譯函數插件,前兩個參數是編譯函數的名稱、執行函數的名稱。 
執行函數的格式能夠是一個包含函數名稱的字符串;也能夠是一個 array(&$object, $method)數組形式,
其中&$object 是一個對象的引用,而$method 是它的一個方法;還能夠是一個 array(&$ class, $method)
數組形式,其中$class 是一個類的名稱,$method 是類中的一個方法。 
$cacheable 參數在大多數狀況下能夠省略。具體的使用方法能夠查看控制插件輸出的緩存。 
123
register_function [註冊函數] 
void register_function (string name, mixed impl, bool cacheable, array or null cache_attrs) 
動態註冊模板函數插件,前兩個參數是模板函數名稱和執行函數名稱。 
執行函數的格式能夠是一個包含函數名稱的字符串;也能夠是一個 array(&$object, $method)數組形式,
其中&$object 是一個對象的引用,而$method 是它的一個方法;還能夠是一個 array(&$ class, $method)
數組形式,其中$class 是一個類的名稱,$method 是類中的一個方法。 
$cacheable$cache_attrs 參數在大多數狀況下能夠省略。它們的使用方法能夠查看控制插件輸出的
緩存。 
註冊函數演示:
$smarty->register_function("date_now", "print_current_date"); 
function print_current_date ($params) { 
extract($params); 
if(empty($format)) $format="%b %e, %Y"; 
return strftime($format,time()); 
} 
// 如今你能夠在模板中這樣顯示日期:{date_now} 
// 或者用{date_now format="%Y/%m/%d"}的格式進行格式化
register_modifier [註冊修飾器] 
void register_modifier (string name, mixed impl) 
124
動態註冊一個修飾器插件,須要制定模板修飾器的名稱,和實現具體功能的函數。 
執行函數的格式能夠是一個包含函數名稱的字符串;也能夠是一個 array(&$object, $method)數組形式,
其中&$object 是一個對象的引用,而$method 是它的一個方法;還能夠是一個 array(&$ class, $method)
數組形式,其中$class 是一個類的名稱,$method 是類中的一個方法。 
註冊修飾器演示:
// 把PHP的stripslashes函數影像爲Smarty模板的修飾器
$smarty->register_modifier("sslash","stripslashes"); 
// 如今能夠在模板中使用{$var|sslash}的格式來去除變量中的特殊符號了
register_object [註冊對象] 
void register_object (string object_name, object $object, arrayallowed methods/properties, 
boolean format, array block methods) 
註冊一個在模板中使用的對象,相關的例子在手冊的對象小節中。 
register_outputfilter [註冊輸出過濾器] 
void register_outputfilter (mixed function) 
動態註冊一個輸出過濾器,以便在模板輸出以前進行操做。如何設立輸出過濾函數,請查看模板輸出過濾。 
125
執行函數的格式能夠是一個包含函數名稱的字符串;也能夠是一個 array(&$object, $method)數組形式,
其中&$object 是一個對象的引用,而$method 是它的一個方法;還能夠是一個 array(&$ class, $method)
數組形式,其中$class 是一個類的名稱,$method 是類中的一個方法。 
register_postfilter [註冊提交過濾器] 
void register_postfilter (mixed function) 
動態註冊一個在模板編譯以後執行的提交過濾器。如何設立提交過濾函數,請查看模板提交過濾器。 
執行函數的格式能夠是一個包含函數名稱的字符串;也能夠是一個 array(&$object, $method)數組形式,
其中&$object 是一個對象的引用,而$method 是它的一個方法;還能夠是一個 array(&$ class, $method)
數組形式,其中$class 是一個類的名稱,$method 是類中的一個方法。 
register_prefilter [註冊預過濾器] 
void register_prefilter (mixed function) 
註冊一個在模板編譯以前執行的預過濾器。如何設立預過濾函數,請查看模板預過濾器。 
執行函數的格式能夠是一個包含函數名稱的字符串;也能夠是一個 array(&$object, $method)數組形式,
其中&$object 是一個對象的引用,而$method 是它的一個方法;還能夠是一個 array(&$ class, $method)
126
數組形式,其中$class 是一個類的名稱,$method 是類中的一個方法。 
register_resource [註冊資源] 
void register_resource (string name, array resource_funcs) 
動態註冊一個資源插件,前兩個參數是資源的名稱和執行函數的數組。關於如何創建一個函數取出模板,
請看模板資源部分。 
注意:資源的名稱主要要有兩個字符組成。一個字符的資源名稱將被忽略,並被視爲是文件路徑的一部分,
好比$smarty->display('c:/path/to/index.tpl');。 
執行函數數組必須包含 4 或 5 個元素。包含 4 個元素的狀況下,這些函數分別是處理「source 源文本」、
「timestamp 時間戳」、「secure 安全」、「trusted 可信的」的函數。5 個元素的狀況下,第一個元素必須是一
個對象的引用,或者是一個類名,後面的 4 個元素是實現處理「source 源文本」、「timestamp 時間戳」、
「secure 安全」、「trusted 可信的」的方法。 
註冊資源演示:
$smarty->register_resource("db", array( 
"db_get_template", 
"db_get_timestamp", 
"db_get_secure", 
"db_get_trusted" 
) 
); 
127
trigger_error [觸發錯誤] 
void trigger_error (string error_msg, [int level]) 
用來使用 Smarty 內置的方法輸出錯誤信息。參數 level 能夠是 PHP 函數 trigger_error()的一個參數值,
如 E_USER_NOTICE, E_USER_WARNING 等,通常默認爲 E_USER_WARNING。 
template_exists [模板是否存在] 
bool template_exists (string template) 
檢查制定的模板是否存在,參數 template 既能夠是模板的文件路徑,也能夠是指定的資源字符串。 
unregister_block [註銷一個塊] 
void unregister_block (string name) 
動態註銷一個塊函數插件,參數是塊函數的名稱。 
unregister_compiler_function [註銷編譯函數] 
void unregister_compiler_function (string name) 
128
動態註銷一個編譯函數,參數 name 是編譯函數的名稱。 
unregister_function [註銷函數] 
void unregister_function (string name) 
動態註銷一個模板函數插件,參數是模板函數的名稱。 
註銷函數演示:
// 讓模板設計者不能操做系統文件
$smarty->unregister_function("fetch"); 
unregister_modifier [註銷修飾器] 
void unregister_modifier (string name) 
動態註銷修飾器插件,參數是模板修飾器的名稱。 
註銷修飾器演示:
// 禁止模板設計者去除元素的標記
$smarty->unregister_modifier("strip_tags"); 
unregister_object [註銷對象] 
void unregister_object (string object_name) 
129
註銷一個對象。 
unregister_outputfilter [註銷輸出過濾器] 
void unregister_outputfilter (string function_name) 
動態註銷一個輸出過濾器。 
unregister_postfilter [註銷提交過濾器] 
void unregister_postfilter (string function_name) 
動態註銷提交過濾器(在模板編譯完成後執行)。 
unregister_prefilter [註銷預過濾器] 
void unregister_prefilter (string function_name) 
動態註銷一個預過濾器(模板編譯前執行)。 
unregister_resource [註銷資源] 
130
void unregister_resource (string name) 
動態註銷一個資源插件,參數是資源的名稱。 
註銷資源演示: 
$smarty->unregister_resource("db"); 
12. Caching [緩存] 
緩存被用來保存一個文檔的輸出從而加速 display()或 fetch()函數的執行。若是一個函數被加進緩存,那
麼實際輸出的內容將用緩存來代替。緩存可以讓事物很是快速的執行,特別是帶有長計算時間的模板。一旦
display()或 fetch()用緩存輸出,那麼一個緩存文檔將很是容易用幾個模板文檔或是配置文檔等來組成〔功
力不小〕。 
一旦模板是動態〔應該不難理解〕的,哪些文檔你加了緩存,緩存時間多長都是很重要的。舉個例子,比
如你站點的首頁內容不是常常更改,那麼對首頁緩存一個小時或是更長均可獲得很好效果。相反,幾分鐘
就要更新一下信息的天氣地圖頁面,用緩存就很差了。 
Setting Up Caching [創建緩存] 
首先要作的就是讓緩存可用。這就要設置$caching = true(或 1.) 
131
使緩存可用演示:
require('Smarty.class.php'); 
$smarty = new Smarty; 
$smarty->caching = true; 
$smarty->display('index.tpl'); 
創建緩存後,display('index.tpl')函數會把模板返回原來狀態〔沒緩存〕,也會把輸出保存 copy〖n.名詞〗
到$cache_dir.下次調用 display('index.tpl'),保存的緩存 copy〖n.〗會被再用來代替原來的模板。
技術提示:在$chche_dir 目錄裏的文檔命名跟模板一致。儘管是用.php 做爲擴展名,但並不會被看成 php
代碼來解析。因此不要去修改它。 
每一個緩存頁都有一個用$cache_lifetime 來控制的會話期。初始值是 3600 秒,就是一小時。會話期結束,
緩存就會重建。你能夠經過設置$caching=2 來控制單個緩存文件各自的的過時時間。祥細內容察看
$cache_lifetime 裏面的列表。 
設置單個緩存會話期〔時間〕演示:
require('Smarty.class.php'); 
$smarty = new Smarty; 
$smarty->caching = 2; // $smarty->caching爲2 時,可精確設置每一個緩存的生存期
// 將index.tpl 的cache_lifetime(緩存生存期)設置爲5分鐘
$smarty->cache_lifetime = 300; //單位爲秒
$smarty->display('index.tpl'); 
// set the cache_lifetime for home.tpl to 1 hour 
將home.tpl 的cache_lifetime 設置爲1小時
$smarty->cache_lifetime = 3600; 
$smarty->display('home.tpl'); 
132
//提示:在$chching=2後面的$chche_lifetime不會起做用。  ??????
// home.tpl的緩存會話期設爲1小時後,不會再按$cache_lifetime的值改變。
// home.tpl的緩存會在1小時後結束。
$smarty->cache_lifetime = 30; // 緩存30 秒
$smarty->display('home.tpl'); 
若是$compile_check 可用,每一個跟緩存文檔相關的模板文檔和配置文檔都會被檢查來肯定是否須要修改。
在緩存產生後,改動任何文檔,緩存也跟着更新改動。設置$compile_checkfalse,是實現最佳性能的
最小改動。 
$compile_check 演示:
require('Smarty.class.php'); 
$smarty = new Smarty; 
$smarty->caching = true; 
$smarty->compile_check = true; 
$smarty->display('index.tpl'); 
一旦$force_compile 可用,緩存文檔會一直重建。這將有效的關閉緩存。$force_compile 只是用來調試,
更有效關閉緩存的方法是讓$caching = false(或 0.) 
is_cached()函數可用來測試一個模板是否有有效的緩存。若是一個緩存模板須要從數據庫中獲取數據,可
以用這個函數來跳過這個過程。 
使用is_cached() 演示:
require('Smarty.class.php'); 
$smarty = new Smarty; 
$smarty->caching = true; 
133
if(!$smarty->is_cached('index.tpl')) { 
// 沒有緩存可用,在這裏執行變量分配
$contents = get_database_contents(); 
$smarty->assign($contents); 
} 
$smarty->display('index.tpl'); 
能夠插入模板函數 insert 來使部分頁面動態化。除了在右下方顯示的標語外整個頁面均可以緩存。在緩存
內容裏面能夠插入函數來使標語也動態化。查看相關文檔關於 insert 的細節和例子。 
能夠用 clear_all_cache()來清除全部緩存,或用 clear_cache()來清除單個緩存文檔。 
清除緩存演示:
require('Smarty.class.php'); 
$smarty = new Smarty; 
$smarty->caching = true; 
// 清除全部緩存文件
$smarty->clear_all_cache(); 
// 只清除模板index.tpl 的緩存文件
$smarty->clear_cache('index.tpl'); 
$smarty->display('index.tpl'); 
Multiple Caches Per Page [每頁多個緩存] 
能夠用單個函數 display()或 fetch()來輸出多個緩存文檔。display('index.tpl')在多種條件下會有不一樣的輸
出內容,要單獨的把緩存分開。能夠經過函數 display() 的第二參數 cache_id 來達到效果。 
傳給display()一個cache_id 演示: 
134
require('Smarty.class.php'); 
$smarty = new Smarty; 
$smarty->caching = true; 
$my_cache_id = $_GET['article_id']; 
$smarty->display('index.tpl',$my_cache_id); 
上面,咱們經過變量$my_cache_id 做爲 cache_id 來 display()。在 index.tpl 裏$my_cache_id 的每一個惟
一值,會創建單獨的緩存。在這個例子裏,"article_id"在 URL 傳送,並用做 cache_id。 
技術提示:要注意從客戶端(web 瀏覽器)傳值到 Smarty(或任何 PHP 應用程序)的過程。儘管上面的例子
用 article_id 從 URL 傳值看起來很方便,卻可能有糟糕的後果[安全問題]。cache_id 被用來在文件系統裏
建立目錄,若是用戶想爲 article_id 賦一個很大的值,或寫一些代碼來快速發送隨機的 article_ids,就有
可能會使服務器出現問題。肯定在使用它以前清空已存在的數據。在這個例子,可能你知道 article_id 的
長度是 10 字符,並只由字符-數字組成,而且必須在數據庫裏是個可用的 article_id。要注意檢查這個問
題! 
肯定傳給 is_cached()和 clear_cache()的第二參數是同一個 cache_id。 
傳給is_cached()一個cache_id 演示:
require('Smarty.class.php'); 
$smarty = new Smarty; 
$smarty->caching = true; 
$my_cache_id = $_GET['article_id']; 
if(!$smarty->is_cached('index.tpl',$my_cache_id)) { 
// 沒有緩存可用,在這裏執行變量分配 
135
$contents = get_database_contents(); 
$smarty->assign($contents); 
} 
$smarty->display('index.tpl',$my_cache_id); 
能夠經過把 clear_cache()的第一參數設爲 null 來爲特定的 cache_id 清除全部緩存。 
爲特定的cache_id清除全部緩存演示:
require('Smarty.class.php'); 
$smarty = new Smarty; 
$smarty->caching = true; 
// 清除全部cache_id 的值爲"sports" 的緩存
$smarty->clear_cache(null,"sports"); 
$smarty->display('index.tpl',"sports"); 
經過這種方式,能夠用相同的 cache_id 來把你的緩存集合起來。 
Cache Groups [緩存集合] 
能夠經過創建 cache_id 集合作更祥細的集合體。在 cache_id 的值裏用豎線"|"來分開子集合。能夠儘量
多的包含子集合。 
cache_id集合演示:
require('Smarty.class.php'); 
$smarty = new Smarty; 
$smarty->caching = true; 
// 清除全部以"sports|basketball" 做爲cache_id 開頭的緩存組 
136
// (清除"sports/basketball" 目錄下的緩存??)
$smarty->clear_cache(null,"sports|basketball"); 
// 清除全部以"sports" 做爲cache_id 開頭的緩存組
// 包括"sports|basketball", 或"sports|(anything)|(anything)|(anything)|..." 
// 清除"sports" 目錄下的緩存??
$smarty->clear_cache(null,"sports"); 
$smarty->display('index.tpl',"sports|basketball"); 
技術提示:緩存集合並不像 cache_id 同樣對模板使用路徑。好比,若是你 display('themes/blue/index.tpl'),
那麼在"themes/blue"目錄下你並不能清除緩存。想要清除緩存,必須先用 cache_id 把緩存集合,像這
樣 display('themes/blue/index.tpl','themes|blue');而後就能夠用 clear_cache(null,'themes|blue')清
除 blue theme 下的緩存。 
Controlling Cacheability of Plugins' Output [控制插件輸出的緩衝能力] 
自從 Smarty-2.6.0 插件以來,若是註冊它們,則插件的緩存能力可以被從新聲明。register_block,
register_compiler_function 和 register_function 的第 3 個參數就是$cacheable, 而且它的值默認爲
true。固然,在 2.6.0 版本以前它的默認值也是這樣的。 
當用$cacheable=false 來這冊一個插件,則每次這個頁面被輸出的時候,這個插件就會被使用,即便這
個頁面來自緩存。這個插件函數的行爲有點像這個函數 insert。 
和{insert}相反,插件的屬性默認是不緩存的。經過使用第四個參數 $cache_attrs ,它們可以被從新聲明
爲緩存。 $cache_attrs 是一個屬性名字的數組,能夠被緩存,因此每次當它被從緩存中取出的時候,這
個插件函數得到值-----由於這個頁面會被寫入用來緩存。 
137
阻止插件從緩存中輸出演示:
index.php: 
require('Smarty.class.php'); 
$smarty = new Smarty; 
$smarty->caching = true; 
function remaining_seconds($params, &$smarty) { 
$remain = $params['endtime'] - time(); 
if ($remain >= 0) 
return $remain . " second(s)"; 
else 
return "done"; 
} 
$smarty->register_function('remaining', 'remaining_seconds', false, array('endtime')); 
if (!$smarty->is_cached('index.tpl')) { 
// 從db 和assign... 中取得$obj 
$smarty->assign_by_ref('obj', $obj); 
} 
$smarty->display('index.tpl'); 
index.tpl: 
Time Remaining: {remaining endtime=$obj->endtime} 
直到$obj 運行結束,時間的秒數在每個頁面輸出的時候會改變,即便這個頁面被緩存。只要結束時間屬
性被緩存,當頁面被寫入到緩存可是沒有對這個頁面接着的請求的時候對象只是不得不從新從數據庫裏取
出而已。 
阻止一個模板文件的整篇被緩存演示:
index.php: 
require('Smarty.class.php'); 
138
$smarty = new Smarty; 
$smarty->caching = true; 
function smarty_block_dynamic($param, $content, &$smarty) { 
return $content; 
} 
// 阻止被"{dynamic}{/dynamic}"圍繞的片段被緩存
$smarty->register_block('dynamic', 'smarty_block_dynamic', false); 
$smarty->display('index.tpl'); 
index.tpl: 
Page created: {"0"|date_format:"%D %H:%M:%S"} 
{dynamic} 
Now is: {"0"|date_format:"%D %H:%M:%S"} 
... do other stuff ... 
{/dynamic} 
當從新加載這個頁面,你將會注意到這兩個日期不一樣。一個是「動態「,一個是「靜態」。你可以在
{dynamic}...{/dynamic}之間做任何事情,而且保證它將不會像剩下的頁面同樣被緩存。 
13. Advanced Features [高級特徵] 
Objects [對象] 
SMARTY 容許經過模板訪問 PHP 對象。有兩種方式來訪問它們。一種是註冊對象到模板,而後經過相似
於用戶自定義函數的形式來訪問它。另外一種方法給模板分配對象,而後經過訪問其它賦值變量相似的方法進
行訪問。第一種方法有一個很好的模板語法,同時它做爲一個註冊對象被限制爲幾個固定的方法和目標,
139
這樣是比較安全的。然而一個註冊對象不可以在相對自身數組裏面循環使用和賦值。總之,你根據你本身
的需求來以爲選用那種方法,可是使用第一種方法的話,可讓你的模伴語法達到最小。 
若是安全選項激活後,就沒有私有成員或者函數可以被訪問(以"_"開頭)。若是有一個同名成員或者對象
存在,那麼方法將被使用。 
你能夠限制成員和函數,可是外解能夠經過列舉它們爲一個第三註冊變量的數組的方式來訪問它。 
通常狀況下,參數經過模板傳遞給對象的方法和自定義函數得到參數的方法是同樣的。一個混合數組做爲
第一個參數傳遞,而 SMARTY 對象做爲第二個。若是你想像傳統的對象參數同樣一次傳遞一個參數,設
置第四個參數爲 FALSE 便可。 
使用已註冊的或已分配的對象演示:
index.php 
// the object 
class My_Object() { 
function meth1($params, &$smarty_obj) { 
return "this is my meth1"; 
} 
} 
$myobj = new My_Object; 
// 註冊將會被引用的對象
$smarty->register_object("foobar",$myobj); 
// 若是想要限制對某個方法或屬性的訪問,將它們列出來
$smarty->register_object("foobar",$myobj,array('meth1','meth2','prop1')); 
// 若是想要使用傳統的對象參數格式,傳遞一個false 的布爾值
$smarty->register_object("foobar",$myobj,null,false); 
140
// 一樣能夠分配對象,能夠時,經過ref 分配
$smarty->assign_by_ref("myobj", $myobj); 
$smarty->display("index.tpl"); 
index.tpl 
{* 訪問已註冊的對象*} 
{foobar->meth1 p1="foo" p2=$bar} 
{* 一樣能夠分配輸出*} 
{foobar->meth1 p1="foo" p2=$bar assign="output"} 
the output was {$output) 
{* 訪問已分配的對象*} 
{$myobj->meth1("foo",$bar)} 
Prefilters [預過濾器] 
模板預過濾器是一些 PHP 函數,模板就是在那些函數編譯後才運行。這樣有利於預先處理你的模板,刪
除不須要的內容,監視對模板進行的操做,例如:預過濾器一樣可以經過 load filter() 函數和設置 
$autoload filters 變量來註冊或者從工具目錄裏載入。SMARTY 將傳遞模板輸出做爲第一個參數,經過
自定義函數返回處理結果。 
使用模板預過濾器演示:
index.php 
// 將這些加入應用
function remove_dw_comments($tpl_source, &$smarty) 
{ 
return preg_replace("/<!--#.*-->/U","",$tpl_source); 
} 
// 註冊預過濾器
$smarty->register_prefilter("remove_dw_comments"); 
$smarty->display("index.tpl"); 
141
index.tpl 
<!--# this line will get removed by the prefilter --> 
Postfilters [後過濾器] 
模板後過濾器是一些 PHP 函數,模板就是在那些函數編譯後才運行。後過濾器一樣可以經過 load filter() 
函數和設置 $autoload filters 變量來註冊或者從工具目錄裏載入。SMARTY 將傳遞模板輸出做爲第一個
參數,經過自定義函數返回處理結果。 
使用模板後過濾器演示:
index.php 
// 將這些加入應用
function add_header_comment($tpl_source, &$smarty) 
{ 
return "<?php echo \"<!-- Created bySmarty! -->\n\" ?>\n".$tpl_source; 
} 
// 註冊後過濾器
$smarty->register_postfilter("add_header_comment"); 
$smarty->display("index.tpl"); 
{* 已編譯的Smarty 模板index.tpl *} 
<!-- Created by Smarty! --> 
{* 其他的模板內容... *} 
Output Filters [輸出過濾器] 
當模板經過函數 display() 或者 fetch()被調用時,它的輸出可以經過一個或者多個過濾器而發出。 
它與預過濾器的不一樣之處就是預過濾器編譯模板是在模板保存到磁盤以前,輸出過濾器是在它執行的時候
142
才操做模板輸出的。 
輸出過濾器一樣可以經過 load filter() 函數和設置 $autoload filters 變量來註冊或者從工具目錄裏載
入。 
SMARTY 將傳遞模板輸出做爲第一個參數,經過自定義函數返回處理結果。 
使用模板輸出過濾器演示:
<?php 
// 將這些加入應用
function protect_email($tpl_output, &$smarty) 
{ 
$tpl_output = 
preg_replace('!(\S+)@([a-zA-Z0-9\.\-]+\.([a-zA-Z]{2,3}|[0-9]{1,3}))!', 
'$1%40$2', $tpl_output); 
return $tpl_output; 
} 
// 註冊輸出過濾器
$smarty->register_outputfilter("protect_email"); 
$smarty->display("index.tpl"); 
// 如今在模板輸出中出現任何一個email 地址,將會針對spambots(垃圾郵件?)有一個簡單的保護
?> 
Cache Handler Function [緩衝處理函數] 
做爲一個可選擇使用的默認基於文本的緩衝機制,能夠定製或者自定義緩衝處理函數來進行讀、寫、清除
緩衝文件。 
若是要在應用程序下創建一個函數,SMARTY 將會使用一個緩衝處理。設置這個函數名爲 $cache 
handler func 中類變量名。Smarty 將使用這個函數來處理緩衝數據。第一個參數無論是‘讀’,‘寫’ ,‘清除’,
143
都是動態的。第二個參數是 Smarty 對象。第三個參數是緩衝的內容。在進行寫操做以前,Smarty 傳遞
這些緩衝內容給這些參量。在進行讀操做以前,Smarty 預處理那些緩衝數據相關或者封裝好了的函數。
在進行清除操做以前,從他沒有使用起,就傳遞一個虛擬變量。第四個參數是模板文件名(須要讀和寫的
文件),第五個函數是緩衝 ID(額外選項),而後第六個參數是編譯的 ID(額外選項)。 
注意:最新的參數名 ($exp_time) 在 Smarty-2.6.0 中才加入的。 
使用MySQL 做爲緩存源演示:
<?php 
/* 
example usage: 
include('Smarty.class.php'); 
include('mysql_cache_handler.php'); 
$smarty = new Smarty; 
$smarty->cache_handler_func = 'mysql_cache_handler'; 
$smarty->display('index.tpl'); 
mysql database is expected in this format: 
create database SMARTY_CACHE; 
create table CACHE_PAGES( 
CacheID char(32) PRIMARY KEY, 
CacheContents MEDIUMTEXT NOT NULL 
); 
*/ 
function mysql_cache_handler($action, &$smarty_obj, &$cache_content, $tpl_file=null, $cache_id=null, 
$compile_id=null, $exp_time=null) 
{ 
// set db host, user and pass here 
$db_host = 'localhost'; 
$db_user = 'myuser'; 
$db_pass = 'mypass'; 
$db_name = 'SMARTY_CACHE'; 
144
$use_gzip = false; 
// create unique cache id 
$CacheID = md5($tpl_file.$cache_id.$compile_id); 
if(! $link = mysql_pconnect($db_host, $db_user, $db_pass)) { 
$smarty_obj->_trigger_error_msg("cache_handler: could not connect to database"); 
return false; 
} 
mysql_select_db($db_name); 
switch ($action) { 
case 'read': 
// save cache to database 
$results = mysql_query("select  CacheContents from CACHE_PAGES where 
CacheID='$CacheID'"); 
if(!$results) { 
$smarty_obj->_trigger_error_msg("cache_handler: query failed."); 
} 
$row = mysql_fetch_array($results,MYSQL_ASSOC); 
if($use_gzip && function_exists("gzuncompress")) { 
$cache_contents = gzuncompress($row["CacheContents"]); 
} else { 
$cache_contents = $row["CacheContents"]; 
} 
$return = $results; 
break; 
case 'write': 
// save cache to database 
if($use_gzip && function_exists("gzcompress")) { 
// compress the contents for storage efficiency 
$contents = gzcompress($cache_content); 
} else { 
$contents = $cache_content; 
} 
$results = mysql_query("replace into CACHE_PAGES values( 
'$CacheID', 
'".addslashes($contents)."') 
"); 
if(!$results) { 
$smarty_obj->_trigger_error_msg("cache_handler: query failed."); 
} 
$return = $results; 
break; 
145
case 'clear': 
// clear cache info 
if(empty($cache_id) && empty($compile_id) && empty($tpl_file)) { 
// clear them all 
$results = mysql_query("delete from CACHE_PAGES"); 
} else { 
$results = mysql_query("delete from CACHE_PAGES where CacheID='$CacheID'"); 
} 
if(!$results) { 
$smarty_obj->_trigger_error_msg("cache_handler: query failed."); 
} 
$return = $results; 
break; 
default: 
// error, unknown action 
$smarty_obj->_trigger_error_msg("cache_handler: unknown action \"$action\""); 
$return = false; 
break; 
} 
mysql_close($link); 
return $return; 
} 
?> 
Resources [資源] 
模板能夠來自各類各樣的資源。當你顯示或者取得一個模板,或者當你在一個模板裏面包含另一個模板
時,只要提供一個類型的資源,緊跟正確的路徑和模板名。 
若是一個模板資源沒有明確的給出 $default_resource_type 變量值,就認爲這個資源爲假定值。 
Templates from $template_dir [來自 $template_dir 的模板] 
來自 $template_dir 的模板不須要模版資源,儘管可使用 file: resource 的組合。 
146
只需提供所使用模版與 template_dir 的相對路徑。 
使用來自$template_dir 的模板演示:
// 來自PHP 腳本
$smarty->display("index.tpl"); 
$smarty->display("admin/menu.tpl"); 
$smarty->display("file:admin/menu.tpl"); // 同上
{* 來自Smarty 模版內部*} 
{include file="index.tpl"} 
{include file="file:index.tpl"} {* 同上*} 
Templates from any directory [來自任意路徑的模版] 
模版在 $template_dir 以外,須要 file: template 資源類型,跟着是絕對路徑和模版名。 
使用來自任意路徑的模版演示:
// 來自PHP 腳本
$smarty->display("file:/export/templates/index.tpl"); 
$smarty->display("file:/path/to/my/templates/menu.tpl"); 
{* 來自Smarty 模版內部*} 
{include file="file:/usr/local/share/templates/navigation.tpl"} 
Windows Filepaths [Windows 文件路徑] 
若是在 Windows 環境下使用,文件路徑一般在路徑名的開頭包括驅動器盤符(C:),肯定在路徑中使用 
"file:" 來避免命名空間衝突和獲得不指望的結果。 
使用來自windows 的路徑演示:
147
// 來自PHP 腳本
$smarty->display("file:C:/export/templates/index.tpl"); 
$smarty->display("file:F:/path/to/my/templates/menu.tpl"); 
{* 來自Smarty 模版內部*} 
{include file="file:D:/usr/local/share/templates/navigation.tpl"} 
Templates from other sources [來自其它資源的模版] 
不管 PHP 是否能夠訪問的資源,均可以做爲模版使用:databases, sockets, LDAP 等等。經過寫資源
插件函數和經過 Smarty 註冊它們來使用。 
更多信息參照 resource plugins 部分。 
注意:不能覆蓋內置的文件資源,可是能夠經過註冊爲另外一個資源名的方式提供來自文件系統的取自模版
的資源。 
使用定製資源演示:
// 來自PHP 腳本
// 將這些函數放入應用的某處
function db_get_template ($tpl_name, &$tpl_source, &$smarty_obj) 
{ 
// 調用數據庫取得模版
// 組裝到$tpl_source 中
$sql = new SQL; 
$sql->query("select tpl_source 
from my_table 
where tpl_name='$tpl_name'"); 
if ($sql->num_rows) { 
$tpl_source = $sql->record['tpl_source']; 
return true; 
} else { 
return false; 
148
} 
} 
function db_get_timestamp($tpl_name, &$tpl_timestamp, &$smarty_obj) 
{ 
// 調用數據庫來組裝$tpl_timestamp 
$sql = new SQL; 
$sql->query("select tpl_timestamp 
from my_table 
where tpl_name='$tpl_name'"); 
if ($sql->num_rows) { 
$tpl_timestamp = $sql->record['tpl_timestamp']; 
return true; 
} else { 
return false; 
} 
} 
function db_get_secure($tpl_name, &$smarty_obj) 
{ 
// 假設全部的模版都是安全的
return true; 
} 
function db_get_trusted($tpl_name, &$smarty_obj) 
{ 
// 不用於模版
} 
// 將資源名註冊爲"db" 
$smarty->register_resource("db", array("db_get_template", 
"db_get_timestamp", 
"db_get_secure", 
"db_get_trusted")); 
// 使用來自PHP 腳本的資源
$smarty->display("db:index.tpl"); 
{* 使用來自Smarty 模版內部的資源*} 
{include file="db:/extras/navigation.tpl"} 
Default template handler function [默認模版處理函數] 
149
You can specify a function that is used to retrieve template contents in the event the template 
cannot be retrieved from its resource. One use of this is to create templates that do not exist 
on-the-fly. 
能夠指定用於取得模版內容的函數,其中一個應用是建立不存在於傳輸過程當中的模版。 
使用默認模版處理函數演示:
<?php 
// 把這個函數放入應用的某處
function make_template ($resource_type, $resource_name, &$template_source, &$template_timestamp, 
&$smarty_obj) 
{ 
if( $resource_type == 'file' ) { 
if ( ! is_readable ( $resource_name )) { 
// 建立模版文件,返回內容
$template_source = "This is a new template."; 
$template_timestamp = time(); 
$smarty_obj->_write_file($resource_name,$template_source); 
return true; 
} 
} else { 
// 不是文件
return false; 
} 
} 
// 設置默認處理
$smarty->default_template_handler_func = 'make_template'; 
?> 
14. Extending Smarty With Plugins [利用插件擴展 Smarty] 
2.0 版本引入了被普遍應用於自定義 Smarty 功能的插件機制。它包括以下類型: 
150
functions 函數插件 
modifiers 修飾插件 
block functions 區塊函數插件 
compiler functions 編譯函數插件 
prefilters 預濾器插件 
postfilters 補濾器插件 
outputfilters 輸出過濾插件 
resources 資源插件 
inserts 嵌入插件 
爲了與舊有方式保持向後兼容,除資源插件外,保留了經過 register_* API 方式裝載函數的處理方法。如
果不是使用 API 方式而是使用直接修改類變量 $custom_funcs, $custom_mods 等的方法,那麼就須要
修改程序。或者使用 API 的方法,或者將自定義功能轉換成插件。 
How Plugins Work [插件如何工做] 
插件總在須要的時候被裝載。只有在模板腳本里調用的特定修飾、函數、資源插件等會被裝載。此外,即
便在同一個請求中有幾個不一樣的 Smarty 實體運行,每一個插件也只被裝載一次。 
預/補過濾器插件和輸出過濾器插件的裝載方式有些不一樣。因爲在模板中未被說起,它們必須在模板被處
理前經過 API 函數明確地裝入系統。同類型的多個過濾器插件依據被裝載的次序前後不一樣分別前後執行。 
插件目錄是包含一條路徑信息的字符串或包含多條路徑信息的字符串數組。安裝插件的時候,將插件置於
151
其中一個目錄下,Smarty 會自動識別使用。 
Naming Conventions [命名約定] 
插件文件和函數必須遵循特定的命名約定以便 Smarty 識別。 
插件文件必須命名以下: 
type . name .php 
其中 type 是以下插件中的一種: 
function 
modifier 
block 
compiler 
prefilter 
postfilter 
outputfilter 
resource 
insert 
name 爲僅包含字母、數字和下劃線的合法標誌符。 
152
例如: function.html_select_date.php, resource.db.php, modifier.spacify.php. 
插件內的函數應遵循以下命名約定: 
smarty_ type _ name () 
type 和 name 的意義如前。 
若是指定的插件文件不存在或命名不合規範,Smarty 會輸出相應的錯誤信息。 
Writing Plugins [編寫插件] 
Smarty 可自動從文件系統裝載插件,或者運行時經過 register_* API 函數裝載。能夠經過 unregister_* API
函數卸載已經裝載的插件。 
只在運行時裝載的插件的函數名稱不須要遵照命名約定。 
若是某個插件依賴其它插件內的某些功能(例如某些插件功能捆綁於 Smarty 內),那麼能夠經過以下方法
裝載必須的插件: 
require_once $smarty->_get_plugin_filepath('function', 'html_options'); 
Smarty 對象一般做爲傳遞給插件的最後一個參數(有兩個例外:一、修飾插件根本不接受傳遞過來的
153
Smarty 對象。二、爲了向上兼容老版本的 Smarty,區塊插件將 &$repeat 做爲最後一個參數,所以 Smarty
對象是倒數第二個參數。) 
Template Functions [模板函數插件] 
void smarty_function_ name (array $params, object &$smarty) 
模板傳遞給模板函數的全部的屬性都包含在參數數組 $params 中,既能夠經過如:$params['start'] 的
方式直接處理其中的值,也可使用 extract($params) 的方式將全部值導入符號表中。 
函數輸出(返回值)的內容將取代模板中函數名稱出現的位置(例如:fetch()函數)。同時函數也可能只
是執行些後臺任務,並沒有任何輸出 
若是函數須要向模板中增長變量或者使用 Smarty 提供的某些功能,能夠經過 $smarty 對象實現。 
相關內容參看: register_function(), unregister_function(). 
有輸出插件函數演示:
<?php 
/* 
* Smarty 插件
* ------------------------------------------------------------- 
* File: function.eightball.php 
* Type: function 
* Name: eightball 
* 目的: 輸出一個隨機的magic answer 
* ------------------------------------------------------------- 
*/ 
154
function smarty_function_eightball($params, &$smarty) 
{ 
$answers = array('Yes', 
'No', 
'No way', 
'Outlook not so good', 
'Ask again soon', 
'Maybe in your reality'); 
$result = array_rand($answers); 
return $answers[$result]; 
} 
?> 
在模板中調用方法以下:
Question: Will we ever have time travel? 
Answer: {eightball}. 
無輸出插件函數演示:
<?php 
/* 
* Smarty 插件
* ------------------------------------------------------------- 
* File: function.assign.php 
* Type: function 
* Name: assign 
* 目的: 爲模版變量分配一個值
* ------------------------------------------------------------- 
*/ 
function smarty_function_assign($params, &$smarty) 
{ 
extract($params); 
if (empty($var)) { 
$smarty->trigger_error("assign: missing 'var' parameter"); 
return; 
} 
if (!in_array('value',array_keys($params))) { 
$smarty->trigger_error("assign: missing 'value' parameter"); 
return; 
} 
$smarty->assign($var, $value); 
155
} 
?> 
Modifiers [修正器插件] 
修正器是一些短小的函數,這些函數被應用於模版中的一個變量,而後變量再顯示或用於其餘的一些文檔。
咱們能夠把修正器連接起來。 
mixed smarty_modifier_ name (mixed $value, [mixed $param1, ...]) 
修正器插件的第一個參數是不可缺乏的。剩餘的參數是可選的,它們的有無取決於指望執行哪種操做。 
修正器必須有返回值。 
也可參考 register_modifier(), unregister_modifier(). 
簡單修正器插件演示:
這個插件主要目的是用另外一個名字替換一個內置PHP函數的名字。他沒有任何多餘的參數。
<?php 
/* 
* Smarty 插件
* ------------------------------------------------------------- 
* File: modifier.capitalize.php 
* Type: modifier 
* Name: capitalize 
* 目的: 將字符串轉換成大寫字母
* ------------------------------------------------------------- 
*/ 
function smarty_modifier_capitalize($string) 
{ 
156
return ucwords($string); 
} 
?> 
更加複雜的修正器插件演示:
<?php 
/* 
* Smarty 插件
* ------------------------------------------------------------- 
* File: modifier.truncate.php 
* Type: modifier 
* Name: truncate 
* 目的: 截取字符串爲某一個的長度,若是有須要,將詞從中間分開,並添加到字符串$etc 
* ------------------------------------------------------------- 
*/ 
function smarty_modifier_truncate($string, $length = 80, $etc = '...', 
$break_words = false) 
{ 
if ($length == 0) 
return ''; 
if (strlen($string) > $length) { 
$length -= strlen($etc); 
$fragment = substr($string, 0, $length+1); 
if ($break_words) 
$fragment = substr($fragment, 0, -1); 
else 
$fragment = preg_replace('/\s+(\S+)?$/', '', $fragment); 
return $fragment.$etc; 
} else 
return $string; 
} 
?> 
Block Functions [區塊函數插件] 
void smarty_block_ name (array $params, mixed $content, object &$smarty) 
157
塊函數的形式是這樣的:{func} .. {/func}。換句話說,他們用標記圈起一個塊,而後對這個塊的內容進行
操做。塊函數優先於同名的傳統函數,即你不能同時有同名的傳統函數{func}和塊函數{func} .. {/func}。 
默認地你的函數執行被 Smarty 調用兩次:一次是在開始標記,另外一次是在結束標記(參考下面的&$repeat
怎樣改變這種狀況) 
塊函數僅開始標記能夠有屬性。全部從模板傳替給模板函數的屬性被囊括與一個集合數組參數中。你能夠
直接獲取其值,例如:$params['start']或者是用 extract($params)將它們導入符號表中。當處理結束標
記時,開始標記的屬性對你的函數也是可用的。 
變量 $content 的值取決因而否因開始標記或結束標記調用你的函數。假如是開始標記,它會是空的,如
果是結束標記,它會是模板塊的內容。請注意模板塊已經被 Smarty 處理,因此你接收到的結果是輸出後的
模板而不是原樣模板。 
參數 &$repeat 經過參考引用傳遞給函數執行過程併爲其提供一個可能值來控制顯示塊多少遍。默認情
況下在首次調用塊函數(塊開始標記)時變量 $repeat 是真,在隨後的全部塊函數調用中其始終是假。
每當函數執行返回的 &$repeat 是真時,在{func} .. {/func}之間的內容再次求值,函數執行接收一個新塊
參數 $content 內容值被再次調用。 
若是你嵌套了塊函數,經過訪問變量$smarty->_tag_stack 找出父塊函數是可能的。僅僅對塊函數運行
一下 var_dump(),函數結構就會一目瞭然了。 
參看: register_block(), unregister_block(). 
158
區塊函數插件演示:
<?php 
/* 
* Smarty 插件
* ------------------------------------------------------------- 
* File: block.translate.php 
* Type: block 
* Name: translate 
* 目的: 翻譯文本塊
* ------------------------------------------------------------- 
*/ 
function smarty_block_translate($params, $content, &$smarty) 
{ 
if (isset($content)) { 
$lang = $params['lang']; 
// 對$content 作只能翻譯工做
return $translation; 
} 
} 
Compiler Functions [編譯函數插件] 
編譯函數僅在模板編譯過程當中被調用。對於將 PHP 代碼或對時間敏感的靜態內容嵌入到模板中,他們是
比較有用的。若是編譯函數和普通函數都註冊了同一個名字,則編譯函數具備優先使用權。 
mixed smarty_compiler_ name (string $tag_arg, object &$smarty) 
此編譯函數有兩個參數:標記參數字符串——基本上是從函數名字直到結束位置的全部內容,另外一個參數
是 Smarty 對象。該函數將返回嵌入到被編譯模板中的 PHP 代碼。 
參看 register_compiler_function(), unregister_compiler_function(). 
159
簡單編譯函數插件演示:
<?php 
/* 
* Smarty 插件
* ------------------------------------------------------------- 
* File: compiler.tplheader.php 
* Type: compiler 
* Name: tplheader 
* 目的: 輸出包含資源文件名和編譯時間的頭
* ------------------------------------------------------------- 
*/ 
function smarty_compiler_tplheader($tag_arg, &$smarty) 
{ 
return "\necho '" . $smarty->_current_file . " compiled at " . date('Y-m-d H:M'). "';"; 
} 
?> 
這個函數在模板中以以下方式調用:
{* 這個函數在編譯時執行*} 
{tplheader} 
在編譯以後的模板中被嵌入的 PHP 代碼內容以下: 
<php 
echo 'index.tpl compiled at 2002-02-20 20:02'; 
?> 
Prefilters/Postfilters [預濾器/補濾器插件] 
從概念上看,預濾器和後濾器插件都很簡單;不一樣之處就在於它們的執行,更確切地說是它們的執行時刻
(非時間段,而是某一個時刻)。 
160
string smarty_prefilter_ name (string $source, object &$smarty)
預濾器用來在編譯以前直接處理模板源文件。預濾器函數的第一個參數是模板源文件,該文件可能被其餘
一些預濾器修正過。此預濾器插件將返回修正過的源文件。請記住此源文件僅用來編譯,它不會在任何地
方被保存。 
string smarty_postfilter_ name (string $compiled, object &$smarty) 
後濾器用來在編譯以後直接處理模板的編譯輸出(PHP 代碼),但須在編譯以後的模板被保存到文件系統
以前就進行操做。預濾器函數的第一個參數是編譯以後的模板代碼,該代碼可能被其餘一些後濾器修正過。
此後濾器插件將返回修正過的代碼文件。 
預濾器插件演示:
<?php 
/* 
* Smarty 插件
* ------------------------------------------------------------- 
* File: prefilter.pre01.php 
* Type: prefilter 
* Name: pre01 
* 目的: 將html 標籤轉換爲小寫
* ------------------------------------------------------------- 
*/ 
function smarty_prefilter_pre01($source, &$smarty) 
{ 
return preg_replace('!<(\w+)[^>]+>!e', 'strtolower("$1")', $source); 
} 
?> 
後濾器插件演示:
<?php 
161
/* 
* Smarty 插件
* ------------------------------------------------------------- 
* File: postfilter.post01.php 
* Type: postfilter 
* Name: post01 
* 目的: 輸出代碼列出全部當前模版變量
* ------------------------------------------------------------- 
*/ 
function smarty_postfilter_post01($compiled, &$smarty) 
{ 
$compiled = "<pre>\n<?php print_r(\$this->get_template_vars()); ?>\n</pre>" . $compiled; 
return $compiled; 
} 
?> 
Output Filters [輸出過濾插件] 
輸出過濾器插件的做用是,在裝載並執行完一個模板以後顯示模板以前,操做該模板的輸出。 
string smarty_outputfilter_ name(string $template_output, object &$smarty) 
輸出過濾器函數第一個參數是須要處理的模板輸出,第二個參數是調用這個插件的 Smarty 實例。此插件
將會對參數進行處理並返回相應的結果。 
輸出過濾器插件演示:
/* 
* Smarty 插件
* ------------------------------------------------------------- 
* File: outputfilter.protect_email.php 
* Type: outputfilter 
* Name: protect_email 
* 目的: 把email 地址中的@ 轉換爲%40,做爲一個簡單的反垃圾郵件保護
* ------------------------------------------------------------- 
*/ 
162
function smarty_outputfilter_protect_email($output, &$smarty) 
{ 
return preg_replace('!(\S+)@([a-zA-Z0-9\.\-]+\.([a-zA-Z]{2,3}|[0-9]{1,3}))!', 
'$1%40$2', $output); 
} 
Resources [資源插件] 
資源插件被認爲是爲 Smarty 提供模板源或 PHP 腳本組件的一種普通方式。一些資源例子如:數據庫、
LDAP、共享內存、sockets(套接字)等等。 
須要爲每一種類型的資源註冊四個函數。每個函數將接收被請求的資源做爲第一個參數,Smarty 對象
做爲最後一個參數。剩餘的參數取決於函數的不一樣。 
bool smarty_resource_ name _source (string $rsrc_name, string &$source, object &$smarty) 
bool smarty_resource_ name _timestamp (string $rsrc_name, int &$timestamp, object &$smarty) 
bool smarty_resource_ name _secure (string $rsrc_name, object &$smarty) 
bool smarty_resource_ name _trusted (string $rsrc_name, object &$smarty) 
第一個函數將會檢索資源。它的第二個參數是一個參考引用變量,結果值會存放到該變量裏面。若是此函
數能成功的檢索到資源,將會返回 true,不然返回 false。 
163
第二個函數將會檢索被請求資源的最後修改時間(UNIX 時間戳)。它的第二個參數是一個參考引用變量,
時間戳值會存放到該變量裏面。若是此函數能成功的肯定時間戳,將會返回 true,不然返回 false。 
第三個函數將會返回 true 或 false,取決於被請求資源是否安全。這個函數僅用於模板資源,但仍應被定
義。 
第四個函數將會返回 true 或 false,取決於被請求資源是否被信任。這個函數僅用於被 {include_php} 或 
{insert} 標記以 src 屬性請求的 PHP 腳本組件。但仍應被定義,甚至用於模板資源也不例外。 
參看 register_resource(), unregister_resource(). 
資源插件演示:
<?php 
/* 
* Smarty 插件
* ------------------------------------------------------------- 
* File: resource.db.php 
* Type: resource 
* Name: db 
* 目的: 從數據庫中取得模版
* ------------------------------------------------------------- 
*/ 
function smarty_resource_db_source($tpl_name, &$tpl_source, &$smarty) 
{ 
// 執行數據庫調用取得模版,裝入$tpl_source 
$sql = new SQL; 
$sql->query("select tpl_source 
from my_table 
where tpl_name='$tpl_name'"); 
if ($sql->num_rows) { 
$tpl_source = $sql->record['tpl_source']; 
return true; 
} else { 
return false; 
164
} 
} 
function smarty_resource_db_timestamp($tpl_name, &$tpl_timestamp, &$smarty) 
{ 
// 調用數據庫,裝入$tpl_timestamp 
$sql = new SQL; 
$sql->query("select tpl_timestamp 
from my_table 
where tpl_name='$tpl_name'"); 
if ($sql->num_rows) { 
$tpl_timestamp = $sql->record['tpl_timestamp']; 
return true; 
} else { 
return false; 
} 
} 
function smarty_resource_db_secure($tpl_name, &$smarty) 
{ 
// 假設全部模版是安全的
return true; 
} 
function smarty_resource_db_trusted($tpl_name, &$smarty) 
{ 
// 未用於模版
} 
?> 
Inserts [嵌入插件] 
插入插件用來執行在模板中被 {insert} 標記調用的函數 。 
string smarty_insert_ name (array $params, object &$smarty) 
函數的第一個參數是一個傳遞給插入動做的屬性集合數組。每一種方式均可以直接獲取那些屬性值,例如
165
$params['start'],或用 extract($params)將屬性導入符號表中。 
插入函數將會返回某值,該值將在模板中的 {insert} 標記處被替換。 
插入插件演示:
<?php 
/* 
* Smarty 插件
* ------------------------------------------------------------- 
* File: insert.time.php 
* Type: time 
* Name: time 
* 目的: 根據格式( format )插入當前的日期/時間
* ------------------------------------------------------------- 
*/ 
function smarty_insert_time($params, &$smarty) 
{ 
if (empty($params['format'])) { 
$smarty->trigger_error("insert time:missing 'format' parameter"); 
return; 
} 
$datetime = strftime($params['format']); 
return $datetime; 
} 
?> 
3、 Appendixes [附錄] 
15. Troubleshooting [疑難解答] 
Smarty/PHP errors [錯誤] 
166
Smarty 可以發現許多相似缺乏標籤屬性或者不規範變量名這樣的錯誤。若是發生這種錯誤,就會有下面
的錯誤提示: 
錯誤演示:
Warning: Smarty: [in index.tpl line 4]: syntax error: unknown tag - '%blah' 
in /path/to/smarty/Smarty.class.php on line 1041 
警告:Smarty: 在index.tpl文件第4行,語法錯誤:'%blah'標籤未知
Fatal error: Smarty: [in index.tpl line 28]: syntax error: missing section name 
in /path/to/smarty/Smarty.class.php on line 1041 
嚴重錯誤:Smarty: 在index.tpl 文件第28 行,語法錯誤:缺乏節段名字在/path/to/smarty/路徑中的
Smarty.class.php文件1041行
Smarty 能夠顯示模板名稱以及行號和錯誤。這些錯誤顯示未所發生錯誤所屬的 smarty 類所在的實際行
號。 
某些錯誤 Smarty 不能捕捉,像缺乏結束標籤。這些類型的錯誤一般會在在 php 分析語法錯誤的編譯時間
中就捕捉出來了. 
PHP 解析錯誤演示:
Parse error: parse error in /path/to/smarty/templates_c/index.tpl.php on line 75 
當遇到一個 php 解析錯誤時,錯誤行號將反應到 php 編譯腳本,而不是模板自己。一般,會看到模板並
發現語法錯誤。一般會發現:缺乏 if}{/if} ,或者{section}{/section}的結束標籤。或者{if}標籤內的邏輯
語法錯誤。若是你不能檢查出錯誤,那就得在模板中打開 php 編譯文件按照行號找出相應錯誤。 
167
16. Tips & Tricks [使用技巧和經驗] 
Blank Variable Handling[空白變量處理] 
也許有時想給一個沒有賦值的變量輸出一個默認的值來代替什麼也不輸出,好比輸出'&nbsp;'[這是一個空
格符號,HTML 裏的標記]來使得表格裏的背景可以正常工做。大多數人使用{if}語句來處理這些,可是用
Smatry 這裏有一個捷徑,那就是使用 default [默認的]值賦給變量。 
若是一個變量是空值,輸出&nbsp; 演示:
{* 麻煩的方式*} 
{if $title eq ""} 
&nbsp; 
{else} 
{$title} 
{/if} 
{* 簡單的方式*} 
{$title|default:"&nbsp;"} 
Default Variable Handling[默認變量處理] 
若是一個變量在整個模板裏被常用,而每次要用到這個變量的時候都要給它賦默認的值,那將是沒法
忍受的。能夠經過使用 assign[賦值]這個函數來給這個變量賦上它的默認值。 
賦給一個模板變量默認的值演示:
{* 在模版頂部執行*} 
{assign var="title" value=$title|default:"no title"} 
168
{* 若是$title 爲空,當輸出它的時候就包含值"no title" *} 
{$title} 
Passing variable title to header template[傳遞變量型標題給頭模板] 
當大多數模板文件用到了一些相同的頭模板文件和腳模板文件,一般是把這些模板分開而且包含他們。但
是若是頭模板須要什麼來使得顯示一些不一樣的標題,取決於用到的那些頁面,能夠傳遞這些標題給頭模板
---當它們被包含的時候。 
傳遞變量標題給頭模板演示:
mainpage.tpl 
------------ 
{include file="header.tpl" title="Main Page"} 
{* 模版body 在這裏*} 
{include file="footer.tpl"} 
archives.tpl 
------------ 
{config_load file="archive_page.conf"} 
{include file="header.tpl" title=#archivePageTitle#} 
{* 模版body 在這裏*} 
{include file="footer.tpl"} 
header.tpl 
---------- 
<HTML> 
<HEAD> 
<TITLE>{$title|default:"BC News"}</TITLE> 
</HEAD> 
<BODY> 
footer.tpl 
---------- 
</BODY> 
</HTML> 
169
當這個主頁[main page]被瀏覽的時候,‘Main Page'這個標題就會傳遞給頭模板文件[header.tpl],而且結
果會被用成爲標題。當這個檔案頁[archives page]被瀏覽的時候,文件標題將會是‘Archives'。注意在這
個檔案頁例子中,咱們用了一個來自這個文件[archives_page.conf]的變量來代替一個硬性的代碼變量。
固然,要是變量[$title]沒有初始化,咱們會發現‘BC News'被輸出----用那種使用默認值的變量的方法。 
Dates[日期] 
就像一條經驗法則,常常是把日期當成時間戳傳遞給 Smarty。 這樣使得模板設計人員可使用
date_format[日期格式化]這個函數來對日期格式化進行全面控制,固然,這使得在須要比較日期的時候
比較容易。 
注意:從 Smarty 1.4.0 起,能夠像用 unix 中的時間戳,mysql 中的時間戳,或者任何可以用這個函數
[strtotime()]進行分析的時間戳那樣把日期傳遞給 Smarty。 
使用日期格式化演示:
{$startDate|date_format} 
輸出結果:
Jan 4, 2001 
{$startDate|date_format:"%Y/%m/%d"} 
輸出結果:
2001/01/04 
170
{if $date1 < $date2} 
... 
{/if} 
當在一個模板文件裏使用{html_select_date}的時候,程序員將可能想在一個輸出文件中把這種形式轉回
成時間戳的形式。下面就是一個能夠幫助你達到目的的函數。 
將日期轉換回時間戳演示:
// 假設表單元素命名爲startDate_Day, startDate_Month, startDate_Year 
$startDate = makeTimeStamp($startDate_Year,$startDate_Month,$startDate_Day); 
function makeTimeStamp($year="",$month="",$day="") 
{ 
if(empty($year)) 
$year = strftime("%Y"); 
if(empty($month)) 
$month = strftime("%m"); 
if(empty($day)) 
$day = strftime("%d"); 
return mktime(0,0,0,$month,$day,$year); 
} 
WAP/WML[WAP/WML] 
WAP/WML 模板須要一個說明文件內容形式的文件頭和模板同時傳遞出去。最容易的方式就是編寫一個
客戶型的函數用來輸出這個文件頭。若是使用緩衝,那將不會起做用,因此咱們使用一些插入標記(記住:
插入標記不是緩衝!)。請確保在你的模板輸出到瀏覽器以前沒有任何東西被輸出,不然文件頭將失效。 
使用插入來寫一個WML類型的文件頭演示:
// 確保apache 配置了.wml  擴展
// 將該函數放入應用的某處,或者放入Smarty.addons.php 
171
function insert_header() { 
// 該函數須要$content 參數
extract(func_get_arg(0)); 
if(empty($content)) 
return; 
header($content); 
return; 
} 
// Smarty 模版必須有insert 標籤
{insert name=header content="Content-Type: text/vnd.wap.wml"} 
<?xml version="1.0"?> 
<!DOCTYPE wml PUBLIC "-//WAPFORUM//DTD WML 1.1//EN" 
"http://www.wapforum.org/DTD/wml_1.1.xml"> 
<!-- begin new wml deck --> 
<wml> 
<!-- begin first card --> 
<card> 
<do type="accept"> 
<go href="#two"/> 
</do> 
<p> 
Welcome to WAP with Smarty! 
Press OK to continue... 
</p> 
</card> 
<!-- begin second card --> 
<card id="two"> 
<p> 
Pretty easy isn't it? 
</p> 
</card> 
</wml> 
Componentized Templates[組合的模板] 
這項技巧有點普通,可是仍然是個不錯的思想,若是要使用的話,自擔風險。 
172
傳統上,把模板編入應用程序中步驟以下:首先,累計一下 PHP 程序中的變量,(可能用到數據庫查詢。)
而後,實例化一個 Smarty 對象,給變量賦值而且輸出這個模板。所以,例如在模板裏有一個資源標記。
能夠在應用程序中收集這些資源數據,而後給模板中的這些變量賦值並輸出。如今若是僅僅是經過包含這
些模板就能夠把資源標記加入到任何一個應用程序中不是很好嗎? 
能夠經過使用{php}{/php}這兩個標籤來在模板裏嵌入 PHP。這樣,就可以創建包含自身的使用本身的數
據結構的模板來給他們自身的變量賦值。經過像這樣邏輯的嵌入,可以把模板和邏輯性結合起來。這種方
法使得模板無論源於何處老是像一個構件同樣組合在一塊兒。 
組合的模板演示:
{* Smarty *} 
{php} 
// 爲取得股票數據定義函數
function fetch_ticker($symbol,&$ticker_name,&$ticker_price) { 
// 從資源中取得$ticker_name 和$ticker_price 的邏輯
} 
// 調用該函數
fetch_ticker("YHOO",$ticker_name,$ticker_price); 
// 分配模版變量
$this->assign("ticker_name",$ticker_name); 
$this->assign("ticker_price",$ticker_price); 
{/php} 
Stock Name: {$ticker_name} Stock Price: {$ticker_price} 
就像 Smarty 1.5.0,這裏有一種更清晰的方法。能夠在模板裏使用{include_php ...}這些標籤來包含 php。
使用這種方法,可以保持 PHP 的邏輯性和模板的邏輯性分離。參照 include_php 這個函數來得到更多信
173
息。 
使用include_php組合的模板演示:
load_ticker.php 
--------------- 
<?php 
// 爲取得股票數據定義函數
function fetch_ticker($symbol,&$ticker_name,&$ticker_price) { 
// 從資源中取得$ticker_name 和$ticker_price 的邏輯
} 
// 調用該函數
fetch_ticker("YHOO",$ticker_name,$ticker_price); 
// 分配模版變量
$this->assign("ticker_name",$ticker_name); 
$this->assign("ticker_price",$ticker_price); 
?> 
index.tpl 
--------- 
{* Smarty *} 
{include_php file="load_ticker.php"} 
Stock Name: {$ticker_name} Stock Price: {$ticker_price} 
Obfuscating E-mail Addresses[拒絕電子郵件地址] 
想知道電子郵件地址是怎樣出如今如此衆多的獵頭郵件列表中嗎?獵頭們收集電子郵件地址的一種方式
就是從網頁上獲取。爲了對抗這種方式,可讓電子郵件在 HTML 源文件中以動態 javascript 的方式顯示,
這樣在瀏覽器裏就能正確的顯示出來。這個是經過 maito 插件作到的。 
174
拒絕電子郵件地址演示:
index.tpl 
--------- 
Send inquiries to 
{mailto address=$EmailAddress encode="javascript" subject="Hello"} 
技術提示:這種方法不是 100%安全的。一個獵頭可能知道編寫他的電子郵件收集器來解碼,但不是很可
能的。 
17. Resources [相關資源] 
Smarty 的主頁位於 http://smarty.php.net/。 
您能加入郵件列表,經過發送郵件至信箱 smarty-general-subscribe@lists.php.net。您也能夠經過如
下連接加入郵件列表 http://marc.theaimsgroup.com/?l=smarty&r=1&w=2 
PHP 中文社區是一個 PHP 技術討論社區,歡迎加入社區參與討論。 
18. BUGS [漏洞] 
最新的 Smarty 分卷可查閱漏洞文件,或上網查閱。 
175

 

ign("ticker_price",$ticker_price);
?>
index.tpl
---------
{* Smarty *}
{include_php file="load_ticker.php"}
Stock Name: {$ticker_name} Stock Price: {$ticker_price}
Obfuscating E-mail Addresses[拒絕電子郵件地址]
想知道電子郵件地址是怎樣出如今如此衆多的獵頭郵件列表中嗎?獵頭們收集電子郵件地址的一種方式
就是從網頁上獲取。爲了對抗這種方式,可讓電子郵件在 HTML 源文件中以動態 javascript 的方式顯示,
這樣在瀏覽器裏就能正確的顯示出來。這個是經過 maito 插件作到的。
174
拒絕電子郵件地址演示:
index.tpl
---------
Send inquiries to
{mailto address=$EmailAddress encode="javascript" subject="Hello"}
技術提示:這種方法不是 100%安全的。一個獵頭可能知道編寫他的電子郵件收集器來解碼,但不是很可
能的。
17. Resources [相關資源]
Smarty 的主頁位於 http://smarty.php.net/。
您能加入郵件列表,經過發送郵件至信箱 smarty-general-subscribe@lists.php.net。您也能夠經過如
下連接加入郵件列表 http://marc.theaimsgroup.com/?l=smarty&r=1&w=2
PHP 中文社區是一個 PHP 技術討論社區,歡迎加入社區參與討論。
18. BUGS [漏洞]
最新的 Smarty 分卷可查閱漏洞文件,或上網查閱。
175javascript

相關文章
相關標籤/搜索