溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點(diǎn)擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

3.0 smarty 使用方法

發(fā)布時(shí)間:2020-07-27 10:51:54 來源:網(wǎng)絡(luò) 閱讀:643 作者:楊大瓊 欄目:web開發(fā)

一、什么是smarty?

smarty是一個(gè)使用PHP寫出來的模板PHP模板引擎,它提供了邏輯與外在內(nèi)容的分離,簡單的講, 目的就是要使用PHP程序員同美工分離,使用的程序員改變程序的邏輯內(nèi)容不會(huì)影響到美工的頁面設(shè)計(jì), 美工重新修改頁面不會(huì)影響到程序的程序邏輯,這在多人合作的項(xiàng)目中顯的尤為重要。

二、smarty優(yōu)點(diǎn):

1. 速度:采用smarty編寫的程序可以獲得最大速度的提高,這一點(diǎn)是相對(duì)于其它的模板引擎技術(shù)而言的。

2. 編譯型:采用smarty編寫的程序在運(yùn)行時(shí)要編譯成一個(gè)非模板技術(shù)的PHP文件, 這個(gè)文件采用了PHP與HTML混合的方式,在下一次訪問模板時(shí)將WEB請求直接轉(zhuǎn)換到這個(gè)文件中, 而不再進(jìn)行模板重新編譯(在源程序沒有改動(dòng)的情況下)

3. 緩存技術(shù):smarty選用的一種緩存技術(shù),它可以將用戶最終看到的HTML文件緩存成一個(gè)靜態(tài)的HTML頁,
當(dāng)設(shè)定smarty的cache屬性為true時(shí), 在smarty設(shè)定的cachetime期內(nèi)將用戶的WEB請求直接轉(zhuǎn)換到這個(gè)靜態(tài)的HTML文件中來, 這相當(dāng)于調(diào)用一個(gè)靜態(tài)的HTML文件。

4. 插件技術(shù):smarty可以自定義插件。插件實(shí)際就是一些自定義的函數(shù)。

5. 模板中可以使用if/elseif/else/endif。在模板文件使用判斷語句可以非常方便的對(duì)模板進(jìn)行格式重排。

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

1. 需要實(shí)時(shí)更新的內(nèi)容。例如像股票顯示,它需要經(jīng)常對(duì)數(shù)據(jù)進(jìn)行更新,這類型的程序使用smarty會(huì)使模板處理速度變慢。

2. 小項(xiàng)目。小項(xiàng)目因?yàn)轫?xiàng)目簡單而美工與程序員兼于一人的項(xiàng)目,使用smarty會(huì)喪失php開發(fā)迅速的優(yōu)點(diǎn)。

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

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

目錄中,demo文件夾為示例文件。Libs為程序文件。

/libs/Smarty.class.php   #主文件

/libs/sysplugins/  #內(nèi)部plugin

/libs /plugins/   #外部plugin,可自由擴(kuò)充

/demo/cahce/   #放置緩存文件

/demo/configs /   #放置可以載入的配置文件

/demo/templates/   #放置模板文件

/demo/templates_c/    #放置對(duì)模板編譯后的文件

最好在需要進(jìn)行smarty處理的文件的目錄中創(chuàng)建與demo中的相同的文件夾(注意文件夾具有web用戶寫權(quán)限), 當(dāng)然也可以更改文件夾名和路徑,默認(rèn)值為處于被smarty處理的文件的同級(jí)目錄。Smarty3.0需要php5.0以上。
2、調(diào)試Smarty3.0

創(chuàng)建自己的文件,比如index.php。
在templates目錄中創(chuàng)建模板index.tpl(幾乎可以是任何文本文件的擴(kuò)展名, 常用的是tpl,php,html,不建議使用后兩者,因?yàn)榭梢詮臑g覽器直接訪問而不安全。 可以對(duì)apache的httpd.conf進(jìn)行設(shè)置,禁止直接訪問.tpl文件。或者將templats目錄放在網(wǎng)站文檔樹之外。)

[Index.php]

require_once("../../Smarty-3.0rc4/libs/Smarty.class.php");

$smarty = new smarty();

