smarty模板入門學習(share)

最美的回憶發表於2017-11-18

1、安裝Smarty3.0

一、什麼是smarty?

smarty是一個使用PHP寫出來的模板PHP模板引擎,它提供了邏輯與外在內容的分離,簡單的講, 目的就是要使用PHP程式設計師同美工分離,使用的程式設計師改變程式的邏輯內容不會影響到美工的頁面設計, 美工重新修改頁面不會影響到程式的程式邏輯,這在多人合作的專案中顯的尤為重要。

二、smarty優點:

1. 速度:採用smarty編寫的程式可以獲得最大速度的提高,這一點是相對於其它的模板引擎技術而言的。

2. 編譯型:採用smarty編寫的程式在執行時要編譯成一個非模板技術的PHP檔案, 這個檔案採用了PHP與HTML混合的方式,在下一次訪問模板時將WEB請求直接轉換到這個檔案中, 而不再進行模板重新編譯(在源程式沒有改動的情況下)

3. 快取技術:smarty選用的一種快取技術,它可以將使用者最終看到的HTML檔案快取成一個靜態的HTML頁, 
當設定smarty的cache屬性為true時, 在smarty設定的cachetime期內將使用者的WEB請求直接轉換到這個靜態的HTML檔案中來, 這相當於呼叫一個靜態的HTML檔案。

4. 外掛技術:smarty可以自定義外掛。外掛實際就是一些自定義的函式。

5. 模板中可以使用if/elseif/else/endif。在模板檔案使用判斷語句可以非常方便的對模板進行格式重排。

三、不適合使用smarty的地方:

1. 需要實時更新的內容。例如像股票顯示,它需要經常對資料進行更新,這型別的程式使用smarty會使模板處理速度變慢。

2. 小專案。小專案因為專案簡單而美工與程式設計師兼於一人的專案,使用smarty會喪失php開發迅速的優點。

開啟smarty的官方網站,www.smarty.net/download.php。下載Smarty 3.0rc4, 目前仍然是處於rc版本(Release.Candidate.就是發行候選版本,與beta版本相比,不再有功能的增加,主要著重於除錯!)。 有tar.gz和zip分別適用於linux和windows版本。

下載好後tar –zxvf Smarty 3.0rc4.tar.gz

目錄中,demo資料夾為示例檔案。Libs為程式檔案。

/libs/Smarty.class.php   //主檔案

/libs/sysplugins/  //內部plugin

/libs /plugins/   //外部plugin,可自由擴充

/demo/cache/   //放置快取檔案

/demo/configs /   //放置可以載入的配置檔案

/demo/templates/   //放置模板檔案

/demo/templates_c/    //放置對模板編譯後的檔案

最好在需要進行smarty處理的檔案的目錄中建立與demo中的相同的資料夾(注意資料夾具有web使用者寫許可權), 當然也可以更改資料夾名和路徑,預設值為處於被smarty處理的檔案的同級目錄。Smarty3.0需要php5.0以上。

2、除錯Smarty3.0

建立自己的檔案,比如index.php。 
在templates目錄中建立模板index.tpl(幾乎可以是任何文字檔案的副檔名, 常用的是tpl,php,html,不建議使用後兩者,因為可以從瀏覽器直接訪問而不安全。 可以對apache的httpd.conf進行設定,禁止直接訪問.tpl檔案。或者將templats目錄放在網站文件樹之外。)

[Index.php]

