国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁(yè) > 學(xué)院 > 開(kāi)發(fā)設(shè)計(jì) > 正文

ThinkTemplate模板引擎的設(shè)計(jì)和使用方法

2019-11-11 03:26:06
字體:
來(lái)源:轉(zhuǎn)載
供稿:網(wǎng)友

php開(kāi)發(fā)的過(guò)程中,我們會(huì)接觸到很多的模板引擎,包括FastTemplate、SmartTemplate、Smarty、tinybutstrong等,通常都是為了滿足MVC開(kāi)發(fā)模式的表現(xiàn)層需要,讓顯示和邏輯可以更好的分離(當(dāng)然,現(xiàn)在的模板引擎越做越強(qiáng)大,甚至開(kāi)始介入M)。    有了模板引擎,開(kāi)發(fā)者可以專(zhuān)注于程序代碼,設(shè)計(jì)者可以專(zhuān)注于頁(yè)面的布局和視覺(jué)效果,不必再擔(dān)心要在模板中嵌入各種程序代碼。本篇介紹了ThinkPHP內(nèi)置的一款模板引擎的設(shè)計(jì)原理和使用方法,以及和其它主流模板引擎的一些區(qū)別。

  一、ThinkTemplate介紹

  ThinkTemplate是一個(gè)使用了xml標(biāo)簽庫(kù)技術(shù)的編譯型模板引擎,支持兩種類(lèi)型的模板標(biāo)簽,使用了動(dòng)態(tài)編譯和緩存技術(shù),而且支持自定義標(biāo)簽庫(kù)。ThinkTemplate作為 ThinkPHP框架的一個(gè)模板引擎插件提供,也可以獨(dú)立使用,因?yàn)門(mén)hinkPHP本身的設(shè)計(jì)是可以靈活替換模板引擎的。

  ThinkTemplate模板引擎的運(yùn)作過(guò)程如圖所示:

  ThinkTemplate的使用方法非常簡(jiǎn)單,直接創(chuàng)建ThinkTemplate對(duì)象后進(jìn)行模板變量賦值然后進(jìn)行渲染輸出就行,然后就是定義模板標(biāo)簽和輸出變量,和Smarty的用法比較類(lèi)似。

  $tpl = new ThinkTemplate();

  $tpl -> assign(‘vo’,$vo);

  $tpl -> display(‘index.htm’);

  如果在ThinkPHP框架中使用的話,無(wú)需創(chuàng)建ThinkTemplate對(duì)象,Action類(lèi)會(huì)自動(dòng)創(chuàng)建,只需要賦值并輸出就行了。

  $this->assign(‘vo’,$vo);

  $this->display();

  Smarty在渲染模板的時(shí)候必須指定模板文件名,在ThinkTemplate中如果不指定模板文件名,會(huì)按照系統(tǒng)設(shè)置的規(guī)則進(jìn)行自動(dòng)定位,例如,當(dāng)前模塊的某個(gè)操作可以定位成為以模塊名稱(chēng)為目錄

  下面的一個(gè)操作命名的模板文件。在進(jìn)行模板變量賦值的時(shí)候,可以對(duì)任何變量進(jìn)行賦值,由模板標(biāo)簽來(lái)決定輸出何種類(lèi)型的。并且,賦值具有智能化和批量賦值,默認(rèn)情況下第一個(gè)參數(shù)是要在模

  板中輸出的變量名稱(chēng),而第二個(gè)參數(shù)是變量的值,但是如果沒(méi)有指定第二個(gè)參數(shù),那么會(huì)對(duì)第一個(gè)參數(shù)進(jìn)行判斷,如果是索引數(shù)組,則自動(dòng)進(jìn)行批量賦值。例如:

  $tmpl = array();

  $tmpl[‘var1’] = ‘value1’;

  $tmpl[‘var2’] = ‘value2’;

  $this->assign($tmpl);

  $this->display();

  上面代碼會(huì)自動(dòng)賦值兩個(gè)模板變量var1和var2,用來(lái)在模板文件中輸出。作為安全性考慮,沒(méi)有賦值的模板變量是不能用于輸出的,但是有些特殊的模板標(biāo)簽可以輸出系統(tǒng)的常量和系統(tǒng)變量例外,這個(gè)我們后面會(huì)提到。

  二、主要特性

  當(dāng)然評(píng)判模板引擎的優(yōu)劣并不僅僅在于外表看來(lái)的使用方式,更關(guān)鍵的在于內(nèi)在的功能和效率。ThinkTemplate模板引擎的主要特性包括:

   支持XML標(biāo)簽庫(kù)技術(shù)和普通標(biāo)簽定義;

   支持混合標(biāo)簽定義;

   生成PHP模板緩存文件;

   模板文件更新后,自動(dòng)更新模板緩存;

   自動(dòng)定位當(dāng)前操作的模板文件,無(wú)需指定;

   支持編碼轉(zhuǎn)換和Content-Type更換;

   支持模板變量輸出前綴,避免變量名稱(chēng)沖突;

   支持特殊模板變量和常量輸出;

   支持變量組合調(diào)節(jié)器和格式化功能;

   支持標(biāo)簽庫(kù)擴(kuò)展模板功能;

  概括來(lái)看,我們可以從執(zhí)行速度、模板功能和擴(kuò)展性三個(gè)方面來(lái)分析。

  執(zhí)行速度

  要準(zhǔn)確判斷執(zhí)行速度,首先要了解解釋型模板引擎和編譯型模板引擎的區(qū)別。

  所謂解釋型就是每次將模板內(nèi)容讀入內(nèi)存,并通過(guò)正則等方式分析字符串后對(duì)預(yù)置的標(biāo)簽進(jìn)行替換,每次加載模板都需要重復(fù)這個(gè)過(guò)程,tinybutstrong就屬于這種類(lèi)型。而編譯型模板引擎是在第一次執(zhí)行模板文件的時(shí)候進(jìn)行一次編譯(相當(dāng)于一次解釋分析過(guò)程),然后生成一個(gè)編譯后的緩存文件,下次執(zhí)行的時(shí)候就可以直接執(zhí)行緩存文件,無(wú)需再次編譯。所以,在速度上面,編譯型模板引擎在第一次運(yùn)行模板的時(shí)候速度會(huì)比解釋性模板引擎略微緩慢,是因?yàn)橛袊?yán)格的編譯(包括生成緩存文件)過(guò)程,這個(gè)過(guò)程根據(jù)模板引擎的復(fù)雜程度和模板頁(yè)面標(biāo)簽多少速度有所不同,而當(dāng)?shù)诙螆?zhí)行的時(shí)候,因?yàn)樽詈臅r(shí)的過(guò)程已經(jīng)跳過(guò)了,編譯型模板引擎的優(yōu)勢(shì)就提現(xiàn)出來(lái)了。這也是編譯原理中所謂的“空間換時(shí)間”例子。目前大多數(shù)的模板引擎都采用編譯型,但是,是否為編譯型和模板功能并沒(méi)有直接關(guān)系,tinybutstrong雖然是解釋型但是功能也相當(dāng)強(qiáng)大。

  ThinkTemplate也一樣屬于編譯型模板引擎,具備動(dòng)態(tài)生成緩存文件的能力,無(wú)論是模板文件修改或者是緩存文件被刪除,系統(tǒng)都會(huì)重新生成緩存文件。你還可以設(shè)置模板緩存的有效時(shí)間,如每隔10分鐘重新編譯模板文件。并且在編譯模板文件的過(guò)程中,如果發(fā)現(xiàn)存在很多相同的標(biāo)簽,ThinkTemplate并不會(huì)重復(fù)解析,而是會(huì)讀取解析緩存。因此,無(wú)論在解析還是執(zhí)行上面,效率都是比較高的。

  模板功能

  模板引擎的一個(gè)重要因素就是模板標(biāo)簽的功能。Smarty模板引擎以功能以強(qiáng)大而著稱(chēng),標(biāo)簽的易用性和完善性也是模板引擎的關(guān)鍵因素之一,最基本的功能包括注釋、變量輸出、條件控制、包

  含文件,而這些功能的體現(xiàn)都是借助于一系列的模板標(biāo)簽。這一部分是設(shè)計(jì)模板引擎的關(guān)鍵也是工作量比較大的地方。目前見(jiàn)到的模板引擎標(biāo)簽大致分為特定標(biāo)簽和XML標(biāo)簽兩種類(lèi)型。

  特定標(biāo)簽通常是比較常見(jiàn)的類(lèi)型,由模板引擎自身定義的一系列標(biāo)簽,用來(lái)滿足變量輸出和控制的需要,通常具有私有化規(guī)則,標(biāo)簽類(lèi)型各不相同,在ThinkTemplate里面,我們稱(chēng)之為普通模板標(biāo)簽。例如,Smarty中就是使用 {$varname} 來(lái)輸出PHP的$varname 變量,TinyButStrong則采用[var.tbl.item1]的方式輸出變量,我也曾看到過(guò)其它形式的輸出標(biāo)簽,例如{:=varname} ,當(dāng)然有些模板引擎是設(shè)計(jì)為可以定義起始標(biāo)簽的。ThinkTemplate的普通模板標(biāo)簽以“{”和“}”作為開(kāi)始和結(jié)束標(biāo)識(shí),和Smarty等大多數(shù)模板引擎是一致的,也支持起始標(biāo)簽定義,例如可以在項(xiàng)目配置文件中配置成采用 [$varname] 來(lái)輸出模板變量。

  ThinkTemplate中的變量輸出也具有Smarty的變量組合調(diào)節(jié)器的功能,例如{$articleTitle|upper|spacify} 。其中調(diào)節(jié)器方法可以是系統(tǒng)函數(shù)或者自定義函數(shù),在ThinkTemplate中還可以設(shè)置禁止在模板中使用的函數(shù)。也可以支持輸出多級(jí)對(duì)象屬性或者數(shù)組的輸出,例如:{$vo.name.sub} {$array[‘name’][‘sub’]}。

  除了輸出模板變量之外,模板引擎通常都會(huì)提供一個(gè)特殊的標(biāo)簽輸出方式用來(lái)輸出一些常量和系統(tǒng)變量,在ThinkTemplate采用 $Think 來(lái)輸出一些無(wú)需賦值的特殊或者內(nèi)建變量,和Smarty的$smarty保留變量類(lèi)似。

  和其他的模板引擎不同,ThinkTemplate的特定標(biāo)簽僅僅是用于變量輸出功能,而把控制功能和復(fù)雜的標(biāo)簽功能放到XML模板標(biāo)簽里面。XML模板引擎在java領(lǐng)域里面是非常常見(jiàn)的,在PHP模板引擎領(lǐng)域似乎并不多見(jiàn),但是ThinkTemplate在實(shí)現(xiàn)自身的特定標(biāo)簽外,還有效地借鑒了Java的標(biāo)簽庫(kù)技術(shù),實(shí)現(xiàn)了XML模板標(biāo)簽支持,并且允許自定義標(biāo)簽庫(kù)。兩種標(biāo)簽方式的結(jié)合使用,可以讓模板定義更加靈活,這也正是ThinkTemplate模板引擎的特色。

  基于某些兼容性考慮,通常在模板文件中可以直接插入php代碼,用來(lái)完成模板標(biāo)簽所無(wú)法完成或者比較困難的功能。這種方式與標(biāo)簽的互補(bǔ)可以滿足絕大多數(shù)的模板需要。事實(shí)上,我在用其他模板引擎的時(shí)候,都會(huì)經(jīng)常在模板文件中直接添加一些個(gè)別的php代碼來(lái)輔助。需要注意的是并不是所有的模板引擎都支持在模板中直接寫(xiě)php代碼。

  擴(kuò)展性

  任何一個(gè)模板引擎的功能都不是為你量身定制的,具有一個(gè)良好的可擴(kuò)展機(jī)制也是模板引擎的另外一個(gè)考量,Smarty采用的是插件方法來(lái)實(shí)現(xiàn)擴(kuò)展,ThinkTemplate由于采用了標(biāo)簽庫(kù)技術(shù),比Smarty提供了更為強(qiáng)大的定制功能,和Java的TagLibs一樣可以支持自定義標(biāo)簽庫(kù)和標(biāo)簽,每個(gè)XML標(biāo)簽都有獨(dú)立的解析方法,所以可以根據(jù)標(biāo)簽庫(kù)的定義規(guī)則來(lái)增加和修改標(biāo)簽解析規(guī)則。在ThinkTemplate中標(biāo)簽庫(kù)的體現(xiàn)是采用XML命名空間的方式,

  例如:

  每個(gè)命名空間都有一個(gè)對(duì)應(yīng)的標(biāo)簽庫(kù)XML定義文件,并且還包含有一個(gè)用于解析該標(biāo)簽庫(kù)的類(lèi)文件。系統(tǒng)默認(rèn)對(duì)cx標(biāo)簽庫(kù)進(jìn)行支持,所以在定義cx標(biāo)簽庫(kù)的標(biāo)簽時(shí)候,可以省略XML的命名空間前綴。當(dāng)系統(tǒng)中存在很多的標(biāo)簽庫(kù)的時(shí)候,每次編譯都會(huì)加載所有的標(biāo)簽庫(kù)解析文件,這樣會(huì)造成一種浪費(fèi),因?yàn)楹芏嗲闆r,我們可能只是使用其中的一個(gè)或者二個(gè)標(biāo)簽庫(kù)。所以,我們還必須在模板頁(yè)面實(shí)現(xiàn)標(biāo)簽庫(kù)引入功能,來(lái)告訴模板引擎當(dāng)前模板頁(yè)面需要哪些標(biāo)簽庫(kù)的支持,從而加載需要的解析類(lèi)。在ThinkTemplate中,使用tagLib標(biāo)簽來(lái)實(shí)現(xiàn)這一功能,

  例如:,

  表示導(dǎo)入html和cx兩個(gè)標(biāo)簽庫(kù)的支持。如果沒(méi)有定義,那么默認(rèn)只是加載cx標(biāo)簽庫(kù)。

  利用標(biāo)簽庫(kù)的特性,我們可以非常方便地?cái)U(kuò)展自己需要的標(biāo)簽,ThinkTemplate正是采用這種機(jī)制來(lái)內(nèi)置集成了一些常用的HTML組件標(biāo)簽,

  例如:

  

  使用上面的自定義XML標(biāo)簽定義了一個(gè)DataGrid組件,省去了復(fù)雜的Html代碼,在模板第一次執(zhí)行的時(shí)候,模板引擎會(huì)把上面的組件標(biāo)簽解析成PHP和Html結(jié)合的代碼,生成緩存文件。ThinkTemplate中包含的Html標(biāo)簽庫(kù)中封裝了很多有價(jià)值的Html組件。

  三、標(biāo)簽使用

  變量輸出

  格式:{$varname|function1|function2=arg1,arg2,### }

  使用例子:

  {$webTitle|md5| strtoupper | substr=0,3}

  {$number|number_format=2}

  在模板文件中可以使用{$info['name'] }來(lái)輸出數(shù)組變量。

  同樣,可以使用{$var.key }來(lái)輸出對(duì)象屬性變量,并且也支持函數(shù)。

  系統(tǒng)變量

  依然支持函數(shù)使用和大小寫(xiě)、空格,以Think.打頭,如

  {$Think.server.script_name} //輸出$_SERVER變量

  {$Think.session.session_id|md5} //輸出$_SESSION變量

  {$Think.get.pageNumber} //輸出$_GET變量

  {$Think.cookie.name} //輸出$_COOKIE變量

  系統(tǒng)常量

  {$Think.const.__FILE__}

  {$Think.const.MODULE_NAME}

  或者直接使用

  {$Think.__FILE__}

  {$Think.MODULE_NAME}

  特殊變量

  由ThinkPHP系統(tǒng)定義的常量

  {$Think.version} //版本

  {$Think.now} //現(xiàn)在時(shí)間

  {$Think.template|basename} //模板頁(yè)面

  {$Think.LDELIM} //模板標(biāo)簽起始符號(hào)

  {$Think.RDELIM} //模板標(biāo)簽結(jié)束符號(hào)

  模板注釋

  模板支持注釋功能,該注釋文字在最終頁(yè)面不會(huì)顯示,僅供模板制作人員參考和識(shí)別。

  格式:{/* 注釋內(nèi)容 */ } 或 {// 注釋內(nèi)容 }

  說(shuō)明:在顯示頁(yè)面的時(shí)候不會(huì)顯示模板注釋?zhuān)瑑H供模板制作的時(shí)候參考。

  注意:“{”和注釋標(biāo)記之間不能有空格。

  包含模板

  當(dāng)頁(yè)面需要包含公共文件的時(shí)候,可以通過(guò)下面的模板標(biāo)簽,

  格式:{include:Filename }

  說(shuō)明:Filename表示公共文件的名稱(chēng)(不包含后綴,因?yàn)槟0逦募缶Y為可配置),F(xiàn)ilename

  默認(rèn)在當(dāng)前目錄下尋找,但是完全支持相對(duì)路徑訪問(wèn)。

  例如,下面的格式都是正確的。{include:header } 和 {include:../public/header }。加載公共模板文件后,模板引擎會(huì)重新對(duì)該頁(yè)面中的模板標(biāo)簽進(jìn)行解析,有意思的是你還可以在公共模板中再次包含公共文件,但是一定要注意不能循環(huán)包含。

  例如,在header.html文件中包含了menu文件{include:menu },在index.html文件中則包含了header和footer,{include:header }, 這里是首頁(yè)的內(nèi)容{include:footer }

  在訪問(wèn)index操作方法的時(shí)候,模板首先讀取index文件,并開(kāi)始解析include:header,在解析header文件的過(guò)程中又遇到include:menu標(biāo)簽,又開(kāi)始解析,解析完成后再解析include:footer標(biāo)簽,在經(jīng)過(guò)幾層的嵌套包含解析后index文件最終被解析成一個(gè)緩存模板文件。而且,包含文件可以設(shè)置為變量,通過(guò)下面方式定義:

  {include:$include } 其中$include為一個(gè)模板變量。

  XML標(biāo)簽

  基本上,XML標(biāo)簽技術(shù)包含了普通模板有的功能,并且有了一些方面的增強(qiáng)和補(bǔ)充,更重要的一點(diǎn)是新的標(biāo)簽庫(kù)技術(shù)更加具有擴(kuò)展性。ThinkTemplate模板引擎內(nèi)置了兩個(gè)標(biāo)簽庫(kù)實(shí)現(xiàn):CX和Html。

  要在模板頁(yè)面中使用TagLib標(biāo)簽庫(kù)功能,需要在開(kāi)始時(shí)候使用taglib 標(biāo)簽導(dǎo)入需要使用的標(biāo)簽,防止以后標(biāo)簽庫(kù)大量擴(kuò)展后增加解析工作量,用法如下:

  

  引入標(biāo)簽庫(kù)后,就可以使用標(biāo)簽庫(kù)定義的標(biāo)簽來(lái)定義模板了,例如:

  //可以使用下面的模板標(biāo)簽定義。

  

  

  

  

  

  標(biāo)簽庫(kù)使用的時(shí)候忽略大小寫(xiě),因此下面的方式一樣有效:

  

  實(shí)際上,ThinkPHP框架模板引擎會(huì)默認(rèn)加載CX標(biāo)簽庫(kù),所以下面的方式效果相同:

  

  并且,默認(rèn)加載的CX庫(kù)可以不使用CX命名空間前綴,也就是說(shuō),

   等效于

  對(duì)于多重循環(huán)的定義也非常方便:

  

  

  {$sub.name}

  

  

  混合標(biāo)簽結(jié)合使用例子:

  

  {$user.name}

  {$use.age}

  {$user.email}

  

  對(duì)于不太復(fù)雜的變量輸出,建議多采用{$var} 方式,因?yàn)閱渭儚囊子眯苑矫娑裕@種方式最簡(jiǎn)潔,而且功能也比較完善。

  標(biāo)簽庫(kù)標(biāo)簽定義

  CX標(biāo)簽庫(kù)

  CX標(biāo)簽庫(kù)主要用于輸出ThinkPHP框架的變量、包含文件和實(shí)現(xiàn)一定控制判斷。主要有:

  include 包含文件支持的標(biāo)簽屬性有 file;

  comment 模板注釋 無(wú)標(biāo)簽屬性;

  iterate 迭代因子輸出,循環(huán)內(nèi)可以結(jié)合 write 標(biāo)簽,支持的標(biāo)簽屬性有 id | name | offset | length | empty;

  write 復(fù)雜變量輸出,包括數(shù)組、對(duì)象,有函數(shù)支持,支持的標(biāo)簽屬性有 name | PRoperty | key | format | function;

  volist 數(shù)據(jù)對(duì)象列表輸出,循環(huán)內(nèi)可以結(jié)合 vo 標(biāo)簽,支持的標(biāo)簽屬性有 id | name | offset | length | empty;

  vo 數(shù)據(jù)對(duì)象輸出,支持的標(biāo)簽屬性有 name | property | format | function;

  var 變量輸出,用于普通變量,支持的標(biāo)簽屬性有 name | format | function;

  equal 判斷是否相同,支持的標(biāo)簽屬性有 name | property | key | value | function;

  notequal 判斷是否不同;

  present 判斷是否定義 支持的標(biāo)簽屬性有 name | property | key;

  notpresent 判斷是否沒(méi)有定義;

  Html標(biāo)簽庫(kù)

  Html標(biāo)簽庫(kù)主要用于實(shí)現(xiàn)一些Html標(biāo)記的動(dòng)態(tài)生成和變量封裝,主要有:

  select 動(dòng)態(tài)生成select列表;

  checkbox 動(dòng)態(tài)生成checkbox;

  radio 動(dòng)態(tài)生成radio;

  link 動(dòng)態(tài)加載js或者CSS文件;

  imageLink 帶有鏈接的圖片;

  imageBtn 圖片按鈕;

  mulitSelect 多選組件;

  list DataGrid組件;

  四、總結(jié)

  作為一個(gè)模板引擎的設(shè)計(jì),本文只是做一個(gè)概要的原理描述和簡(jiǎn)單的使用,其中還有很多細(xì)節(jié)方面,例如優(yōu)化解析效率、包含機(jī)制、安全考慮、特殊變量解析、異常處理等。更多關(guān)于ThinkTemplate的內(nèi)容和標(biāo)簽用法可以參考ThinkPHP的在線手冊(cè)中的相關(guān)部分。


發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 藁城市| 龙陵县| 新绛县| 鄢陵县| 临颍县| 阿拉善右旗| 子洲县| 稷山县| 长乐市| 收藏| 苍梧县| 景东| 仪征市| 五莲县| 涟源市| 弥渡县| 青川县| 通海县| 理塘县| 濮阳市| 日照市| 祁连县| 乐业县| 白城市| 和田市| 建阳市| 华池县| 淮南市| 新津县| 翁牛特旗| 察雅县| 伊宁县| 沿河| 广水市| 姚安县| 广州市| 磴口县| 都兰县| 石狮市| 宁陕县| 珲春市|