$smarty->assign(‘name’,'韓靈稚’);

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

[Index.tpl]的代碼:

<html><body>

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

</body></html>

Smarty編譯時(shí)的處理過程是源php文件->模板文件(可能多次調(diào)用)->源php文件。。。
也就是說不影響原php文件的其他處理和輸出。所以smarty模板文件可以是完整的html,也可以是其中一部分。
3、Smarty3.0基礎(chǔ)
3.1 smarty處理過程

smarty將php源文件,首先編譯成中間文件(也是php),如果啟用緩存, 再根據(jù)編譯文件生成緩存文件(也是php),需要緩存的部分全部是硬編碼。 之后的每次訪問都會(huì)訪問編譯文件(如果編譯文件已經(jīng)存在), 一次編譯多次調(diào)用(可以是單文件的多次,也可以是多文件的多次), 如果啟用緩存且有緩存文件而且沒有過期,則直接訪問緩存文件,跳過編譯文件。編譯文件一經(jīng)生成,就不會(huì)被自動(dòng)更新,除非模板文件或者配置文件更改。 源php文件修改是不會(huì)引發(fā)重新編譯的。 一旦編譯文件重新生成,緩存文件也必然重新生成。
Smarty允許有兩種特殊的編譯設(shè)置存在:

1、 任何時(shí)候都不自動(dòng)重新編譯(上線階段):只有沒有該文件的編譯文件時(shí)才生成, 模板文件或者配置文件的更改,不會(huì)引發(fā)重新編譯。

$smarty->setCompile_check(false)    
#默認(rèn)為true,false表示任何時(shí)候都不在發(fā)生文件變更的情況下生成編譯文件,除了無編譯文件。

$smarty->getCompile_check()    #獲得當(dāng)前編譯檢查的設(shè)置

 2、任何時(shí)候都重新編譯(調(diào)試階段):任何時(shí)候都重新編譯。

$smarty->setForce_compile(true)  #默認(rèn)為false,true表示每次都重新編譯(啟用緩存的話,每次都重新緩存)

$smarty->getForce_compile()    #獲得當(dāng)前強(qiáng)制編譯的設(shè)置
3.2 分界符

在模板文件中,區(qū)分普通html代碼和smarty代碼靠的是分界符。默認(rèn)情況下是“{ }“,但是與js和css相沖突。
可以進(jìn)行變更。在3.0中模板標(biāo)簽將不支持空格,如{  $abc  }在Smarty2中可以識(shí)別的,
但是3.0里頭就不行了,必須這樣{$abc},這樣是為了能夠更好的支持javascript和css。

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

$smarty->right_delimiter = "}>";   #右分界符,2.0屬性,3.0沿用

注意:將默認(rèn)分界符修改后,在3.0模板中仍然不支持空格,比如<{ $abc }>,無效。
3.3 注釋

{* smarty用*包含的文字為注釋內(nèi)容 *}

如果默認(rèn)分界符修改為“<{}>“, <{* smarty用*包含的文字為注釋內(nèi)容 *}>。注釋中的模板變量無效。
3.4 模板包含文件

格式 {include file="要包含的文件名稱 "}

Head.tpl

<span>這是頂部內(nèi)容,歡迎你,{$name}</span><hr />

Index.tpl中加一下代碼

{include file="head.tpl"}

輸出結(jié)果:

這是頂部內(nèi)容,歡迎你,韓靈稚。

您好,韓靈稚!

除了包含其他配置文件,還可以包含html、php(需要開啟smarty支持php模板的選項(xiàng), 最好使用include_php函數(shù))。包含文件還可以使用傳參。

Head.tpl

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

Index.tpl

{include file="head.tpl" nr=”這是頂部內(nèi)容”}

輸出結(jié)果同上。
3.5 載入配置文件

可以預(yù)先規(guī)定一系列的變量與值的對(duì)應(yīng),并放在配置文件中,在使用時(shí)載入。 配置文件一般放在configs文件夾中,可以自定義。

My.conf

gv = "my.conf中的全局變量"   #全局配置變量,任何時(shí)候調(diào)用,都將被載入

#如果$sections,未設(shè)置,顯示全部變量

[color]   #局部配置變量

fontcolor = "red"   #如果$sections,設(shè)置為red,只顯示全局變量和[color]中的變量

[size]  #局部配置變量

fontsize = "12px"   #如果$sections,設(shè)置為size,只顯示全局變量和[size]中的變量

調(diào)用配置文件有兩種方法,一種是在源文件處,一種是在模板文件處。

源文件處:$smarty->configLoad($config_file, $sections = null)

模板文件處:{config_load file="載入的配置文件" section=”選取的局部變量(可選)”scope=“作用模板范圍(可選)“}

如果使用源文件的方法,載入的配置文件變量的作用模板范圍自動(dòng)為global, 而且可以應(yīng)用到多個(gè)模板中(smarty對(duì)象調(diào)用了多個(gè)模板)。

如果使用后者,靈活性更大。單個(gè)模板中config_load的scope參數(shù)的范圍可以是local (本模板,只能本模板使用這些變量), parent(父模板或者文件) 或  global(同一個(gè)smarty對(duì)象所調(diào)用的所有模板,其他模板不需要再載入該配置文件)

在模板文件中使用配置變量

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

【相關(guān)函數(shù)】

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

$smarty->getConfigVars($varname = null)   #返回模板變量數(shù)組,或者單個(gè)變量。
該變量或者變量組必須是parent或者是global

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

$smarty->setConfig_overwrite(false)   #如果設(shè)變量為真,則從配置文件中讀取出來的變量(如果變量名稱相同)
將會(huì)由最后一個(gè)值覆蓋。反之,變量將會(huì)放到一個(gè)數(shù)組中。 不能用數(shù)組索引去訪問,可以使用cycle函數(shù)。該屬性也有g(shù)etConfig_overwrite函數(shù)。

$smarty->setConfig_booleanize(true);   #設(shè)置為true的話, 配置文件中的on/true/yes/1 和 off/false/no/0值會(huì)自動(dòng)轉(zhuǎn)化為布爾值, false將變?yōu)樽址ㄈ绻鳛榕袛鄺l件,永遠(yuǎn)為真)。 該屬性也有g(shù)etConfig_booleanize函數(shù)。
3.6 環(huán)境配置

Smary腳本中是可以動(dòng)態(tài)設(shè)置編譯、模板、緩存、配置路徑。

$smarty->template_dir = "./templates";    #設(shè)置模板目錄,2.0設(shè)置方法,3.0沿用但不推薦

$smarty->compile_dir = "./templates_c";   #設(shè)置編譯目錄,2.0設(shè)置方法,3.0沿用但不推薦

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

$smarty->cache_dir = ‘./cache/’;         #設(shè)置緩存目錄,2.0設(shè)置方法,3.0沿用但不推薦

Smary在3.0中對(duì)屬性進(jìn)行了封裝??梢允褂萌缦路椒ㄟM(jìn)行訪問獲得目錄。

$smarty->getCacheDir();   #得到當(dāng)前緩存目錄路徑

$smarty->getTemplateDir();   #得到當(dāng)前模板目錄路徑的數(shù)組

$smarty->getConfigDir(); #得到當(dāng)前 配置目錄路徑

$smarty->getCompileDir(); #得到當(dāng)前編譯目錄路徑

$smarty->getPluginsDir()   #得到當(dāng)前插件目錄路徑數(shù)組

同樣用下面的方法進(jìn)行目錄設(shè)置

$smarty->setTemplateDir("../smarty1/templates/");    #設(shè)置新的模板目錄,
注意設(shè)置后模板目錄的數(shù)組只有該值一個(gè),不管原來有幾個(gè)值。

$smarty->setCompileDir("../smarty1/templates_c/");   #設(shè)置新的編譯目錄

$smarty->setConfigDir("../smarty1/configs/");        #設(shè)置新的配置目錄

$smarty->setCacheDir("../smarty1/cache/");         #設(shè)置新的緩存目錄

$smarty->addTemplateDir("templates");     #引用的模板文件的路徑必須在模板目錄數(shù)值中,
否則報(bào)錯(cuò),由于仍然用原來的模板文件,所以添加上原來模板路徑,這樣模板數(shù)組中有兩個(gè)路徑。

$smarty->addPluginsDir(‘myplugins’);   #添加一個(gè)新的插件目錄,如果用set將取消插件數(shù)組,變?yōu)閱沃?br />
【相關(guān)函數(shù)】

$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)   
#該函數(shù)在模板不能從它的源目錄下獲取時(shí)會(huì)得到調(diào)用,沒有太大的意義,可以設(shè)置異常處理。
4、Smarty語法基礎(chǔ)篇
4.1 變量

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

1、是由原php文件中分配過來的。