require_once(“http://www.cnblogs.com/Smarty-3.0rc4/libs/Smarty.class.php”);

$smarty = new smarty();

$smarty->assign(‘name’,`挨踢前端’);

$smarty->display(‘templates/index.tpl ‘);

[Index.tpl]的程式碼:

<html><body>

<span>你好, {$name}</span>

</body></html>

Smarty編譯時的處理過程是源php檔案->模板檔案(可能多次呼叫)->源php檔案。。。 
也就是說不影響原php檔案的其他處理和輸出。所以smarty模板檔案可以是完整的html,也可以是其中一部分。

3、Smarty3.0基礎

3.1 smarty處理過程

smarty將php原始檔,首先編譯成中間檔案(也是php),如果啟用快取, 再根據編譯檔案生成快取檔案(也是php),需要快取的部分全部是硬編碼。 之後的每次訪問都會訪問編譯檔案(如果編譯檔案已經存在), 一次編譯多次呼叫(可以是單檔案的多次,也可以是多檔案的多次), 如果啟用快取且有快取檔案而且沒有過期,則直接訪問快取檔案,跳過編譯檔案。編譯檔案一經生成,就不會被自動更新,除非模板檔案或者配置檔案更改。 源php檔案修改是不會引發重新編譯的。 一旦編譯檔案重新生成,快取檔案也必然重新生成。 
Smarty允許有兩種特殊的編譯設定存在:

1、 任何時候都不自動重新編譯(上線階段):只有沒有該檔案的編譯檔案時才生成, 模板檔案或者配置檔案的更改,不會引發重新編譯。

$smarty->compile_check(false)     
#預設為true,false表示任何時候都不在發生檔案變更的情況下生成編譯檔案,除了無編譯檔案。

$smarty->compile_check()    #獲得當前編譯檢查的設定

 2、任何時候都重新編譯(除錯階段):任何時候都重新編譯。

$smarty->force_compile(true)  #預設為false,true表示每次都重新編譯(啟用快取的話,每次都重新快取)

3.2 分界符

在模板檔案中,區分普通html程式碼和smarty程式碼靠的是分界符。預設情況下是“{ }“,但是與js和css相沖突。 
可以進行變更。在3.0中模板標籤將不支援空格,如{  $abc  }在Smarty2中可以識別的, 
但是3.0裡頭就不行了,必須這樣{$abc},這樣是為了能夠更好的支援javascript和css。

$smarty->left_delimiter = “<{“;   //左分界符,2.0屬性,3.0沿用

$smarty->right_delimiter = “}>”;   //右分界符,2.0屬性,3.0沿用

注意:將預設分界符修改後,在3.0模板中仍然不支援空格,比如<{ $abc }>,無效。

3.3 註釋

{* smarty用*包含的文字為註釋內容 *}

如果預設分界符修改為“<{}>“, <{* smarty用*包含的文字為註釋內容 *}>。註釋中的模板變數無效。

3.4 模板包含檔案

格式 {include file=”要包含的檔名稱 “}

Head.tpl

<span>這是頂部內容,歡迎你,{$name}</span><hr />

Index.tpl中加一下程式碼

{include file=”head.tpl”}

輸出結果:

這是頂部內容,歡迎你,挨踢前端。

您好,挨踢前端!

除了包含其他配置檔案,還可以包含html、php(需要開啟smarty支援php模板的選項, 最好使用include_php函式)。包含檔案還可以使用傳參。

Head.tpl

<span>{$nr},歡迎你,{$name}</span><hr />

Index.tpl

{include file=”head.tpl” nr=”這是頂部內容”}

輸出結果同上。

3.5 載入配置檔案

可以預先規定一系列的變數與值的對應,並放在配置檔案中,在使用時載入。 配置檔案一般放在configs資料夾中,可以自定義。

My.conf

gv = “my.conf中的全域性變數”   //全域性配置變數,任何時候呼叫,都將被載入

//如果$sections,未設定,顯示全部變數

[color]   //區域性配置變數

fontcolor = “red”   //如果$sections,設定為red,只顯示全域性變數和[color]中的變數

[size]  //區域性配置變數

fontsize = “12px”   //如果$sections,設定為size,只顯示全域性變數和[size]中的變數

呼叫配置檔案有兩種方法,一種是在原始檔處,一種是在模板檔案處。

原始檔處:$smarty->configLoad($config_file, $sections = null)

模板檔案處:{config_load file=”載入的配置檔案” section=”選取的區域性變數(可選)”scope=“作用模板範圍(可選)“}

如果使用原始檔的方法,載入的配置檔案變數的作用模板範圍自動為global, 而且可以應用到多個模板中(smarty物件呼叫了多個模板)。

如果使用後者,靈活性更大。單個模板中config_load的scope引數的範圍可以是local (本模板,只能本模板使用這些變數), parent(父模板或者檔案) 或  global(同一個smarty物件所呼叫的所有模板,其他模板不需要再載入該配置檔案)

在模板檔案中使用配置變數

{#配置變數#}或者{$smarty.config.變數名稱}

【相關函式】

$smarty->getConfigVariable($variable)    //返回某個模板變數,該變數必須是parent或者是global

$smarty->getConfigVars($varname = null)   //返回模板變數陣列,或者單個變數。 
該變數或者變數組必須是parent或者是global

$smarty->clearConfig($varname = null)  //清除所有配置變數或者指定的一個配置變數

$smarty->setConfig_overwrite(false)   //如果設變數為真,則從配置檔案中讀取出來的變數(如果變數名稱相同) 
將會由最後一個值覆蓋。反之,變數將會放到一個陣列中。 不能用陣列索引去訪問,可以使用cycle函式。該屬性也有getConfig_overwrite函式。

$smarty->setConfig_booleanize(true);   //設定為true的話, 配置檔案中的on/true/yes/1 和 off/false/no/0值會自動轉化為布林值, false將變為字串(如果作為判斷條件,永遠為真)。 該屬性也有getConfig_booleanize函式。

3.6 環境配置

Smary指令碼中是可以動態設定編譯、模板、快取、配置路徑。

$smarty->template_dir = “./templates”;    //設定模板目錄,2.0設定方法,3.0沿用但不推薦

$smarty->compile_dir = “./templates_c”;   //設定編譯目錄,2.0設定方法,3.0沿用但不推薦

$smarty->config_dir = ‘./configs/’;        //設定配置目錄,2.0設定方法,3.0沿用但不推薦

$smarty->cache_dir = ‘./cache/’;         //設定快取目錄,2.0設定方法,3.0沿用但不推薦

Smary在3.0中對屬性進行了封裝。可以使用如下方法進行訪問獲得目錄。

$smarty->getCacheDir();   //得到當前快取目錄路徑

$smarty->getTemplateDir();   //得到當前模板目錄路徑的陣列

$smarty->getConfigDir();  //得到當前 配置目錄路徑

$smarty->getCompileDir();  //得到當前編譯目錄路徑

$smarty->getPluginsDir()   //得到當前外掛目錄路徑陣列

同樣用下面的方法進行目錄設定

$smarty->setTemplateDir(“../smarty1/templates/”);    //設定新的模板目錄, 
注意設定後模板目錄的陣列只有該值一個,不管原來有幾個值。

$smarty->setCompileDir(“../smarty1/templates_c/”);   //設定新的編譯目錄

$smarty->setConfigDir(“../smarty1/configs/”);        //設定新的配置目錄

$smarty->setCacheDir(“../smarty1/cache/”);         //設定新的快取目錄

$smarty->addTemplateDir(“templates”);     //引用的模板檔案的路徑必須在模板目錄數值中, 否則報錯,由於仍然用原來的模板檔案,所以新增上原來模板路徑,這樣模板陣列中有兩個路徑。

$smarty->addPluginsDir(‘myplugins’);   //新增一個新的外掛目錄,如果用set將取消外掛陣列,變為單指

【相關函式】

$smarty->utility->compileAllTemplates($extention = ‘.tpl’, $force_compile = false,  $time_limit = 0, $max_errors = null)   //直接編譯所有模板目錄下所有模板檔案,用處不大。

$smarty->utility->clearCompiledTemplate($resource_name = null,  $compile_id = null, $exp_time = null)  

//清除編譯目錄下的編譯檔案或者指定條件的編譯檔案。

$smarty-> setDefault_template_handler_func($fucname)    
//該函式在模板不能從它的源目錄下獲取時會得到呼叫,沒有太大的意義,可以設定異常處理。

4、Smarty語法基礎篇

4.1 變數

模板中的變數主要來源有三種。

1、是由原php檔案中分配過來的。

$smarty->assign(‘name’,`挨踢前端’);    //在源php檔案中分配

<span>你好, {$name}</span>  //在模板檔案中使用

2、是由配置檔案中分配過來的。

$smarty->configLoad(“configs/my.conf”)   //在源php檔案中載入配置檔案,也可以在模板中載入

<span style=”color:{#fontcolor#}; font-size:{#fontsize#};”>這是{#gv#}</span><br />   //在模板檔案中使用

3、是在模板檔案中建立的。

{assign var=”name” value=”段華建” nocache=”false”scope=”global”}    
//在模板中定義的變數,如果之前定義了相同的變數,則以最後一次定義為準。

{$name=”挨踢前端”}    //給變數直接賦值,如果該變數原來不存在,自動建立,3.0新特性。

{assign var=foo value=[1,2,3]}     //定義普通陣列變數

{assign var=foo value=[`y`=>`yellow`,`b`=>`blue`]}    //定義關聯陣列

{assign var=foo value=[1,[9,8],3]}  //定義陣列中的陣列

{$foo[]=1}    //增加變數陣列$foo的一個元素

<span>你好, {$name}</span> //在模板檔案中使用

【相關函式】

$smarty->getVariable($variable, $_ptr = null, $search_parents = true,  
$error_enable = true) //獲得變數,僅限於獲得第一種方式的變數

$smarty->getTemplateVars($varname = null, $_ptr = null, $search_parents = true)    
//獲得變數,可以獲得第一種和第三種方式的變數(第三種方式變數scope必須為global或者parent), 
如果想獲得配置變數參看3.4

4.2 Smarty保留變數

Smarty系統中保留了一些內建變數,可以快速訪問相應的變數。但是不能再源php中獲得這些變數。

1、請求訪問變數(Request variables)

$smarty.get.變數       //顯示通過get方式傳過來的指定變數的值。

$smarty.post.變數      //顯示通過post方式傳過來的指定變數的值。

$smarty.cookies.變數   //顯示通過cookie中指定變數的值。

$smarty.server.SERVER_NAME   //顯示server變數值,phpinfo()中$_SERVER系列變數

$smarty.env.PATH   //顯示系統環境變數值,phpinfo()中$_ENV系列變數

$smarty.session.變數   //顯示session中指定變數的值

$smarty.request.變數   //顯示通過post、get、cookie中指定變數的值。

2、時間訪問變數

{$smarty.now}  //顯示unix系統時間戳,需要變數調節器格式化,參看4.2.4,也可以使使用{time()}

3、常量訪問變數

{$smarty.const._MY_CONST_VAL}   //訪問php中的常量包括自定義常量和系統常量

4、{$smarty.capture} 

參看4.4.1

5、配置訪問變數

{$smarty.config.配置變數}   //訪問配置變數,等同於 #配置變數# 方式

6、{$smarty.section}, {$smarty.foreach}

參看4.4.3和4.4.4

7、{$smarty.template}   //顯示模板路徑和名稱

4.3 變數操作

4.3.1賦值

{$name = 新值} 比如,{$name=”我的名字叫段華建”}   //新值將替代原值,如果原來無該變數, 
則建立變數並賦值。配置變數無法重新賦值。

{$name = 表示式} 比如,{$name = 1+2+$foo[`bar`]}  //$foo[`bar`]的值為1, 變數值為4

{$foo[`bar`]=1}    //給陣列的一個元素賦值

{$foo[`bar`][`blar`]=1}   //給多維陣列的一個元素賦值

{$foo = array(1,2,3,4,5)}   //利用php函式建立變數$foo,並賦值。

4.3.2訪問

最簡單的訪問方法是 {$var},配置變數訪問是{#configvar#}

陣列變數的訪問可以是{$array[1][1]},也可以支援{$array.1.1}

物件的訪問{$object->method1($x)},也支援物件鏈,{$object->method1($x)->method2($y)}

字串與變數的混合輸出

{“大家好,我是$name<br />”}   #Smarty可以識別嵌入在雙引號中的變數, 
只要此變數只包含數字、字母、下劃線。

{“大家好,我是`$name[$obj->a]`<br />”}    #中括號[]、句號. 物件相關 -> ,必須將變數用兩個`符號括起。

4.3.3變數名變數

與php相同,都支援在變數名稱中使用變數,smarty還支援使用表示式。

$foo         //一個普通的變數

$foo_{$bar}   //變數名中包含變數

$foo_{$x+$y}  //變數名中可以支援表示式

$foo_{$bar}_buh_{$blar}   //變數名包含多個變數

4.3.4變數調節器

變數調節器主要是對變數進行格式化。

{$var|capitalize}   //將變數首字大寫

{$var|count_characters:false}   //計算變數裡的字元數,false為不計算空格。 
若變數為數值則為數字和小數點等其他運算子的總和

{$var| cat:var2} //將var2連線到var,若為數值以字串處理。

{$var| count_paragraphs} //計算變數裡的段落數量,已“
“區分

{$var| count_sentences} //計算變數中句子的數量,不好使

{$var| count_words} //計算變數中單詞的數量 已非字母和數字的字元分割統計

{$var| date_format :”%H:%M:%S” } //格式化變數日起,具體引數看chm文件

{$var| default:”no title” } //當變數為空時,為變數提供一個預設值

{$var| escape:url}     //對變數值進行轉碼,具體引數看chm文件

{$var| indent:10:”*”}    //對變數指定具體字元進行縮排,若為空格在html中不會顯示出來,具體引數看chm文件

{$var| lower}   //將變數小寫

{$var| nl2br }   //將變數中的“
“轉換成”<br />“

{$var| regex_replace:”/[

]/”:” “} //將變數中的符合正則的內容替換成指定內容

{$var| replace:”Garden”:”Vineyard”} //將變數中要求的內容替換成指定內容

{$var| spacify:”^^”} //將變數字元與字元之間插入指定內容,包括空格

{$var|string_format:”%d”}   //將變數中的內容格式化,格式化引數同printf

{$var| strip: “*”}  //用一個空格或一個給定字元替換所有重複空格,換行和製表符

{$var| strip_tags} //刪除變數中的html標記, 去除<和>標籤,包括在<和>之間的任何內容

{$var| truncate:30:”…”:true}    //擷取變數的到規定的長度,具體引數看chm文件

{$var| upper}    //將變數大寫

{$var| wordwrap:30:”
“:true}    //規定指定的長度強制換行,具體引數看chm文件

修改器可以複合組合。

{$articleTitle|lower|spacify|truncate:30:”. . .”}

設定預設變數調節器

$smarty->getDefault_modifiers()    //預設為空陣列

$smarty->setDefault_modifiers(array(‘spacify:”^^”’,`capitalize’)   //設定變數的預設調節器,必須用array

{name}    //模板變數name自動加入上面兩個調節器

同時也可以定義自己的調節器,詳情請參考6.7.4和6.8.4

4.3.5變數作用域(未寫)

4.4 內建函式

4.4.1 capture

capture函式的作用是捕獲模板輸出的資料並將其儲存到一個變數裡,而不是把它們輸出到頁面. 
任何在 {capture name=”foo”}和{/capture}之間的資料將被儲存到變數$foo中。 
這樣可以根據實際情況,選擇性的輸出一些內容,輸出的語法是$smarty.capture.變數。

{capture name=”bottom”}

{include file=”bottom.tpl” nr=”這是底部的內容”}

{/Capture}

{if true }  //進行條件判斷,確定是否輸出

{$smarty.capture.bottom}

{/if}

4.4.2 config_load

參看3.4

4.4.3 foreach,foreachelse

foreach 適合於簡單陣列(元素型別相同)

{foreach name=名稱 item=內容 key=鍵 from=陣列}  //2.0中的用法,3.0沿用

正常執行

{foreachelse}

From變數陣列沒有值時(0個元素)執行。

{/foreach}

例子:

{foreach name=for1 item=num from=$foo}

{$smarty.foreach.for1.index+1}個元素:{$num}<br />

{if is_array($num)}

{foreach name=for2 item=num2 key=key2 from=$num}

{$str|cat:$smarty.foreach.for2.index+1|cat:”個元素:”|cat:$num2|cat:” key是”|cat:$key2|indent:1:”.”}<br />

{/foreach}

{/if}

{foreachelse}

{$smarty.foreach.for1.index+1}個元素:沒有值!<br />

{/foreach}

foreach的內建變數

$smarty.foreach.foreachname.index   //(迴圈內部使用)顯示當前迴圈的索引,如果陣列為空,返回-1

$smarty.foreach.foreachname. iteration    //(迴圈內部使用)顯示當前的迴圈次數

$smarty.foreach.foreachname.first  //(迴圈內部使用)如果為第一次迴圈,返回true

$smarty.foreach.foreachname.last  //(迴圈內部使用)如果為最後一次迴圈,返回true

$smarty.foreach.foreachname.total  //(迴圈內外部使用)顯示迴圈的總次數

foreach 在3.0中做一定的升級,語法更接近於php,內建變數也更簡潔。

{foreach $myarray as $var}…{/foreach}

foreach的內建變數,均可在內外部使用

$var@key           //輸出元素的鍵值,簡單為012,關聯為具體鍵值。

$var@iteration      //顯示當前的迴圈次數,外部使用為最後一次

$var@index         //顯示當前迴圈的索引,如果陣列為空,返回-1,外部使用為最後一次

$var@total          //顯示迴圈的總次數

$var@first           //如果為第一次迴圈,返回true

$var@last           //如果為最後一次迴圈,返回true

4.4.4 section,sectionelse

section適用於複雜的陣列操作,不適合關聯陣列。但是在3.0中併為對他做什麼升級和修改, 
而是直接推出了for命令,for更接近於php語法。可以預見,section將在未來版本中淘汰。

{section name=名稱 loop=迴圈陣列(次數) start=開始(0) step=步階(1) max=最大迴圈次數 show=是否顯示(true)}   
//2.0中的用法,3.0沿用

正常執行

{sectionelse}

loop陣列沒有值時(0個元素)執行。

{/section }

例子:

{section name=sec1 loop=$foo step=1 start=0 show=true}

第{$smarty.section.sec1.index+1}個元素:{$foo[sec1]}  迴圈次數是

{$smarty.section.sec1.iteration}<br />

{if is_array($foo[sec1])}

{section name=sec2 loop=$foo[sec1] step=1 start=0 show=true}

第{$smarty.section.sec2.index+1}個元素:{$foo[sec1][sec2]}  
迴圈次數是{$smarty.section.sec2.iteration}<br />

{/section}

{/if}

{sectionelse}

{$smarty.section.sec1.index}個元素:沒有值!<br />

{/section}

Section的內建變數與foreach 相同。

4.4.5 include

{include file=”包含檔案” var=”自定義傳入包含檔案的變數”assign=” 指定一個變數儲存待包含模板的輸出”}

如果規定了assign ,則包含檔案不會馬上輸出,模板輸出的資料將儲存到assign指定的變數裡, 
這樣可以根據實際情況,再輸出包含檔案的內容。原理類似於capture。

4.4.6 include_php

{include_php file=”包含檔案” once=”是否指包含一次(true)”assign=” 指定一個變數儲存待包含的輸出”}

包含php檔案,包含的檔案正常編譯,並提供輸出。如果規定了assign , 
則包含檔案不會馬上輸出,輸出的資料將儲存到assign指定的變數裡, 
這樣可以根據實際情況,再輸出包含檔案的內容。

4.4.7 insert

Insert最大的特點是不快取。他的引數可能會快取。但是insert所呼叫的函式內部不快取。

{insert name=”函式名稱” script=”包含函式的指令碼”var….=”函式引數” assign=” 指定一個變數儲存呼叫的輸出”}

Insert呼叫的函式有特別的規定,函式格式必須是“smarty_insert_函式名稱($params,&$smarty)”, 
從insert傳入的引數,會統一放到陣列變數中,引數名為該陣列的鍵值。

例子:

{insert name=”maxnum” script=”s2.php” x=12 y=13 assign=nn}   //模板檔案,script為儲存呼叫函式的指令碼

{foreach $nn as $n}

{$n}

{/foreach}

function smarty_insert_maxnum($arr)   //函式指令碼檔案

{

return $arr[`x`]>$arr[`y`]?$arr[`x`]:$arr[`y`];

}

如果規定了assign ,則呼叫函式的記過不會馬上輸出,輸出的資料將儲存到assign指定的變數裡, 
這樣可以根據實際情況,再輸出包含檔案的內容。

Insert也可以定義成元件,寫入元件庫中,詳情請參考6.8.5

4.4.8 if,elseif,else

{if $name eq “Fred”}

Welcome Sir.

{elseif $name eq “Wilma”}

Welcome Ma’am.

{else}

Welcome, whatever you are.

{/if}

這個沒有什麼太好說的。比較操作符可以是 “==、>=”等,也可以是”eq、ne”等,這個看手冊吧。

4.4.9 ldelim,rdelim

這個也很簡單,分別替換smarty當前規定的左邊界符和右邊界符。一般成對使用。

4.4.10 literal

Literal 標籤區域內的資料將被當作文字處理,此時模板將忽略其內部的所有字元資訊。 
該特性用於顯示有可能包含大括號等字元資訊的 js、css 。當這些資訊處於 {literal}{/literal} 標籤中時, 
模板引擎將不分析它們,而直接顯示。

4.4.11 strip

Smarty 在顯示前將除去任何位於 {strip}{/strip} 標記中資料的首尾空格和回車。

4.4.12 php

php 標籤允許在模板中直接嵌入 php 指令碼。 {php}標籤預設是關閉的,可以通過如下方式開啟

$smarty->setAllow_php_tag(true)   //設定開啟識別php的標籤

$smarty->getAllow_php_tag()       //獲得當前對{php}的支援狀態

4.4.13 for,while

這是3.0新增的函式。語法類似於php,這兩個函式都不適合關聯陣列

{for $x=0, $y=count($foo); $x<$y; $x++}  ….  {/for}

{for $x=0 to count($foo)-1 step 1}

第二種方法,支援for的內建變數。第一種不支援。

$x@iteration   //當前迴圈次數

$x@total     //總迴圈次數

$x@first  //迴圈第一次

$x@last     //迴圈最後一次

{while true}….{/while}

While沒有內建變數。

4.5 系統自定義函式

4.5.1 assign

{assign var=”name” value=”段華建” nocache=”false”scope=”global”}  //在模板中定義

$smarty->assign($tpl_var, $value = null, $nocache = false, $scope = SMARTY_LOCAL_SCOPE)  
//在php檔案中定義

nocache決定了是否需要不快取該變數(前提是需要啟動快取)。

scope 決定了變數的作用範圍,有global、parent、local

【相關函式】

$smarty->assignGlobal($varname, $value = null, $nocache = false)   #直接分配一個全域性的變數

$smarty->assignByRef($tpl_var, &$value, $nocache = false, $scope = SMARTY_LOCAL_SCOPE) 
  //分配一個引用變數,適合傳遞的變數較大,比如物件型別,可以防止記憶體拷貝。

$smarty->clearAssign($tpl_var)   //清除特定的變數

$smarty->clearAllAssign()    //清除所有分配的變數

4.5.2 append

3.0新增的函式,向模板中分配的變數,該變數可以接受多個值,從而成為變數陣列。

$smarty->append($tpl_var, $value = null, $merge = false, $nocache = false, $scope = SMARTY_LOCAL_SCOPE)     
//php檔案中

{append var=”name” value=”2″}    //模板檔案中

例子:

$smarty->assign(‘nh’, ‘var1);   //分配一個變數模板,值為var1

$smarty->append(‘nh’,`var2′);   //對同一個變數,在追加一個值。nh模板變數為陣列。

{$nh[0]}  //在模板檔案中使用第一個值

$merge,應該是是否合併原值,目前版本測試的時候,不起任何作用。

【相關函式】

$smarty->appendByRef($tpl_var, &$value, $merge = false)  //新增一個引用變數到模板變數中,$merge不起作用。

4.5.3 counter

計數器。當第一次出現{counter}時開始計數,每次出現{counter}按照規定的計數。

{counter start=開始(1) skip=步階(1) direction=遞增/遞減(up/down) print=是否顯示(true) assign=輸出給模板變數}

counter除了start和assign ,其他屬性的設定,會對一下次的counter起作用。如果規定了assign , 
則包含檔案不會馬上輸出,模板輸出的資料將儲存到assign指定的變數裡, 這樣可以根據實際情況, 
再輸出包含檔案的內容。

4.5.4 cycle

用於輪轉使用一組值。當第一次出現{cycle}時開始,每次出現{cycle}輪換每個值。

{cycle name=名稱 values=一組值 print=是否輸出(true) advance=是否使用下一個值(true)  
delimiter=一組值中的分隔符(,) assign=輸出給模板變數}

4.5.5 debug

什麼也不說了,一個字強大。用了你就知道了,在需要設斷點的地方寫入{debug}

如果使用fetch(),則debug失效。只能使用display()。

{debug output=輸出的格式(javascript/html) }   //模板宣告除錯,,可以選擇輸出的方式預設是js視窗。

$smarty->getDebugging()    //得到當前是進行除錯,預設false

$smarty->setDebugging(true)    //對後續呼叫的模板進行除錯。

$smarty->getDebug_tpl()   //獲得除錯所需要的tpl模板,可以自己修改。

$smarty->setDebug_tpl(‘new_debug.tpl’)   //重新指定新的用於除錯的模板

4.5.6 eval

eval 按處理模板的方式計算取得變數的值。個人感覺用處不大,對快取支援不好。

4.5.7 fetch

fetch 用於從本地檔案系統、HTTP或FTP上取得檔案並顯示檔案的內容。 
如果檔名稱以”http://”開頭,將取得該網站頁面並顯示。 
如果檔名稱以”ftp://”開頭,將從ftp伺服器取得該檔案並顯示。

{fetch file=”/export/httpd/www.domain.com/docs/navbar.js”}

{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解析,則會輸出解析內容

【相關函式】

$smarty->fetch($template, $cache_id = null, $compile_id = null, $parent = null)   
//將模板輸出的內容放入變數中,供以後使用,如果規定了編譯id, 
比如3,則編譯後的檔名稱為“3^常規名稱”,快取id同理。

$output = $smarty->fetch(“index.tpl”);

// do something with $output here// 對將要輸出的內容進行處理

echo $output;

4.5.8 math

math 允許模板設計者在模板中進行數學表示式運算.

{math equation=自定義公式 [var…]=變數值 format=結果格式化字串 assign=輸出給模板變數}

4.5.9 popup_init,popup

輸出javascript視窗。

{popup_init src=”/javascripts/overlib.js”}  //popup_init載入js檔案,必須的。

{popup text=”彈出資訊”}     //個人感覺意義不大,引數很多,可以看chm

4.5.10 textformat

textformat 用於格式化文字。該函式主要清理空格和特殊字元,對段落按單詞邊界換行和行縮排等段落格式化處理。 
與變數調節器類似,優點是可以調整段落,引數具體看文件。

{textformat [修改引數….]}

需要修改的段落

{/textformat}

4.5.11 html_checkboxes

根據函式生成checkboxes(多選)頁面元素。

{html_checkboxes  name=名稱(checkbox)  values=值陣列  ouput=顯示陣列   
selected=已顯示的元素或者陣列,陣列值為values  options=代替(value+output)可用關聯陣列   
separator=分隔每個核取按鈕的字串  label=是否為每個核取按鈕新增 <label> 標籤(true)}

{assign var=cb_values value=[1,2,3,4,5,6] scope=”global”}

{assign var=cb_content value=[`北京`,`廣州`,`天津`,`石家莊`,`太原`,`濟南`] scope=”global”}

{assign var=cb value=[`1`=>`北京`,`3`=>`廣州`,`2`=>`天津`,`4`=>`石家莊`,`5`=>`太原`,`6`=>`濟南`] scope=”global”}

{assign var=cb_selected value=[1,2]}

{html_checkboxes name=”checkbox” values=$cb_values output=$cb_content selected=$cb_selected

separator=”|”}

{html_checkboxes name=”checkbox” options=$cb selected=$cb_selected separator=”|”}

4.5.12 html_image

意義不大,直接寫html可能會更好,不能生成img標籤的id和name屬性

{html_image file=圖片路徑和名稱 border=邊框 height=高度 width=寬度 alt=alt內容 href=圖片url}

4.5.13 html_options

{html_options  name=下拉選單名稱  values=值陣列  ouput=顯示陣列  selected=已顯示的元素   
options=代替(value+output)可用關聯陣列}

注意,如果沒有新增name屬性,需要自己加入<select></select>標記。 
如果selected是一個陣列且不能多選,則選擇陣列的最後一個值作為以選擇的。

4.5.14 html_radios

{html_radios  name=名稱(radio)  values=值陣列  ouput=顯示陣列   
selected=已顯示的元素options=代替(value+output)可用關聯陣列  separator=分隔每個核取按鈕的字串}

4.5.15 html_select_date,html_select_time,html_table

意義不大,有侷限性,不如手寫。看手冊吧。

4.5.16 mailto

{mailto address=傳送郵箱 cc=抄送郵箱 bcc=暗送郵箱 subject=主題 text=連結內容 encode=編碼形式(javascript/hex)}

具體看手冊吧,測試中字符集格式轉換有問題。

4.6 模板中自定義函式

3.0以後可以在模板內建立函式,而不需要一定先註冊或者建立元件。

{function name=函式名 [var…]=預設值}   //定義函式

函式體。。

{/function}

{call name=函式名 [var…]=傳值}   //呼叫函式,呼叫函式的程式碼一定要放在函式定義程式碼之後

{函式名 [var…]=傳值}    //也可以這樣呼叫

5、快取

5.1 開啟快取

smarty預設是不開啟快取的。需要進行設定才能開啟快取。快取狀態的設定需要在display或者fetch模板之前使用。 
確定快取目錄是否存在,是否具有足夠的許可權,設定快取目錄檢視3.4。

$smarty->getCaching()    //檢查當前是否開啟了快取

$smarty->setCaching(true) //開啟快取

$smarty->isCached($template, $cache_id = null, $compile_id = null) 
//檢查指定條件的模板檔案(名稱/快取id/編譯id)是否被快取(有快取檔案,且在快取有效時間內)

$smarty->setcache_lifetime(60);   //設定當前的快取時間

$smarty->getcache_lifetime();     //獲得當前的快取時間,預設是3600(1個小時)

$smarty->display/fetch(模板名,快取名=null,編譯名=null,父模板名=null)

執行display/fetch就會在快取目錄中產生快取檔案。再次訪問時,只要存在該快取檔案, 
且在快取檔案的生命週期之內就會直接呼叫該快取檔案,而不需要重新編譯。

$smarty->cache->clearAll($exp_time = null, $type = null)    //清除所有快取檔案, 
$exp_time指定一個以秒為單位的最小時間,超過這個時間的快取都將被清除掉

$smarty->cache->clear($template_name, $cache_id = null, $compile_id = null, $exp_time = null, $type = null)   //清除指定條件的快取檔案

可以單設某個條件或者組合多個條件刪除多個快取檔案,比如

$smarty->cache->clear($template_name)     //清除名稱為template_name的所有快取檔案

$smarty->cache->clear(null, null, $compile_id)    //清除編譯id為compile_id的所有快取檔案

$smarty->cache->clear(null, $cache_id = null, $compile_id)     
//清除快取id為cache_id且編譯id為compile_id的所有快取檔案

5.2 區域性不快取

快取是一種高效訪問的理想方式,但是對整個頁面進行快取的時候, 
有時候區域性的一些元素不希望被快取,比如時間、實時變化的資訊等。

區域性快取有幾種方法。

1、nocache屬性

$smarty->assign/append($tpl_var, $value = null, $nocache = true …)  
//中規定nocache = true,則模板中該變數各處均不快取

{$foo nocache=true}   //不管前面如何設定,則該處變數被快取

{time() nocache}   //函式也可以,nocache等同於nocache=true

模板中宣告的變數和配置檔案分配的變數不使用nocache,因為要改變他們的值, 
需要編輯模板和配置檔案,因為模板檔案和配置檔案修改就會重新生成快取檔案。

2、insert函式

Insert內部不受快取影響,但是如果給insert傳參,請確保引數不被快取,詳情檢視4.4.7

3、{nocache}…..{/nocache}

程式碼塊不快取。程式碼塊中可以放入變數和自定義模板函式,自定義函式的定義部分程式碼可以不放入, 
但是呼叫程式碼必須放入,否則會快取。insert函式不起作用。

5.3 單頁面多快取

有時候,我們希望單個頁面有多個快取頁面。比如index?id=1和index?id=2可能頁面內容不同, 
希望分別儲存在不同的快取檔案中,所以這裡我們需要設定cache_id。

例子:Index.php

if(empty($_GET[`id`]))$_GET[`id`] = null;

$smarty->assign(‘name’,`段華建1′.$_GET[`id`]);

$smarty->display(‘templates/t3.tpl’,$_GET[`id`],$_GET[`id`]);

這樣為每個由id值建立的網頁都生成對應快取檔案,當id無值時(index.php), 
直接生成一個快取檔案(名稱),當id=1時(index.php?id=1),將生成另一個快取檔案(1^名稱)。

5.4 快取集合

實際上是多個值的不同組合換來的不同頁面,比如index.php?id=2&sid=3,沒種組合可能產生不同的頁面結果。

最開始可以使用連線字串使id和sid的值連線,理論上將也不會出現重複, 
但是會出現這種情況index.php?id=23,是不是和上面的值一樣呢。為了避免這種情況,可以使用快取集合。

if(empty($_GET[`id`]))$_GET[`id`] = null;

if(empty($_GET[`sid`]))$_GET[`sid`] = null;

$smarty->assign(‘name’,`段華建1′.$_GET[`id`]);

$smarty->display(‘templates/t3.tpl’,$_GET[`id`].’|’.$_GET[`sid`]);   //兩個變數之間用”|”隔開, 
共同組成cache_id.有幾個變數最終檔名就有幾個”^”,如果變數為空,則只有一個”^”

從php的安全考慮,對於傳過來的值要進行校驗,去掉危險的字元。

5.5 快取處理函式

smarty允許自己定義快取讀、寫和清除的方法, 
比如不想用檔案的形式進行快取處理可以寫一個有mysql進行快取讀、寫和清除的方法。

$smarty->Cache_handler_func=‘自定義函式名稱’

在3.0中好像不太好用了。

6、smarty語法高階篇

6.1 模板過濾器

6.1.1 預過濾器pre

預濾器用來在編譯之前直接處理模板原始檔。預濾器函式的第一個引數是模板原始檔, 
該檔案可能被其他一些預濾器修正過。此預濾器外掛將返回修正過的原始檔。 
請記住此原始檔僅用來編譯,它不會在任何地方被儲存。

有兩種方式:

第一種是臨時註冊

$smarty->register->preFilter(‘mypre’);     //註冊一個預編譯器函式

$smarty->unregister->preFilter (‘mypre’);     //刪除一個預編譯器函式

function mypre($tpl_source, &$smarty)     
//在PHP檔案中定義一個預編譯器函式,引數格式固定,不可變,返回編譯資料

{

return “mypre<br />”.$tpl_source;

}

第二種是載入元件

在smarty程式目錄中有libs/plugins目錄,在這裡我們可以建立自己的過濾器元件。

建立php檔案,prefilter.函式名.php(本例中是prefilter.mypre.php)  //也可以用其他元件的php檔案

function smarty_prefilter_mypre($source, $smarty)   
//在smarty元件檔案中定義一個預編譯器函式元件,函式名稱和引數嚴格不變

{

    return “mypre_plus<br />”.$source;

}

$smarty->autoload_filters = array(‘pre’=>array(‘mypre’));  //在php檔案中呼叫元件過濾器

$smarty->autoload_filters = array()  //取消調入的元件過濾器

過濾器可以載入多個,

$smarty->register->preFilter(‘mypre’);   //第一種方法,就是羅列一下,在上面先執行誰

$smarty->register->preFilter(‘mypre1′);

$smarty->autoload_filters = array(‘pre’=>array(‘mypre’,`mypre1′));   //第二種方法,就是建立陣列就行,在前面的先執行。

6.1.2 後過濾器post

後濾器用來在編譯之後直接處理模板的編譯輸出(PHP程式碼), 
但須在編譯之後的模板被儲存到檔案系統之前就進行操作。 
預濾器函式的第一個引數是編譯之後的模板程式碼,該程式碼可能被其他一些後濾器修正過。 
此後濾器外掛將返回修正過的程式碼檔案。

有兩種方式:

第一種是臨時註冊

$smarty->register->postFilter(‘mypre’);     //註冊一個後編譯器函式

$smarty->unregister->postFilter (‘mypre’);     //刪除一個後編譯器函式

function mypost($tpl_source, &$smarty)    //在php檔案中定義一個後編譯器函式, 
引數格式固定,不可變,返回編譯資料

{

return “mypost<br />”.$tpl_source;

}

第二種是載入元件

在smarty程式目錄中有libs/plugins目錄,在這裡我們可以建立自己的過濾器元件。

建立php檔案,postfilter.函式名.php(本例中是postfilter.mypost.php)  //也可以用其他元件的php檔案

function smarty_postfilter_mypost($source, $smarty)    
//在smarty元件檔案中定義一個預編譯器函式元件,函式名稱和引數嚴格不變

{

    return “mypost_plus<br />”.$source;

}

$smarty->autoload_filters = array(‘post’=>array(‘mypost’));  //在php檔案中呼叫元件過濾器

$smarty->autoload_filters = array(‘post’=>array())  //取消調入的元件過濾器

過濾器可以載入多個,

$smarty->register->postFilter(‘mypost’);   //第一種方法,就是羅列一下,在上面先執行誰

$smarty->register->postFilter(‘mypost1′);

$smarty->autoload_filters = array(‘post’=>array(‘mypost’,`mypost1′));    
//第二種方法,就是建立陣列就行,在前面的先執行。

6.1.3 輸出過濾器output

輸出過濾器外掛的作用是,在裝載並執行完一個模板之後顯示模板之前,操作該模板的輸出。

pre和post都會將過濾器加工後的結果硬編碼寫入編譯檔案, 
也就意味著pre和post始終會被快取(即使php不快取)。 
output不會,將不會寫入編譯檔案以及之後的快取檔案,所以他是不被快取的。

pre和post對於模板中呼叫的模板,比如include file,均需執行一遍。 
而output只對編譯後的檔案執行一次(也就是總共執行一次)

有兩種方式:

第一種是臨時註冊

$smarty->register->outputFilter(‘myoutput’);     //註冊一個後編譯器函式

$smarty->unregister->outputFilter (‘mypre’);     //刪除一個後編譯器函式

function myoutput($tpl_source, &$smarty)     
//在php檔案中定義一個後編譯器函式,引數格式固定,不可變,返回編譯資料

{

return “myoutput<br />”.$tpl_source;

}

第二種是載入元件

在smarty程式目錄中有libs/plugins目錄,在這裡我們可以建立自己的過濾器元件。

建立php檔案,outputfilter.函式名.php(本例中是outputfilter.myoutput.php)  //也可以用其他元件的php檔案

function smarty_outputfilter_myoutput($source, $smarty)    
//在smarty元件檔案中定義一個預編譯器函式元件,函式名稱和引數嚴格不變

{

    return “myoutput_plus<br />”.$source;

}

$smarty->autoload_filters = array(‘output’=>array(‘myoutput’));  //在php檔案中呼叫元件過濾器

$smarty->autoload_filters[`output`] = array()  //取消調入的元件過濾器

過濾器可以載入多個,

$smarty->register->outputFilter(‘myoutput’);   //第一種方法,就是羅列一下,在上面先執行誰

$smarty->register->outputFilter(‘myoutput1′);

$smarty->autoload_filters = array(‘output’=>array(‘myoutput’,`myoutput1′));    
//第二種方法,就是建立陣列就行,在前面的先執行。

6.2 錯誤和異常

6.2.1 觸發錯誤 trigger_error

php中也有trigger_error函式

Void trigger_error(string error_msg, [int level])   //int level就是錯誤級別,也可以用常量代替,E_USER_NOTICE, E_USER_WARNING等。set_error_handler()函式進行捕獲處理。

$smarty->trigger_error($error_msg, $error_type = E_USER_WARNING)    
//格式與PHP中的同名函式一樣,只能丟擲$smarty的異常

6.2.2 錯誤處理函式

$smarty->setExceptionHandler(handlerfuncname)    
// 設定異常處理的函式,只可以處理有smarty引發的錯誤, 
不能解決trigger_error。set_error_handler()函式只能解決php的,而不能解決smarty丟擲的錯誤。

function handlerfuncname($errstr)

{

echo $errstr;

}

6.3 資料物件

3.0推出一個新的資料物件。可以從$smarty中建立一個或者多個資料物件,集中賦值, 
然後有選擇性選取某個或者多個資料物件,生成模板。

$smarty->createData($parent = null)  //建立資料物件,可以選擇父物件,子物件將繼承父物件的賦值。

例子:

$mydata = $smarty->createData();  //建立一個資料物件,沒有父物件

$mydata1 = $smarty->createData($mydata);   //建立一個資料物件,父物件是$mydata

$mydata->assignByRef(‘assign_obj’,&$han);

$mydata->assign(‘name’,`abcd’);

$mydata1-> assign(‘name’,`bcds’);     //mydata1自動繼承了mydata的資料,如果相同,則新值覆蓋舊值

$smarty->display(‘templates/t4.tpl’,null,null,$mydata1);      
//顯示模板,最後一個引數必須有,指定模板使用哪個資料物件。也可以使用模板物件呼叫,參看6.4

6.4 模板物件

3.0同時推出一個新的模板物件。可以從$smarty中建立一個或者多個模板物件, 
模板物件可以自己分配變數,同時可以呼叫資料物件(父物件)來生成檔案。

$smarty->createTemplate($template, $cache_id = null, $compile_id = null, $parent = null)    
//建立模板物件,可以選擇父物件,編譯id和快取id。

例子:

$mytemplate = $smarty->createTemplate(‘templates/t4.tpl’);  //建立一個模板物件,沒有父物件,預設為$smarty

$mytemplate1 = $smarty->createTemplate(‘templates/t4.tpl’,null,null,$mydata);  //建立一個模板物件,父物件為mydata,mydata中的資料自動載入進來。

$mytemplate->assignByRef(‘assign_obj’,&$han);    //定義變數

$mytemplate->assign(‘name’,`abcd’);

$mytemplate->display();            //生成檔案。

如果一個模板是通過include方式呼叫的,則子模板的父物件將指向引用它的模板物件。

所有當前模板變數和父物件的模板物件都是可以獲取的,但是如果是通過{assign}或者{$foo=…} 
這樣的方法建立或者修改變數則它的作用域將只停留在當前模板物件。

6.5 模板繼承

模板繼承,可以在模板中寫{block} … {/block}快,並且這些塊可以在子模板中進行覆蓋。例子:

Parent.tpl

—————————————————–

<html>

<body>

{block name=’top’} Parent.tpl的頭部<br />{/block}<hr />

{block name=’middle’} Parent.tpl的中部<br />{/block}<hr />

{block name=’buttom’} Parent.tpl的尾部<br />{/block}

</body>

</html>

child.tpl

{extends file=’parent.tpl’}    //繼承父模板

{block name=’top’}{$smarty.block.parent}{“`$smarty.template`的頭部”} {/block}     
//child模板更新了top塊。其他按照預設繼承。

可以通過extends標籤來指定被繼承的模板,並在子模板中通過重寫父模板的同名block塊,達到覆蓋的目的。 
同時,可以通過{$smarty.block.parent}獲取到父block的內容。 
在子模板中,所有在{block} … {/block}之外的內容都將被忽略,這種繼承支援多檔案,多重繼承, 
意味著可以無限的繼承下去。還可通過{block}的append和prepend屬性來插入父模板結構中

6.6 資源相關內容(未寫)

6.7 動態註冊元件

註冊可以理解為是動態的註冊元件,與寫死到檔案中的元件類似,參考6.8

6.7.1 註冊物件

SMARTY允許通過模板訪問PHP物件。有兩種方式來訪問它們。

一種是註冊物件到模板,然後通過類似於使用者自定義函式的形式來訪問它。

$smarty->register->templateObject($object_name, $object_impl, $allowed = array(),  
$smarty_args = true, $block_methods = array()) 
  //向模板註冊一個物件,allowed是允許接受的方法。

$smarty->register->templateObject(‘reg_obj’,$han,array(‘show’,`show1′));

{reg_obj->show var=2 var1=3}   //在模板中訪問,注意!接受的引數是陣列,跟insert類似

$smarty->unregister->templateObject($object_name)    //登出物件

第一種方法有一個很好的模板語法,同時它作為一個註冊物件被限制為幾個固定的方法和目標, 
這樣是比較安全的,但是他只能夠呼叫物件方法,而且不支援資料物件和模板物件。

另一種方法給模板分配物件,然後通過訪問其它賦值變數類似的方法進行訪問。

$mysmarty->assignByRef(‘assign_obj’,&$han);     //建議使用引用分配,物件一般都很大,節省記憶體

{$assign_obj->方法或者屬性}     //在模板中訪問

這種方法可以呼叫物件的屬性。而且可以用資料物件和模板物件註冊

6.7.2 註冊塊

$smarty->register->block($block_tag, $block_impl, $cacheable = true, $cache_attr = array())

用來動態註冊/定義塊函式外掛。前兩個引數指定塊函式名稱和執行函式的名稱。 
執行函式的名稱格式可以是一個包含函式名稱的字串; 
也可以是一個array(&$object, $method)陣列形式,其中&$object是一個物件的引用,而$method是它的一個方法;
還可以是一個array(&$ class, $method)陣列形式,其中$class是一個類的名稱,$method是類

中的一個方法。

$cacheable,如果啟用頁面快取,塊級函式是否快取,預設是true。

$cacheattr,如果$cacheale為false,也就是塊級函式不快取,可以設定塊級函式中的部分屬性快取,已陣列定義。

例子:

$hanobj = new han();

$smarty->setcaching(true);

$smarty->register->block(‘hhh’, array(&$hanobj,’myf’),false,array(‘fn’));   //動態註冊塊

class han{

。。。。。。

public function myf($params,$content,&$smarty,&$repeat){   //定義塊引用的函式

return “這是”.$params[`fn`].$params[`un`].”註釋說明!<br />
“.$content;

}

}

{hhh fn=$name un=$name1}     //在模板中呼叫,塊級內容沒有被快取,屬性fn被快取

aaaaaaa

{time()}

{/hhh}

$smarty->unregister->block($block_tag)   //登出塊

6.7.3 註冊函式

$smarty->register->compilerFunction($compiler_tag, $compiler_impl, $cacheable = true)   
#註冊編譯函式,編譯函式不能指定快取屬性

$smarty->register->templateFunction($function_tag, $function_impl, $cacheable = true, $cache_attr = array())     
//註冊模板函式,3.0後可以直接在模板中定義函式了,不需要註冊

動態註冊模板函式外掛,前兩個引數是模板函式名稱和執行函式名稱。 
執行函式的格式可以是一個包含函式名稱的字串;也可以是一個array(&$object, $method)陣列形式, 
其中&$object是一個物件的引用,而$method是它的一個方法; 
還可以是一個array(&$ class, $method)陣列形式, 
其中$class是一個類的名稱,$method是類中的一個方法。

例子:

$hanobj = new han();

$smarty->setcaching(true);

$smarty->register->templateFunction(‘hhh’, array(&$hanobj,’myf’),false,array(‘fn’));

class han{

     …………….

public function myf($params,&$smarty,&$repeat){   //註冊的函式只有3個引數

return time().”這是”.$params[`fn`].$params[`un`].”註釋說明!<br />
“;

}

}

{hhh fn=$name un=$name1}   //在模板中呼叫,函式沒有被快取,屬性fn被快取

$smarty->unregister->compilerFunction($compiler_tag)   //登出註冊函式

$smarty->unregister->templateFunction($function_tag)

6.7.4 註冊變數調節器

$smarty->register->modifier($modifier_name, $modifier_impl)

動態註冊調節器函式外掛,前兩個引數是模板調節器名稱和執行函式名稱。 
執行函式的格式可以是一個包含函式名稱的字串; 
也可以是一個array(&$object, $method)陣列形式,其中&$object是一個物件的引用, 
而$method是它的一個方法;還可以是一個array(&$ class, $method)陣列形式, 
其中$class是一個類的名稱,$method是類中的一個方法。

例子:

$hanobj = new han();

$smarty->setcaching(true);

$smarty->register->modifier(‘hhh’,array(&$hanobj,’myf’));  //註冊調節器

class han{

。。。。。。

public function myf($string) {

return time().$string;

}

}

{$name|hhh nocache=true}  // 在模板中呼叫,nocache為true,表示該變數不快取

$smarty->unregister->modifier($modifier)    //登出變數調節器

6.8 元件相關內容

6.8.1 建立過濾器元件

請參考6.1.1 預過濾器pre

請參考6.1.2 後過濾器 post

請參考6.13 輸出過濾器 output

6.8.2 建立塊元件

在libs/plugins中建立塊元件檔案block.塊名.php

function smarty_block_hhhh($params,$content,&$smarty,&$repeat)   //函式名稱格式要固定

{

return “這是”.$params[`fn`].$params[`un`].”註釋說明!<br />
“.$content;

}

{hhhh fn=$name un=$name1}     //在模板中呼叫

aaaaaaa

{time()}

{/hhhh}

與動態註冊相比,不能規定塊快取

6.8.3 建立函式元件

在libs/plugins中建立函式元件檔案function.函式名.php

function smarty_function_hhhh($params,&$smarty,&$repeat){    //在組建檔案中建立函式

return time().”這是”.$params[`fn`].$params[`un`].”註釋說明!<br />
“;

}

{nocache}

{hhhh fn=$name un=$name1}     //在模板中呼叫,如果想不快取,可以用{nocache}括住

{/nocache}

6.8.4 建立變數調節器元件

在libs/plugins中建立調節器元件檔案modifier.調節器名.php

function smarty_modifier_hhhh($string)       //在組建檔案中建立調節器函式

{

return time().$string;

}

{$name|hhhh nocache=true}   #在模板中呼叫

6.8.5 建立insert函式元件

在libs/plugins中建立調節器元件檔案insert.函式名.php

function smarty_insert_hhhh($params,&$smarty){  //在元件檔案中建立insert函式

return time().”這是”.$params[`fn`].”|”.$params[`un`].”註釋說明!<br />
“;

}

{insert name=”hhhh” fn=$name un=$name1}   //在模板中呼叫函式內部不快取,但是傳遞的引數會快取。

 

 

轉自:

 

 http://xingyunbaijunwei.blog.163.com/blog/static/765380672011102691629382/

 

其它參考:

 

  smarty3 手冊:http://www.speedphp.com/smarty/index.html

 

  smarty教程:http://www.yiibai.com/smarty

本文轉自挨踢前端部落格園部落格,原文連結http://www.cnblogs.com/duanhuajian/archive/2013/05/14/3077732.html如需轉載請自行聯絡原作者

@挨踢前端


相關文章