亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 學院 > 開發設計 > 正文

ThinkTemplate模板引擎的設計和使用方法

2019-11-11 03:26:06
字體:
來源:轉載
供稿:網友

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

  一、ThinkTemplate介紹

  ThinkTemplate是一個使用了xml標簽庫技術的編譯型模板引擎,支持兩種類型的模板標簽,使用了動態編譯和緩存技術,而且支持自定義標簽庫。ThinkTemplate作為 ThinkPHP框架的一個模板引擎插件提供,也可以獨立使用,因為ThinkPHP本身的設計是可以靈活替換模板引擎的。

  ThinkTemplate模板引擎的運作過程如圖所示:

  ThinkTemplate的使用方法非常簡單,直接創建ThinkTemplate對象后進行模板變量賦值然后進行渲染輸出就行,然后就是定義模板標簽和輸出變量,和Smarty的用法比較類似。

  $tpl = new ThinkTemplate();

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

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

  如果在ThinkPHP框架中使用的話,無需創建ThinkTemplate對象,Action類會自動創建,只需要賦值并輸出就行了。

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

  $this->display();

  Smarty在渲染模板的時候必須指定模板文件名,在ThinkTemplate中如果不指定模板文件名,會按照系統設置的規則進行自動定位,例如,當前模塊的某個操作可以定位成為以模塊名稱為目錄

  下面的一個操作命名的模板文件。在進行模板變量賦值的時候,可以對任何變量進行賦值,由模板標簽來決定輸出何種類型的。并且,賦值具有智能化和批量賦值,默認情況下第一個參數是要在模

  板中輸出的變量名稱,而第二個參數是變量的值,但是如果沒有指定第二個參數,那么會對第一個參數進行判斷,如果是索引數組,則自動進行批量賦值。例如:

  $tmpl = array();

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

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

  $this->assign($tmpl);

  $this->display();

  上面代碼會自動賦值兩個模板變量var1和var2,用來在模板文件中輸出。作為安全性考慮,沒有賦值的模板變量是不能用于輸出的,但是有些特殊的模板標簽可以輸出系統的常量和系統變量例外,這個我們后面會提到。

  二、主要特性

  當然評判模板引擎的優劣并不僅僅在于外表看來的使用方式,更關鍵的在于內在的功能和效率。ThinkTemplate模板引擎的主要特性包括:

   支持XML標簽庫技術和普通標簽定義;

   支持混合標簽定義;

   生成PHP模板緩存文件;

   模板文件更新后,自動更新模板緩存;

   自動定位當前操作的模板文件,無需指定;

   支持編碼轉換和Content-Type更換;

   支持模板變量輸出前綴,避免變量名稱沖突;

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

   支持變量組合調節器和格式化功能;

   支持標簽庫擴展模板功能;

  概括來看,我們可以從執行速度、模板功能和擴展性三個方面來分析。

  執行速度

  要準確判斷執行速度,首先要了解解釋型模板引擎和編譯型模板引擎的區別。

  所謂解釋型就是每次將模板內容讀入內存,并通過正則等方式分析字符串后對預置的標簽進行替換,每次加載模板都需要重復這個過程,tinybutstrong就屬于這種類型。而編譯型模板引擎是在第一次執行模板文件的時候進行一次編譯(相當于一次解釋分析過程),然后生成一個編譯后的緩存文件,下次執行的時候就可以直接執行緩存文件,無需再次編譯。所以,在速度上面,編譯型模板引擎在第一次運行模板的時候速度會比解釋性模板引擎略微緩慢,是因為有嚴格的編譯(包括生成緩存文件)過程,這個過程根據模板引擎的復雜程度和模板頁面標簽多少速度有所不同,而當第二次執行的時候,因為最耗時的過程已經跳過了,編譯型模板引擎的優勢就提現出來了。這也是編譯原理中所謂的“空間換時間”例子。目前大多數的模板引擎都采用編譯型,但是,是否為編譯型和模板功能并沒有直接關系,tinybutstrong雖然是解釋型但是功能也相當強大。

  ThinkTemplate也一樣屬于編譯型模板引擎,具備動態生成緩存文件的能力,無論是模板文件修改或者是緩存文件被刪除,系統都會重新生成緩存文件。你還可以設置模板緩存的有效時間,如每隔10分鐘重新編譯模板文件。并且在編譯模板文件的過程中,如果發現存在很多相同的標簽,ThinkTemplate并不會重復解析,而是會讀取解析緩存。因此,無論在解析還是執行上面,效率都是比較高的。

  模板功能

  模板引擎的一個重要因素就是模板標簽的功能。Smarty模板引擎以功能以強大而著稱,標簽的易用性和完善性也是模板引擎的關鍵因素之一,最基本的功能包括注釋、變量輸出、條件控制、包

  含文件,而這些功能的體現都是借助于一系列的模板標簽。這一部分是設計模板引擎的關鍵也是工作量比較大的地方。目前見到的模板引擎標簽大致分為特定標簽和XML標簽兩種類型。

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

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

  除了輸出模板變量之外,模板引擎通常都會提供一個特殊的標簽輸出方式用來輸出一些常量和系統變量,在ThinkTemplate采用 $Think 來輸出一些無需賦值的特殊或者內建變量,和Smarty的$smarty保留變量類似。

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

  基于某些兼容性考慮,通常在模板文件中可以直接插入php代碼,用來完成模板標簽所無法完成或者比較困難的功能。這種方式與標簽的互補可以滿足絕大多數的模板需要。事實上,我在用其他模板引擎的時候,都會經常在模板文件中直接添加一些個別的php代碼來輔助。需要注意的是并不是所有的模板引擎都支持在模板中直接寫php代碼。

  擴展性

  任何一個模板引擎的功能都不是為你量身定制的,具有一個良好的可擴展機制也是模板引擎的另外一個考量,Smarty采用的是插件方法來實現擴展,ThinkTemplate由于采用了標簽庫技術,比Smarty提供了更為強大的定制功能,和Java的TagLibs一樣可以支持自定義標簽庫和標簽,每個XML標簽都有獨立的解析方法,所以可以根據標簽庫的定義規則來增加和修改標簽解析規則。在ThinkTemplate中標簽庫的體現是采用XML命名空間的方式,

  例如:

  每個命名空間都有一個對應的標簽庫XML定義文件,并且還包含有一個用于解析該標簽庫的類文件。系統默認對cx標簽庫進行支持,所以在定義cx標簽庫的標簽時候,可以省略XML的命名空間前綴。當系統中存在很多的標簽庫的時候,每次編譯都會加載所有的標簽庫解析文件,這樣會造成一種浪費,因為很多情況,我們可能只是使用其中的一個或者二個標簽庫。所以,我們還必須在模板頁面實現標簽庫引入功能,來告訴模板引擎當前模板頁面需要哪些標簽庫的支持,從而加載需要的解析類。在ThinkTemplate中,使用tagLib標簽來實現這一功能,

  例如:,

  表示導入html和cx兩個標簽庫的支持。如果沒有定義,那么默認只是加載cx標簽庫。

  利用標簽庫的特性,我們可以非常方便地擴展自己需要的標簽,ThinkTemplate正是采用這種機制來內置集成了一些常用的HTML組件標簽,

  例如:

  

  使用上面的自定義XML標簽定義了一個DataGrid組件,省去了復雜的Html代碼,在模板第一次執行的時候,模板引擎會把上面的組件標簽解析成PHP和Html結合的代碼,生成緩存文件。ThinkTemplate中包含的Html標簽庫中封裝了很多有價值的Html組件。

  三、標簽使用

  變量輸出

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

  使用例子:

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

  {$number|number_format=2}

  在模板文件中可以使用{$info['name'] }來輸出數組變量。

  同樣,可以使用{$var.key }來輸出對象屬性變量,并且也支持函數。

  系統變量

  依然支持函數使用和大小寫、空格,以Think.打頭,如

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

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

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

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

  系統常量

  {$Think.const.__FILE__}

  {$Think.const.MODULE_NAME}

  或者直接使用

  {$Think.__FILE__}

  {$Think.MODULE_NAME}

  特殊變量

  由ThinkPHP系統定義的常量

  {$Think.version} //版本

  {$Think.now} //現在時間

  {$Think.template|basename} //模板頁面

  {$Think.LDELIM} //模板標簽起始符號

  {$Think.RDELIM} //模板標簽結束符號

  模板注釋

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

  格式:{/* 注釋內容 */ } 或 {// 注釋內容 }

  說明:在顯示頁面的時候不會顯示模板注釋,僅供模板制作的時候參考。

  注意:“{”和注釋標記之間不能有空格。

  包含模板

  當頁面需要包含公共文件的時候,可以通過下面的模板標簽,

  格式:{include:Filename }

  說明:Filename表示公共文件的名稱(不包含后綴,因為模板文件后綴為可配置),Filename

  默認在當前目錄下尋找,但是完全支持相對路徑訪問。

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

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

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

  {include:$include } 其中$include為一個模板變量。

  XML標簽

  基本上,XML標簽技術包含了普通模板有的功能,并且有了一些方面的增強和補充,更重要的一點是新的標簽庫技術更加具有擴展性。ThinkTemplate模板引擎內置了兩個標簽庫實現:CX和Html。

  要在模板頁面中使用TagLib標簽庫功能,需要在開始時候使用taglib 標簽導入需要使用的標簽,防止以后標簽庫大量擴展后增加解析工作量,用法如下:

  

  引入標簽庫后,就可以使用標簽庫定義的標簽來定義模板了,例如:

  //可以使用下面的模板標簽定義。

  

  

  

  

  

  標簽庫使用的時候忽略大小寫,因此下面的方式一樣有效:

  

  實際上,ThinkPHP框架模板引擎會默認加載CX標簽庫,所以下面的方式效果相同:

  

  并且,默認加載的CX庫可以不使用CX命名空間前綴,也就是說,

   等效于

  對于多重循環的定義也非常方便:

  

  

  {$sub.name}

  

  

  混合標簽結合使用例子:

  

  {$user.name}

  {$use.age}

  {$user.email}

  

  對于不太復雜的變量輸出,建議多采用{$var} 方式,因為單純從易用性方面而言,這種方式最簡潔,而且功能也比較完善。

  標簽庫標簽定義

  CX標簽庫

  CX標簽庫主要用于輸出ThinkPHP框架的變量、包含文件和實現一定控制判斷。主要有:

  include 包含文件支持的標簽屬性有 file;

  comment 模板注釋 無標簽屬性;

  iterate 迭代因子輸出,循環內可以結合 write 標簽,支持的標簽屬性有 id | name | offset | length | empty;

  write 復雜變量輸出,包括數組、對象,有函數支持,支持的標簽屬性有 name | PRoperty | key | format | function;

  volist 數據對象列表輸出,循環內可以結合 vo 標簽,支持的標簽屬性有 id | name | offset | length | empty;

  vo 數據對象輸出,支持的標簽屬性有 name | property | format | function;

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

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

  notequal 判斷是否不同;

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

  notpresent 判斷是否沒有定義;

  Html標簽庫

  Html標簽庫主要用于實現一些Html標記的動態生成和變量封裝,主要有:

  select 動態生成select列表;

  checkbox 動態生成checkbox;

  radio 動態生成radio;

  link 動態加載js或者CSS文件;

  imageLink 帶有鏈接的圖片;

  imageBtn 圖片按鈕;

  mulitSelect 多選組件;

  list DataGrid組件;

  四、總結

  作為一個模板引擎的設計,本文只是做一個概要的原理描述和簡單的使用,其中還有很多細節方面,例如優化解析效率、包含機制、安全考慮、特殊變量解析、異常處理等。更多關于ThinkTemplate的內容和標簽用法可以參考ThinkPHP的在線手冊中的相關部分。


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
日本高清视频精品| 久久久av亚洲男天堂| 国产欧美日韩专区发布| 欧美精品免费播放| 亚洲视频第一页| 亚洲精品白浆高清久久久久久| 国产成人精品久久亚洲高清不卡| 欧美日韩一区免费| 在线a欧美视频| 国产精品久久久久久av福利软件| 色无极影院亚洲| 精品中文字幕视频| 日本久久精品视频| 精品性高朝久久久久久久| 91国内免费在线视频| 国产精品免费久久久久久| 亚洲欧美日韩高清| 91精品国产777在线观看| 亚洲午夜激情免费视频| 日韩欧美亚洲综合| 欧美亚洲另类制服自拍| 国产91精品久| 自拍偷拍亚洲一区| 亚洲xxx自由成熟| 亚洲影院在线看| 亚洲级视频在线观看免费1级| 国产成人精品视| 亚洲国产高清自拍| 在线观看91久久久久久| 欧美在线观看网站| 国产成人精品视| 欧美激情在线观看| 亚洲免费成人av电影| 热门国产精品亚洲第一区在线| 日韩在线观看电影| 亚洲久久久久久久久久| 色综合老司机第九色激情| 日韩视频中文字幕| 亚洲一区www| 91久久精品日日躁夜夜躁国产| 一道本无吗dⅴd在线播放一区| 亚洲男子天堂网| 精品一区二区三区电影| 欧美高清在线视频观看不卡| 亚洲成年网站在线观看| 91av视频在线免费观看| 国产91热爆ts人妖在线| 日韩精品视频中文在线观看| 国产精品99久久久久久人| 成人免费网站在线看| 欧美日韩精品在线视频| 久久免费少妇高潮久久精品99| 精品夜色国产国偷在线| 国产成人精品久久二区二区| 日韩视频免费看| 欧美怡红院视频一区二区三区| 国产va免费精品高清在线观看| 日韩成人av在线播放| 91精品国产综合久久香蕉的用户体验| 久久精品久久久久久| 日本亚洲欧洲色| 日韩精品中文字幕在线观看| 久久香蕉国产线看观看网| 亚洲欧美变态国产另类| 亚洲xxx自由成熟| 亚洲天堂av网| 国产精品91免费在线| 日韩成人在线电影网| 亚洲成人网久久久| 国产精欧美一区二区三区| 欧美日韩亚洲视频| 日韩精品一区二区视频| 国产69精品99久久久久久宅男| 亚洲国产成人精品一区二区| 日韩欧美亚洲国产一区| 日韩av在线看| 欧美日韩免费在线| 亚洲国产欧美一区二区丝袜黑人| www.日韩视频| 国产精品一区二区久久久久| 久久久之久亚州精品露出| 日韩电影中文 亚洲精品乱码| 欧美精品日韩三级| 色婷婷av一区二区三区在线观看| 成人午夜激情免费视频| 亚洲成人a级网| 国产精品电影网站| 97视频在线播放| 国产精品白丝av嫩草影院| 国内精品美女av在线播放| 成人午夜一级二级三级| 欧美激情一区二区三区久久久| 欧美专区在线播放| 欧美激情在线狂野欧美精品| 日韩亚洲第一页| 国产精品一区=区| 国模精品视频一区二区三区| 亚洲精品午夜精品| 国产精品永久免费视频| 欧美日韩中文在线观看| 狠狠色狠狠色综合日日五| 亚洲图片在线综合| 久久99精品久久久久久噜噜| xxav国产精品美女主播| 国产精品美女久久久免费| 欧美日韩国产精品专区| 国产亚洲精品久久久久动| 麻豆国产精品va在线观看不卡| 一道本无吗dⅴd在线播放一区| 日韩精品在线电影| 亚洲爱爱爱爱爱| 97在线看免费观看视频在线观看| 国产aⅴ夜夜欢一区二区三区| 亚洲乱码av中文一区二区| 国产精品免费看久久久香蕉| 亚洲第一免费播放区| 久久99久久久久久久噜噜| 在线国产精品播放| 欧美在线精品免播放器视频| 亚洲精品狠狠操| 国内精品久久影院| 久久久久久美女| 国产精品久久久久久网站| 亚洲情综合五月天| 色妞欧美日韩在线| 亚洲r级在线观看| 久久福利视频网| 亚洲福利在线视频| 亚洲国产精品视频在线观看| 亚洲欧洲日本专区| 国产精品久久久久久久9999| 91av在线精品| 91香蕉嫩草神马影院在线观看| 日本精品在线视频| 日韩av片电影专区| 日韩av在线导航| 国a精品视频大全| 国产精品九九九| 91精品国产综合久久香蕉最新版| 色在人av网站天堂精品| 5252色成人免费视频| 国产精品久久色| www.日韩av.com| 亚洲视频视频在线| 韩国福利视频一区| 欧美色欧美亚洲高清在线视频| 97成人精品视频在线观看| 国产91在线播放九色快色| 91av在线国产| 狠狠躁天天躁日日躁欧美| 国产成人精品一区二区在线| 欧美性猛交xxxxx免费看| 日韩精品中文字| 欧美成人三级视频网站| 国产精品扒开腿做爽爽爽的视频| 全亚洲最色的网站在线观看| 日韩在线视频一区| 国产精品丝袜高跟| 精品久久久久久亚洲国产300| 98视频在线噜噜噜国产| 欧美日韩国产影院| 欧美日韩亚洲视频| 欧美日本啪啪无遮挡网站| 欧美午夜片欧美片在线观看|