$smarty->assign(‘name’,'韓靈稚’);    #在源php文件中分配

<span>你好, {$name}</span> #在模板文件中使用

2、是由配置文件中分配過來的。

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

<span >這是{#gv#}</span><br />  #在模板文件中使用

3、是在模板文件中創(chuàng)建的。

{assign var="name" value="韓靈稚" nocache=”false”scope=”global”}   
#在模板中定義的變量,如果之前定義了相同的變量,則以最后一次定義為準(zhǔn)。

{$name="韓靈稚"}    #給變量直接賦值,如果該變量原來不存在,自動(dòng)創(chuàng)建,3.0新特性。

{assign var=foo value=[1,2,3]}     #定義普通數(shù)組變量

{assign var=foo value=['y'=>'yellow','b'=>'blue']}    #定義關(guān)聯(lián)數(shù)組

{assign var=foo value=[1,[9,8],3]}  #定義數(shù)組中的數(shù)組

{$foo[]=1}    #增加變量數(shù)組$foo的一個(gè)元素

<span>你好, {$name}</span> #在模板文件中使用

【相關(guān)函數(shù)】

$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系統(tǒng)中保留了一些內(nèi)置變量,可以快速訪問相應(yīng)的變量。但是不能再源php中獲得這些變量。

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

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

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

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

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

$smarty.env.PATH   #顯示系統(tǒng)環(huán)境變量值,phpinfo()中$_ENV系列變量

$smarty.session.變量 #顯示session中指定變量的值

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

2、時(shí)間訪問變量

{$smarty.now} #顯示unix系統(tǒng)時(shí)間戳,需要變量調(diào)節(jié)器格式化,參看4.2.4,也可以使使用{time()}

3、常量訪問變量

{$smarty.const._MY_CONST_VAL}   #訪問php中的常量包括自定義常量和系統(tǒng)常量

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.2.1賦值

{$name = 新值} 比如,{$name=”我的名字叫韓靈稚”}   #新值將替代原值,如果原來無該變量,
則創(chuàng)建變量并賦值。配置變量無法重新賦值。

{$name = 表達(dá)式} 比如,{$name = 1+2+$foo['bar']}  #$foo['bar']的值為1, 變量值為4

{$foo['bar']=1}    #給數(shù)組的一個(gè)元素賦值

{$foo['bar']['blar']=1}   #給多維數(shù)組的一個(gè)元素賦值

{$foo = array(1,2,3,4,5)}   #利用php函數(shù)創(chuàng)建變量$foo,并賦值。
4.2.2訪問

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

數(shù)組變量的訪問可以是{$array[1][1]},也可以支持{$array.1.1}

對(duì)象的訪問{$object->method1($x)},也支持對(duì)象鏈,{$object->method1($x)->method2($y)}

字符串與變量的混合輸出

{"大家好,我是$name<br />"}   #Smarty可以識(shí)別嵌入在雙引號(hào)中的變量,
只要此變量只包含數(shù)字、字母、下劃線。

{"大家好,我是`$name[$obj->a]`<br />"}    #中括號(hào)[]、句號(hào). 對(duì)象相關(guān) -> ,必須將變量用兩個(gè)`符號(hào)括起。
4.2.3變量名變量

與php相同,都支持在變量名稱中使用變量,smarty還支持使用表達(dá)式。

$foo         #一個(gè)普通的變量

$foo_{$bar}   #變量名中包含變量

$foo_{$x+$y}  #變量名中可以支持表達(dá)式

$foo_{$bar}_buh_{$blar}   #變量名包含多個(gè)變量
4.2.4變量調(diào)節(jié)器

變量調(diào)節(jié)器主要是對(duì)變量進(jìn)行格式化。

{$var|capitalize}   #將變量首字大寫

{$var|count_characters:false}   #計(jì)算變量里的字符數(shù),false為不計(jì)算空格。
若變量為數(shù)值則為數(shù)字和小數(shù)點(diǎn)等其他運(yùn)算符的總和

{$var| cat:var2} #將var2連接到var,若為數(shù)值以字符串處理。

{$var| count_paragraphs} #計(jì)算變量里的段落數(shù)量,已“\n“區(qū)分

{$var| count_sentences} #計(jì)算變量中句子的數(shù)量,不好使

{$var| count_words} #計(jì)算變量中單詞的數(shù)量 已非字母和數(shù)字的字符分割統(tǒng)計(jì)

{$var| date_format :"%H:%M:%S" } #格式化變量日起,具體參數(shù)看chm文檔

{$var| default:"no title" } #當(dāng)變量為空時(shí),為變量提供一個(gè)默認(rèn)值

{$var| escape:url}     #對(duì)變量值進(jìn)行轉(zhuǎn)碼,具體參數(shù)看chm文檔

{$var| indent:10:"*"}    #對(duì)變量指定具體字符進(jìn)行縮進(jìn),若為空格在html中不會(huì)顯示出來,具體參數(shù)看chm文檔

{$var| lower}   #將變量小寫

{$var| nl2br }   #將變量中的“\n“轉(zhuǎn)換成”<br />“

{$var| regex_replace:"/[\r\t\n]/":" "} #將變量中的符合正則的內(nèi)容替換成指定內(nèi)容

{$var| replace:"Garden":"Vineyard"} #將變量中要求的內(nèi)容替換成指定內(nèi)容

{$var| spacify:"^^"} #將變量字符與字符之間插入指定內(nèi)容,包括空格

{$var|string_format:"%d"}   #將變量中的內(nèi)容格式化,格式化參數(shù)同printf

{$var| strip: "*"}  #用一個(gè)空格或一個(gè)給定字符替換所有重復(fù)空格,換行和制表符

{$var| strip_tags} #刪除變量中的html標(biāo)記, 去除<和>標(biāo)簽,包括在<和>之間的任何內(nèi)容

{$var| truncate:30:"…":true}    #截取變量的到規(guī)定的長度,具體參數(shù)看chm文檔

{$var| upper}    #將變量大寫

{$var| wordwrap:30:"\n":true}    #規(guī)定指定的長度強(qiáng)制換行,具體參數(shù)看chm文檔

修改器可以復(fù)合組合。

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

設(shè)置默認(rèn)變量調(diào)節(jié)器

$smarty->getDefault_modifiers()    #默認(rèn)為空數(shù)組

$smarty->setDefault_modifiers(array(‘spacify:"^^"’,'capitalize’)   #設(shè)置變量的默認(rèn)調(diào)節(jié)器,必須用array

{name}    #模板變量name自動(dòng)加入上面兩個(gè)調(diào)節(jié)器

同時(shí)也可以定義自己的調(diào)節(jié)器,詳情請參考6.7.4和6.8.4
4.2.5變量作用域(未寫)
4.4 內(nèi)建函數(shù)
4.4.1 capture

capture函數(shù)的作用是捕獲模板輸出的數(shù)據(jù)并將其存儲(chǔ)到一個(gè)變量里,而不是把它們輸出到頁面.
任何在 {capture name="foo"}和{/capture}之間的數(shù)據(jù)將被存儲(chǔ)到變量$foo中。
這樣可以根據(jù)實(shí)際情況,選擇性的輸出一些內(nèi)容,輸出的語法是$smarty.capture.變量。

{capture name="bottom"}

{include file="bottom.tpl" nr="這是底部的內(nèi)容"}

{/Capture}

{if true }  #進(jìn)行條件判斷,確定是否輸出

{$smarty.capture.bottom}

{/if}
4.4.2 config_load

參看3.4
4.4.3 foreach,foreachelse

foreach 適合于簡單數(shù)組(元素類型相同)

{foreach name=名稱 item=內(nèi)容 key=鍵 from=數(shù)組}  #2.0中的用法,3.0沿用

正常執(zhí)行

{foreachelse}

From變量數(shù)組沒有值時(shí)(0個(gè)元素)執(zhí)行。

{/foreach}

例子:

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

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

{if is_array($num)}

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

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

{/foreach}

{/if}

{foreachelse}

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

{/foreach}

foreach的內(nèi)置變量

$smarty.foreach.foreachname.index   #(循環(huán)內(nèi)部使用)顯示當(dāng)前循環(huán)的索引,如果數(shù)組為空,返回-1

$smarty.foreach.foreachname. iteration    #(循環(huán)內(nèi)部使用)顯示當(dāng)前的循環(huán)次數(shù)

$smarty.foreach.foreachname.first #(循環(huán)內(nèi)部使用)如果為第一次循環(huán),返回true

$smarty.foreach.foreachname.last #(循環(huán)內(nèi)部使用)如果為最后一次循環(huán),返回true

$smarty.foreach.foreachname.total #(循環(huán)內(nèi)外部使用)顯示循環(huán)的總次數(shù)

foreach 在3.0中做一定的升級(jí),語法更接近于php,內(nèi)置變量也更簡潔。

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

foreach的內(nèi)置變量,均可在內(nèi)外部使用

$var@key           #輸出元素的鍵值,簡單為012,關(guān)聯(lián)為具體鍵值。

$var@iteration      #顯示當(dāng)前的循環(huán)次數(shù),外部使用為最后一次

$var@index         #顯示當(dāng)前循環(huán)的索引,如果數(shù)組為空,返回-1,外部使用為最后一次

$var@total          #顯示循環(huán)的總次數(shù)

$var@first           #如果為第一次循環(huán),返回true

$var@last           #如果為最后一次循環(huán),返回true
4.4.4 section,sectionelse

section適用于復(fù)雜的數(shù)組操作,不適合關(guān)聯(lián)數(shù)組。但是在3.0中并為對(duì)他做什么升級(jí)和修改,
而是直接推出了for命令,for更接近于php語法??梢灶A(yù)見,section將在未來版本中淘汰。

{section name=名稱 loop=循環(huán)數(shù)組(次數(shù)) start=開始(0) step=步階(1) max=最大循環(huán)次數(shù) show=是否顯示(true)}  
#2.0中的用法,3.0沿用

正常執(zhí)行

{sectionelse}

loop數(shù)組沒有值時(shí)(0個(gè)元素)執(zhí)行。

{/section }

例子:

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

第{$smarty.section.sec1.index+1}個(gè)元素:{$foo[sec1]}  循環(huán)次數(shù)是

{$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}個(gè)元素:{$foo[sec1][sec2]}
循環(huán)次數(shù)是{$smarty.section.sec2.iteration}<br />

{/section}

{/if}

{sectionelse}

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

{/section}

Section的內(nèi)置變量與foreach 相同。
4.4.5 include

{include file="包含文件" var=”自定義傳入包含文件的變量”assign=” 指定一個(gè)變量保存待包含模板的輸出”}

如果規(guī)定了assign ,則包含文件不會(huì)馬上輸出,模板輸出的數(shù)據(jù)將存儲(chǔ)到assign指定的變量里,
這樣可以根據(jù)實(shí)際情況,再輸出包含文件的內(nèi)容。原理類似于capture。
4.4.6 include_php

{include_php file="包含文件" once=”是否指包含一次(true)”assign=” 指定一個(gè)變量保存待包含的輸出”}

包含php文件,包含的文件正常編譯,并提供輸出。如果規(guī)定了assign ,
則包含文件不會(huì)馬上輸出,輸出的數(shù)據(jù)將存儲(chǔ)到assign指定的變量里,
這樣可以根據(jù)實(shí)際情況,再輸出包含文件的內(nèi)容。
4.4.7 insert

Insert最大的特點(diǎn)是不緩存。他的參數(shù)可能會(huì)緩存。但是insert所調(diào)用的函數(shù)內(nèi)部不緩存。

{insert name=”函數(shù)名稱” script=”包含函數(shù)的腳本”var….=”函數(shù)參數(shù)” assign=” 指定一個(gè)變量保存調(diào)用的輸出”}

Insert調(diào)用的函數(shù)有特別的規(guī)定,函數(shù)格式必須是“smarty_insert_函數(shù)名稱($params,&$smarty)”,
從insert傳入的參數(shù),會(huì)統(tǒng)一放到數(shù)組變量中,參數(shù)名為該數(shù)組的鍵值。

例子:

{insert name="maxnum" script="s2.php" x=12 y=13 assign=nn}   #模板文件,script為保存調(diào)用函數(shù)的腳本

{foreach $nn as $n}

{$n}

{/foreach}

function smarty_insert_maxnum($arr)   #函數(shù)腳本文件

{

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

}

如果規(guī)定了assign ,則調(diào)用函數(shù)的記過不會(huì)馬上輸出,輸出的數(shù)據(jù)將存儲(chǔ)到assign指定的變量里,
這樣可以根據(jù)實(shí)際情況,再輸出包含文件的內(nèi)容。

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}

這個(gè)沒有什么太好說的。比較操作符可以是 “==、>=”等,也可以是”eq、ne”等,這個(gè)看手冊吧。
4.4.9 ldelim,rdelim

這個(gè)也很簡單,分別替換smarty當(dāng)前規(guī)定的左邊界符和右邊界符。一般成對(duì)使用。
4.4.10 literal

Literal 標(biāo)簽區(qū)域內(nèi)的數(shù)據(jù)將被當(dāng)作文本處理,此時(shí)模板將忽略其內(nèi)部的所有字符信息。
該特性用于顯示有可能包含大括號(hào)等字符信息的 js、css 。當(dāng)這些信息處于 {literal}{/literal} 標(biāo)簽中時(shí),
模板引擎將不分析它們,而直接顯示。
4.4.11 strip

Smarty 在顯示前將除去任何位于 {strip}{/strip} 標(biāo)記中數(shù)據(jù)的首尾空格和回車。
4.4.12 php

php 標(biāo)簽允許在模板中直接嵌入 php 腳本。 {php}標(biāo)簽?zāi)J(rèn)是關(guān)閉的,可以通過如下方式打開

$smarty->setAllow_php_tag(true)   #設(shè)置開啟識(shí)別php的標(biāo)簽

$smarty->getAllow_php_tag()       #獲得當(dāng)前對(duì){php}的支持狀態(tài)
4.4.13 for,while

這是3.0新增的函數(shù)。語法類似于php,這兩個(gè)函數(shù)都不適合關(guān)聯(lián)數(shù)組

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

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

第二種方法,支持for的內(nèi)置變量。第一種不支持。

$x@iteration   #當(dāng)前循環(huán)次數(shù)

$x@total     #總循環(huán)次數(shù)

$x@first  #循環(huán)第一次

$x@last     #循環(huán)最后一次

{while true}….{/while}

While沒有內(nèi)置變量。
4.5 系統(tǒng)自定義函數(shù)
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決定了是否需要不緩存該變量(前提是需要啟動(dòng)緩存)。

scope 決定了變量的作用范圍,有g(shù)lobal、parent、local

【相關(guān)函數(shù)】

$smarty->assignGlobal($varname, $value = null, $nocache = false)   #直接分配一個(gè)全局的變量

$smarty->assignByRef($tpl_var, &$value, $nocache = false, $scope = SMARTY_LOCAL_SCOPE)
  #分配一個(gè)引用變量,適合傳遞的變量較大,比如對(duì)象類型,可以防止內(nèi)存拷貝。

$smarty->clearAssign($tpl_var)   #清楚特定的變量

$smarty->clearAllAssign()    #清除所有分配的變量
4.5.2 append

3.0新增的函數(shù),向模板中分配的變量,該變量可以接受多個(gè)值,從而成為變量數(shù)組。

$smarty->append($tpl_var, $value = null, $merge = false, $nocache = false, $scope = SMARTY_LOCAL_SCOPE)    
#php文件中

{append var="name" value="2"}    #模板文件中

例子:

$smarty->assign(‘nh’, ‘var1);   #分配一個(gè)變量模板,值為var1

$smarty->append(‘nh’,'var2′);   #對(duì)同一個(gè)變量,在追加一個(gè)值。nh模板變量為數(shù)組。

{$nh[0]}  #在模板文件中使用第一個(gè)值

$merge,應(yīng)該是是否合并原值,目前版本測試的時(shí)候,不起任何作用。

【相關(guān)函數(shù)】

$smarty->appendByRef($tpl_var, &$value, $merge = false)  #添加一個(gè)引用變量到模板變量中,$merge不起作用。
4.5.3 counter

計(jì)數(shù)器。當(dāng)?shù)谝淮纬霈F(xiàn){counter}時(shí)開始計(jì)數(shù),每次出現(xiàn){counter}按照規(guī)定的計(jì)數(shù)。

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

counter除了start和assign ,其他屬性的設(shè)置,會(huì)對(duì)一下次的counter起作用。如果規(guī)定了assign ,
則包含文件不會(huì)馬上輸出,模板輸出的數(shù)據(jù)將存儲(chǔ)到assign指定的變量里, 這樣可以根據(jù)實(shí)際情況,
再輸出包含文件的內(nèi)容。
4.5.4 cycle

用于輪轉(zhuǎn)使用一組值。當(dāng)?shù)谝淮纬霈F(xiàn){cycle}時(shí)開始,每次出現(xiàn){cycle}輪換每個(gè)值。

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

什么也不說了,一個(gè)字強(qiáng)大。用了你就知道了,在需要設(shè)斷點(diǎn)的地方寫入{debug}

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

{debug output=輸出的格式(javascript/html) }   #模板聲明調(diào)試,,可以選擇輸出的方式默認(rèn)是js窗口。

$smarty->getDebugging()    #得到當(dāng)前是進(jìn)行調(diào)試,默認(rèn)false

$smarty->setDebugging(true)    #對(duì)后續(xù)調(diào)用的模板進(jìn)行調(diào)試。

$smarty->getDebug_tpl()   #獲得調(diào)試所需要的tpl模板,可以自己修改。

$smarty->setDebug_tpl(‘new_debug.tpl’)   #重新指定新的用于調(diào)試的模板
4.5.6 eval

eval 按處理模板的方式計(jì)算取得變量的值。個(gè)人感覺用處不大,對(duì)緩存支持不好。
4.5.7 fetch

fetch 用于從本地文件系統(tǒng)、HTTP或FTP上取得文件并顯示文件的內(nèi)容。
如果文件名稱以"http://"開頭,將取得該網(wǎng)站頁面并顯示。
如果文件名稱以"ftp://"開頭,將從ftp服務(wù)器取得該文件并顯示。

{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}

調(diào)用的文件內(nèi)容,如果能被html解析,則會(huì)輸出解析內(nèi)容

【相關(guān)函數(shù)】

$smarty->fetch($template, $cache_id = null, $compile_id = null, $parent = null)  
#將模板輸出的內(nèi)容放入變量中,供以后使用,如果規(guī)定了編譯id,
比如3,則編譯后的文件名稱為“3^常規(guī)名稱”,緩存id同理。

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

// do something with $output here// 對(duì)將要輸出的內(nèi)容進(jìn)行處理

echo $output;
4.5.8 math

math 允許模板設(shè)計(jì)者在模板中進(jìn)行數(shù)學(xué)表達(dá)式運(yùn)算.

{math equation=自定義公式 [var…]=變量值 format=結(jié)果格式化字符串 assign=輸出給模板變量}
4.5.9 popup_init,popup

輸出javascript窗口。

{popup_init src="/javascripts/overlib.js"}  #popup_init載入js文件,必須的。

{popup text=”彈出信息”}     #個(gè)人感覺意義不大,參數(shù)很多,可以看chm
4.5.10 textformat

textformat 用于格式化文本。該函數(shù)主要清理空格和特殊字符,對(duì)段落按單詞邊界換行和行縮進(jìn)等段落格式化處理。
與變量調(diào)節(jié)器類似,優(yōu)點(diǎn)是可以調(diào)整段落,參數(shù)具體看文檔。

{textformat [修改參數(shù)….]}

需要修改的段落

{/textformat}
4.5.11 html_checkboxes

根據(jù)函數(shù)生成checkboxes(多選)頁面元素。

{html_checkboxes  name=名稱(checkbox)  values=值數(shù)組  ouput=顯示數(shù)組  
selected=已顯示的元素或者數(shù)組,數(shù)組值為values  options=代替(value+output)可用關(guān)聯(lián)數(shù)組  
separator=分隔每個(gè)復(fù)選按鈕的字符串  label=是否為每個(gè)復(fù)選按鈕添加 <label> 標(biāo)簽(true)}

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

{assign var=cb_content value=['北京','廣州','天津','石家莊','太原','濟(jì)南'] scope="global"}

{assign var=cb value=['1'=>'北京','3'=>'廣州','2'=>'天津','4'=>'石家莊','5'=>'太原','6'=>'濟(jì)南'] 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_p_w_picpath

意義不大,直接寫html可能會(huì)更好,不能生成img標(biāo)簽的id和name屬性

{html_p_w_picpath file=圖片路徑和名稱 border=邊框 height=高度 width=寬度 alt=alt內(nèi)容 href=圖片url}
4.5.13 html_options

{html_options  name=下拉菜單名稱  values=值數(shù)組  ouput=顯示數(shù)組  selected=已顯示的元素  
options=代替(value+output)可用關(guān)聯(lián)數(shù)組}

注意,如果沒有添加name屬性,需要自己加入<select></select>標(biāo)記。
如果selected是一個(gè)數(shù)組且不能多選,則選擇數(shù)組的最后一個(gè)值作為以選擇的。
4.5.14 html_radios

{html_radios  name=名稱(radio)  values=值數(shù)組  ouput=顯示數(shù)組  
selected=已顯示的元素options=代替(value+output)可用關(guān)聯(lián)數(shù)組  separator=分隔每個(gè)復(fù)選按鈕的字符串}
4.5.15 html_select_date,html_select_time,html_table

意義不大,有局限性,不如手寫??词謨园?。
4.5.16 mailto

{mailto address=發(fā)送郵箱 cc=抄送郵箱 bcc=暗送郵箱 subject=主題 text=鏈接內(nèi)容 encode=編碼形式(javascript/hex)}

具體看手冊吧,測試中字符集格式轉(zhuǎn)換有問題。
4.6 模板中自定義函數(shù)

3.0以后可以在模板內(nèi)創(chuàng)建函數(shù),而不需要一定先注冊或者建立組件。

{function name=函數(shù)名 [var…]=默認(rèn)值}   #定義函數(shù)

函數(shù)體。。

{/function}

{call name=函數(shù)名 [var…]=傳值}   #調(diào)用函數(shù),調(diào)用函數(shù)的代碼一定要放在函數(shù)定義代碼之后

{函數(shù)名 [var…]=傳值}    #也可以這樣調(diào)用
5、緩存
5.1 開啟緩存

smarty默認(rèn)是不開啟緩存的。需要進(jìn)行設(shè)置才能開啟緩存。緩存狀態(tài)的設(shè)置需要在display或者fetch模板之前使用。
確定緩存目錄是否存在,是否具有足夠的權(quán)限,設(shè)置緩存目錄查看3.4。

$smarty->getCaching()    #檢查當(dāng)前是否開啟了緩存

$smarty->setCaching(true) #開啟緩存

$smarty->isCached($template, $cache_id = null, $compile_id = null)
#檢查指定條件的模板文件(名稱/緩存id/編譯id)是否被緩存(有緩存文件,且在緩存有效時(shí)間內(nèi))

$smarty->setcache_lifetime(60);   #設(shè)置當(dāng)前的緩存時(shí)間

$smarty->getcache_lifetime();     #獲得當(dāng)前的緩存時(shí)間,默認(rèn)是3600(1個(gè)小時(shí))

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

運(yùn)行display/fetch就會(huì)在緩存目錄中產(chǎn)生緩存文件。再次訪問時(shí),只要存在該緩存文件,
且在緩存文件的生命周期之內(nèi)就會(huì)直接調(diào)用該緩存文件,而不需要重新編譯。

$smarty->cache->clearAll($exp_time = null, $type = null)    #清除所有緩存文件,
$exp_time指定一個(gè)以秒為單位的最小時(shí)間,超過這個(gè)時(shí)間的緩存都將被清除掉

$smarty->cache->clear($template_name, $cache_id = null, $compile_id = null, $exp_time = null, $type = null)   #清除指定條件的緩存文件

可以單設(shè)某個(gè)條件或者組合多個(gè)條件刪除多個(gè)緩存文件,比如

$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 局部不緩存

緩存是一種高效訪問的理想方式,但是對(duì)整個(gè)頁面進(jìn)行緩存的時(shí)候,
有時(shí)候局部的一些元素不希望被緩存,比如時(shí)間、實(shí)時(shí)變化的信息等。

局部緩存有幾種方法。

1、nocache屬性

$smarty->assign/append($tpl_var, $value = null, $nocache = true …)
#中規(guī)定nocache = true,則模板中該變量各處均不緩存

{$foo nocache=true}   #不管前面如何設(shè)置,則該處變量被緩存

{time() nocache}   #函數(shù)也可以,nocache等同于nocache=true

模板中聲明的變量和配置文件分配的變量不使用nocache,因?yàn)橐淖兯麄兊闹担?br />需要編輯模板和配置文件,因?yàn)槟0逦募团渲梦募薷木蜁?huì)重新生成緩存文件。

2、insert函數(shù)

Insert內(nèi)部不受緩存影響,但是如果給insert傳參,請確保參數(shù)不被緩存,詳情查看4.4.7

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

代碼塊不緩存。代碼塊中可以放入變量和自定義模板函數(shù),自定義函數(shù)的定義部分代碼可以不放入,
但是調(diào)用代碼必須放入,否則會(huì)緩存。insert函數(shù)不起作用。
5.3 單頁面多緩存

有時(shí)候,我們希望單個(gè)頁面有多個(gè)緩存頁面。比如index?id=1和index?id=2可能頁面內(nèi)容不同,
希望分別保存在不同的緩存文件中,所以這里我們需要設(shè)定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']);

這樣為每個(gè)由id值創(chuàng)建的網(wǎng)頁都生成對(duì)應(yīng)緩存文件,當(dāng)id無值時(shí)(index.php),
直接生成一個(gè)緩存文件(名稱),當(dāng)id=1時(shí)(index.php?id=1),將生成另一個(gè)緩存文件(1^名稱)。
5.4 緩存集合

實(shí)際上是多個(gè)值的不同組合換來的不同頁面,比如index.php?id=2&sid=3,沒種組合可能產(chǎn)生不同的頁面結(jié)果。

最開始可以使用連接字符串使id和sid的值連接,理論上將也不會(huì)出現(xiàn)重復(fù),
但是會(huì)出現(xiàn)這種情況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']);   #兩個(gè)變量之間用"|"隔開,
共同組成cache_id.有幾個(gè)變量最終文件名就有幾個(gè)"^",如果變量為空,則只有一個(gè)"^"

從php的安全考慮,對(duì)于傳過來的值要進(jìn)行校驗(yàn),去掉危險(xiǎn)的字符。
5.5 緩存處理函數(shù)

smarty允許自己定義緩存讀、寫和清除的方法,
比如不想用文件的形式進(jìn)行緩存處理可以寫一個(gè)有mysql進(jìn)行緩存讀、寫和清除的方法。

$smarty->Cache_handler_func=‘自定義函數(shù)名稱’

在3.0中好像不太好用了。
6、smarty語法高級(jí)篇
6.1 模板過濾器
6.1.1 預(yù)過濾器pre

預(yù)濾器用來在編譯之前直接處理模板源文件。預(yù)濾器函數(shù)的第一個(gè)參數(shù)是模板源文件,
該文件可能被其他一些預(yù)濾器修正過。此預(yù)濾器插件將返回修正過的源文件。
請記住此源文件僅用來編譯,它不會(huì)在任何地方被保存。

有兩種方式:

第一種是臨時(shí)注冊

$smarty->register->preFilter(‘mypre’);     #注冊一個(gè)預(yù)編譯器函數(shù)

$smarty->unregister->preFilter (‘mypre’);     #刪除一個(gè)預(yù)編譯器函數(shù)

function mypre($tpl_source, &$smarty)    
#在PHP文件中定義一個(gè)預(yù)編譯器函數(shù),參數(shù)格式固定,不可變,返回編譯數(shù)據(jù)

{

return "mypre<br />".$tpl_source;

}

第二種是載入組件

在smarty程序目錄中有l(wèi)ibs/plugins目錄,在這里我們可以創(chuàng)建自己的過濾器組件。

創(chuàng)建php文件,prefilter.函數(shù)名.php(本例中是prefilter.mypre.php)  #也可以用其他組件的php文件

function smarty_prefilter_mypre($source, $smarty)  
#在smarty組件文件中定義一個(gè)預(yù)編譯器函數(shù)組件,函數(shù)名稱和參數(shù)嚴(yán)格不變

{

    return "mypre_plus<br />".$source;

}

$smarty->autoload_filters = array(‘pre’=>array(‘mypre’));  #在php文件中調(diào)用組件過濾器

$smarty->autoload_filters = array()  #取消調(diào)入的組件過濾器

過濾器可以載入多個(gè),

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

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

$smarty->autoload_filters = array(‘pre’=>array(‘mypre’,'mypre1′));   #第二種方法,就是建立數(shù)組就行,在前面的先執(zhí)行。
6.1.2 后過濾器post

后濾器用來在編譯之后直接處理模板的編譯輸出(PHP代碼),
但須在編譯之后的模板被保存到文件系統(tǒng)之前就進(jìn)行操作。
預(yù)濾器函數(shù)的第一個(gè)參數(shù)是編譯之后的模板代碼,該代碼可能被其他一些后濾器修正過。
此后濾器插件將返回修正過的代碼文件。

有兩種方式:

第一種是臨時(shí)注冊

$smarty->register->postFilter(‘mypre’);     #注冊一個(gè)后編譯器函數(shù)

$smarty->unregister->postFilter (‘mypre’);     #刪除一個(gè)后編譯器函數(shù)

function mypost($tpl_source, &$smarty)    #在php文件中定義一個(gè)后編譯器函數(shù),
參數(shù)格式固定,不可變,返回編譯數(shù)據(jù)

{

return "mypost<br />".$tpl_source;

}

第二種是載入組件

在smarty程序目錄中有l(wèi)ibs/plugins目錄,在這里我們可以創(chuàng)建自己的過濾器組件。

創(chuàng)建php文件,postfilter.函數(shù)名.php(本例中是postfilter.mypost.php)  #也可以用其他組件的php文件

function smarty_postfilter_mypost($source, $smarty)   
#在smarty組件文件中定義一個(gè)預(yù)編譯器函數(shù)組件,函數(shù)名稱和參數(shù)嚴(yán)格不變

{

    return "mypost_plus<br />".$source;

}

$smarty->autoload_filters = array(‘post’=>array(‘mypost’));  #在php文件中調(diào)用組件過濾器

$smarty->autoload_filters = array(‘post’=>array())  #取消調(diào)入的組件過濾器

過濾器可以載入多個(gè),

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

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

$smarty->autoload_filters = array(‘post’=>array(‘mypost’,'mypost1′));   
#第二種方法,就是建立數(shù)組就行,在前面的先執(zhí)行。
6.1.3 輸出過濾器output

輸出過濾器插件的作用是,在裝載并執(zhí)行完一個(gè)模板之后顯示模板之前,操作該模板的輸出。

pre和post都會(huì)將過濾器加工后的結(jié)果硬編碼寫入編譯文件,
也就意味著pre和post始終會(huì)被緩存(即使php不緩存)。
output不會(huì),將不會(huì)寫入編譯文件以及之后的緩存文件,所以他是不被緩存的。

pre和post對(duì)于模板中調(diào)用的模板,比如include file,均需執(zhí)行一遍。
而output只對(duì)編譯后的文件執(zhí)行一次(也就是總共執(zhí)行一次)

有兩種方式:

第一種是臨時(shí)注冊

$smarty->register->outputFilter(‘myoutput’);     #注冊一個(gè)后編譯器函數(shù)

$smarty->unregister->outputFilter (‘mypre’);     #刪除一個(gè)后編譯器函數(shù)

function myoutput($tpl_source, &$smarty)    
#在php文件中定義一個(gè)后編譯器函數(shù),參數(shù)格式固定,不可變,返回編譯數(shù)據(jù)

{

return "myoutput<br />".$tpl_source;

}

第二種是載入組件

在smarty程序目錄中有l(wèi)ibs/plugins目錄,在這里我們可以創(chuàng)建自己的過濾器組件。

創(chuàng)建php文件,outputfilter.函數(shù)名.php(本例中是outputfilter.myoutput.php)  #也可以用其他組件的php文件

function smarty_outputfilter_myoutput($source, $smarty)   
#在smarty組件文件中定義一個(gè)預(yù)編譯器函數(shù)組件,函數(shù)名稱和參數(shù)嚴(yán)格不變

{

    return "myoutput_plus<br />".$source;

}

$smarty->autoload_filters = array(‘output’=>array(‘myoutput’));  #在php文件中調(diào)用組件過濾器

$smarty->autoload_filters['output'] = array()  #取消調(diào)入的組件過濾器

過濾器可以載入多個(gè),

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

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

$smarty->autoload_filters = array(‘output’=>array(‘myoutput’,'myoutput1′));   
#第二種方法,就是建立數(shù)組就行,在前面的先執(zhí)行。
6.2 錯(cuò)誤和異常
6.2.1 觸發(fā)錯(cuò)誤 trigger_error

php中也有trigger_error函數(shù)

Void trigger_error(string error_msg, [int level])   #int level就是錯(cuò)誤級(jí)別,也可以用常量代替,E_USER_NOTICE, E_USER_WARNING等。set_error_handler()函數(shù)進(jìn)行捕獲處理。

$smarty->trigger_error($error_msg, $error_type = E_USER_WARNING)   
#格式與PHP中的同名函數(shù)一樣,只能拋出$smarty的異常
6.2.2 錯(cuò)誤處理函數(shù)

$smarty->setExceptionHandler(handlerfuncname)   
# 設(shè)置異常處理的函數(shù),只可以處理有smarty引發(fā)的錯(cuò)誤,
不能解決trigger_error。set_error_handler()函數(shù)只能解決php的,而不能解決smarty拋出的錯(cuò)誤。

function handlerfuncname($errstr)

{

echo $errstr;

}
6.3 數(shù)據(jù)對(duì)象

3.0推出一個(gè)新的數(shù)據(jù)對(duì)象。可以從$smarty中創(chuàng)建一個(gè)或者多個(gè)數(shù)據(jù)對(duì)象,集中賦值,
然后有選擇性選取某個(gè)或者多個(gè)數(shù)據(jù)對(duì)象,生成模板。

$smarty->createData($parent = null)  #創(chuàng)建數(shù)據(jù)對(duì)象,可以選擇父對(duì)象,子對(duì)象將繼承父對(duì)象的賦值。

例子:

$mydata = $smarty->createData();  #創(chuàng)建一個(gè)數(shù)據(jù)對(duì)象,沒有父對(duì)象

$mydata1 = $smarty->createData($mydata);   #創(chuàng)建一個(gè)數(shù)據(jù)對(duì)象,父對(duì)象是$mydata

$mydata->assignByRef(‘a(chǎn)ssign_obj’,&$han);

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

$mydata1-> assign(‘name’,'bcds’);     #mydata1自動(dòng)繼承了mydata的數(shù)據(jù),如果相同,則新值覆蓋舊值

$smarty->display(‘templates/t4.tpl’,null,null,$mydata1);     
#顯示模板,最后一個(gè)參數(shù)必須有,指定模板使用哪個(gè)數(shù)據(jù)對(duì)象。也可以使用模板對(duì)象調(diào)用,參看6.4
6.4 模板對(duì)象

3.0同時(shí)推出一個(gè)新的模板對(duì)象??梢詮?smarty中創(chuàng)建一個(gè)或者多個(gè)模板對(duì)象,
模板對(duì)象可以自己分配變量,同時(shí)可以調(diào)用數(shù)據(jù)對(duì)象(父對(duì)象)來生成文件。

$smarty->createTemplate($template, $cache_id = null, $compile_id = null, $parent = null)   
#創(chuàng)建模板對(duì)象,可以選擇父對(duì)象,編譯id和緩存id。

例子:

$mytemplate = $smarty->createTemplate(‘templates/t4.tpl’);  #創(chuàng)建一個(gè)模板對(duì)象,沒有父對(duì)象,默認(rèn)為$smarty

$mytemplate1 = $smarty->createTemplate(‘templates/t4.tpl’,null,null,$mydata);  #創(chuàng)建一個(gè)模板對(duì)象,父對(duì)象為mydata,mydata中的數(shù)據(jù)自動(dòng)加載進(jìn)來。

$mytemplate->assignByRef(‘a(chǎn)ssign_obj’,&$han);    #定義變量

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

$mytemplate->display();            #生成文件。

如果一個(gè)模板是通過include方式調(diào)用的,則子模板的父對(duì)象將指向引用它的模板對(duì)象。

所有當(dāng)前模板變量和父對(duì)象的模板對(duì)象都是可以獲取的,但是如果是通過{assign}或者{$foo=…}
這樣的方法創(chuàng)建或者修改變量則它的作用域?qū)⒅煌A粼诋?dāng)前模板對(duì)象。
6.5 模板繼承

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

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塊。其他按照默認(rèn)繼承。

可以通過extends標(biāo)簽來指定被繼承的模板,并在子模板中通過重寫父模板的同名block塊,達(dá)到覆蓋的目的。
同時(shí),可以通過{$smarty.block.parent}獲取到父block的內(nèi)容。
在子模板中,所有在{block} … {/block}之外的內(nèi)容都將被忽略,這種繼承支持多文件,多重繼承,
意味著可以無限的繼承下去。還可通過{block}的append和prepend屬性來插入父模板結(jié)構(gòu)中
6.6 資源相關(guān)內(nèi)容(未寫)
6.7 動(dòng)態(tài)注冊組件

注冊可以理解為是動(dòng)態(tài)的注冊組件,與寫死到文件中的組件類似,參考6.8
6.7.1 注冊對(duì)象

SMARTY允許通過模板訪問PHP對(duì)象。有兩種方式來訪問它們。

一種是注冊對(duì)象到模板,然后通過類似于用戶自定義函數(shù)的形式來訪問它。

$smarty->register->templateObject($object_name, $object_impl, $allowed = array(),
$smarty_args = true, $block_methods = array())
  #向模板注冊一個(gè)對(duì)象,allowed是允許接受的方法。

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

{reg_obj->show var=2 var1=3}   #在模板中訪問,注意!接受的參數(shù)是數(shù)組,跟insert類似

$smarty->unregister->templateObject($object_name)    #注銷對(duì)象

第一種方法有一個(gè)很好的模板語法,同時(shí)它作為一個(gè)注冊對(duì)象被限制為幾個(gè)固定的方法和目標(biāo),
這樣是比較安全的,但是他只能夠調(diào)用對(duì)象方法,而且不支持?jǐn)?shù)據(jù)對(duì)象和模板對(duì)象。

另一種方法給模板分配對(duì)象,然后通過訪問其它賦值變量類似的方法進(jìn)行訪問。

$mysmarty->assignByRef(‘a(chǎn)ssign_obj’,&$han);     #建議使用引用分配,對(duì)象一般都很大,節(jié)省內(nèi)存

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

這種方法可以調(diào)用對(duì)象的屬性。而且可以用數(shù)據(jù)對(duì)象和模板對(duì)象注冊
6.7.2 注冊塊

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

用來動(dòng)態(tài)注冊/定義塊函數(shù)插件。前兩個(gè)參數(shù)指定塊函數(shù)名稱和執(zhí)行函數(shù)的名稱。
執(zhí)行函數(shù)的名稱格式可以是一個(gè)包含函數(shù)名稱的字符串;
也可以是一個(gè)array(&$object, $method)數(shù)組形式,其中&$object是一個(gè)對(duì)象的引用,而$method是它的一個(gè)方法;
還可以是一個(gè)array(&$ class, $method)數(shù)組形式,其中$class是一個(gè)類的名稱,$method是類

中的一個(gè)方法。

$cacheable,如果啟用頁面緩存,塊級(jí)函數(shù)是否緩存,默認(rèn)是true。

$cacheattr,如果$cacheale為false,也就是塊級(jí)函數(shù)不緩存,可以設(shè)置塊級(jí)函數(shù)中的部分屬性緩存,已數(shù)組定義。

例子:

$hanobj = new han();

$smarty->setcaching(true);

$smarty->register->block(‘hhh’, array(&$hanobj,’myf’),false,array(‘fn’));   #動(dòng)態(tài)注冊塊

class han{

。。。。。。

public function myf($params,$content,&$smarty,&$repeat){   #定義塊引用的函數(shù)

return "這是".$params['fn'].$params['un']."注釋說明!<br />\r\n".$content;

}

}

{hhh fn=$name un=$name1}     #在模板中調(diào)用,塊級(jí)內(nèi)容沒有被緩存,屬性fn被緩存

aaaaaaa

{time()}

{/hhh}

$smarty->unregister->block($block_tag)   #注銷塊
6.7.3 注冊函數(shù)

$smarty->register->compilerFunction($compiler_tag, $compiler_impl, $cacheable = true)  
#注冊編譯函數(shù),編譯函數(shù)不能指定緩存屬性

$smarty->register->templateFunction($function_tag, $function_impl, $cacheable = true, $cache_attr = array())    
#注冊模板函數(shù),3.0后可以直接在模板中定義函數(shù)了,不需要注冊

動(dòng)態(tài)注冊模板函數(shù)插件,前兩個(gè)參數(shù)是模板函數(shù)名稱和執(zhí)行函數(shù)名稱。
執(zhí)行函數(shù)的格式可以是一個(gè)包含函數(shù)名稱的字符串;也可以是一個(gè)array(&$object, $method)數(shù)組形式,
其中&$object是一個(gè)對(duì)象的引用,而$method是它的一個(gè)方法;
還可以是一個(gè)array(&$ class, $method)數(shù)組形式,
其中$class是一個(gè)類的名稱,$method是類中的一個(gè)方法。

例子:

$hanobj = new han();

$smarty->setcaching(true);

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

class han{

     …………….

public function myf($params,&$smarty,&$repeat){   #注冊的函數(shù)只有3個(gè)參數(shù)

return time()."這是".$params['fn'].$params['un']."注釋說明!<br />\r\n";

}

}

{hhh fn=$name un=$name1}   #在模板中調(diào)用,函數(shù)沒有被緩存,屬性fn被緩存

$smarty->unregister->compilerFunction($compiler_tag)   #注銷注冊函數(shù)

$smarty->unregister->templateFunction($function_tag)
6.7.4 注冊變量調(diào)節(jié)器

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

動(dòng)態(tài)注冊調(diào)節(jié)器函數(shù)插件,前兩個(gè)參數(shù)是模板調(diào)節(jié)器名稱和執(zhí)行函數(shù)名稱。
執(zhí)行函數(shù)的格式可以是一個(gè)包含函數(shù)名稱的字符串;
也可以是一個(gè)array(&$object, $method)數(shù)組形式,其中&$object是一個(gè)對(duì)象的引用,
而$method是它的一個(gè)方法;還可以是一個(gè)array(&$ class, $method)數(shù)組形式,
其中$class是一個(gè)類的名稱,$method是類中的一個(gè)方法。

例子:

$hanobj = new han();

$smarty->setcaching(true);

$smarty->register->modifier(‘hhh’,array(&$hanobj,’myf’));  #注冊調(diào)節(jié)器

class han{

。。。。。。

public function myf($string) {

return time().$string;

}

}

{$name|hhh nocache=true}  # 在模板中調(diào)用,nocache為true,表示該變量不緩存

$smarty->unregister->modifier($modifier)    #注銷變量調(diào)節(jié)器
6.8 組件相關(guān)內(nèi)容
6.8.1 建立過濾器組件

請參考6.1.1 預(yù)過濾器pre

請參考6.1.2 后過濾器 post

請參考6.13 輸出過濾器 output
6.8.2 建立塊組件

在libs/plugins中創(chuàng)建塊組件文件block.塊名.php

function smarty_block_hhhh($params,$content,&$smarty,&$repeat)   #函數(shù)名稱格式要固定

{

return "這是".$params['fn'].$params['un']."注釋說明!<br />\r\n".$content;

}

{hhhh fn=$name un=$name1}     #在模板中調(diào)用

aaaaaaa

{time()}

{/hhhh}

與動(dòng)態(tài)注冊相比,不能規(guī)定塊緩存
6.8.3 建立函數(shù)組件

在libs/plugins中創(chuàng)建函數(shù)組件文件function.函數(shù)名.php

function smarty_function_hhhh($params,&$smarty,&$repeat){    #在組建文件中建立函數(shù)

return time()."這是".$params['fn'].$params['un']."注釋說明!<br />\r\n";

}

{nocache}

{hhhh fn=$name un=$name1}     #在模板中調(diào)用,如果想不緩存,可以用{nocache}括住

{/nocache}
6.8.4 建立變量調(diào)節(jié)器組件

在libs/plugins中創(chuàng)建調(diào)節(jié)器組件文件modifier.調(diào)節(jié)器名.php

function smarty_modifier_hhhh($string)       #在組建文件中建立調(diào)節(jié)器函數(shù)

{

return time().$string;

}

{$name|hhhh nocache=true}   #在模板中調(diào)用
6.8.5 建立insert函數(shù)組件

在libs/plugins中創(chuàng)建調(diào)節(jié)器組件文件insert.函數(shù)名.php

function smarty_insert_hhhh($params,&$smarty){  #在組件文件中建立insert函數(shù)

return time()."這是".$params['fn']."|".$params['un']."注釋說明!<br />\r\n";

}

{insert name="hhhh" fn=$name un=$name1}   #在模板中調(diào)用函數(shù)內(nèi)部不緩存,但是傳遞的參數(shù)會(huì)緩存。

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI