使用模板引擎 (smarty 2.6.18)

昨天小蕊叫我調試錯誤,把整個網站丟過來,那裏面的HTML代碼海洋讓我看得七葷八素,鬱悶無比,已經很久沒有看到這樣的一大堆HTML混合少許PHP的代碼了。
其實PHP的層次升級過程就是不斷的分層、提煉、抽象的過程,一旦對某種模式稍微鞏固,就應該思考若是避開這種模式的缺陷。反正我到目前爲止,每當重複寫之前曾實現過的代碼時,一定要用比前次更好的方法(或另外的途逕)來實現,不然代碼寫得再多也只是量變,沒法產生質變
嘮叨完了,如今切入正題吧,此次試試採用問答式寫法。
一。什麼是模板?
使用模板引擎可使業務邏輯與顯示邏輯分開——這是很欠扁但也是網上公認的說法,呃,說得很準確,但估計只有會使用模板的人才能理解……其實剛開始大能夠簡單的理解模板爲「PHP與HTML代碼分離的方法」。
二。爲何要使用模板技術?
讓程序(PHP層)與顯示(HTML層)分離可使代碼更清晰易懂,要修改程序問題就去PHP層找,要改顯示問題就去HTML層改。更重要的是這樣的設計可讓不懂PHP的前臺美工也能修改頁面。若是不是很理解不要緊,你只要知道這是邁向其它高級開發模式的必經之路就能夠了。
三。有哪些模板技術?
我使用過PHPLIB庫中的模板類,後來又使用了smarty和smartyLight,也試過原生的PHP方式實現的模板,如今你們基本上都用smarty。PHP方式相對來講最容易實現,學得也快,但不適合團隊合做。
四。smarty廣被***的「弱點」
smarty的語法太複雜,學它簡直就是學一門新語言——其實你不須要複雜的功能,它就簡單得很,若是你須要它複雜的功能,那你應該感謝它!根據個人經驗,剛開始用一個東西,你們都喜歡簡潔精煉,但隨着應用的複雜,大多會抱怨它功能不足……
smarty有幾百K,它太大了,慢!——其實大小與速度不成正比,smarty有編譯緩存和靜態緩存機制,甚至能夠局部緩存
另外它的自定義插件用起來很是爽,modify,block等,我這幾天正用它的block來輸出頁面組件。
 五。下載,配置smarty
由於我後來一直用smarty的簡化版smartyLight,它們的語法大部分相同但也有不一樣,因此沒辦法把我如今的代碼搬出來以避免出錯,好吧,爲了寫這篇,我去下載完整版smarty。
下載2.6.18版的吧,最新的是2008的,不必定很穩定
其它目錄都刪了,保留libs目錄就能夠了,若是爲了學習能夠保留demo目錄。
六。實戰
使用模板引擎後,PHP代碼與模板分離了,通常寫一個應用都有PHP和HTML兩個頁面
PHP部分有三個部分組成:載入與配置、賦值、載入模板解析,其中第一部分是公用的,也就是放到公共頁裏之後都不須要再寫的。第三部分即dispay方法,就一行代碼,因此重點在第二部分。
(注:數組都分索引數組和關聯數組兩種來講明,索引數組即以數字爲鍵的數組,關聯數組是每一個鍵有個字符串名稱的數組,實在不理解就翻書去)
A。普通變量賦值與使用.
PHP代碼
  1. header('Content-Type:text/html;charset=utf-8');   
  2. require '../libs/Smarty.class.php';   
  3.   
  4. $smarty = new Smarty;   
  5.   
  6. $smarty->compile_check = true;   
  7. $smarty->debugging = false; //調試時設爲true   
  8.   
  9. //以上操做一般在包含頁裏,也就是說和數據庫連接那樣的操做相似,寫一次就好了,根本不用記   
  10. //下面是實際的代碼,PHP部分沒啥難的,各類類型的變量,數組,對象通通能夠用assign方法賦值給模板.   
  11. $smarty->assign("name","星野天河");                     //這句是第二部分。普通的變量   
  12. $smarty->display('index.tpl'); //載入模板  
 最後一句的display方法是載入默認模板目錄下的index.tpl模板,固然能夠修改默認的模板目錄。假如要改到abc目錄。(不要照抄啊,出錯我不負責)
PHP代碼
  1. $smarty->template_dir = '/abc/';  
模板部分(本例爲index.tpl文件)
XML/HTML代碼
  1. 普通變量的使用格式: {$name}<br>  
 這樣大括號中的內容會被上面11行定義的name值代替。使用這個你能夠把網頁標題,關鍵字,站長名字、圖片路徑、js路徑、網站根目錄、文檔根等信息都在包含頁裏直接賦值了(一次性操做),以後在模板裏任何地方能夠直接使用。路徑問題也不至於錯亂,修改起來也省事。
B。一維索引數組的賦值與使用
PHP代碼
  1. $smarty->assign("persons",array("星野天河","小蕊","天空","西",'奶瓶'));  
將數組丟給$persons變量,html中循環輸出數組有兩種格式。第一種以下
XML/HTML代碼
  1. {section name=item loop=$persons}   
  2.     {$persons[item]}<br>  
  3. {/section}  
section是smarty的循環結構, loop表示要循環哪一個變量,這裏是$persons這個變量(上面PHP代碼中賦值的數組),name表示循環中的每一項值用什麼表示,能夠隨便取名的,例如叫item,那下面就要用{$persons[item]}表示數組中的一個項。
不過我更習慣使用第二種模式——foreach循環,由於與PHP格式接近,容易理解,而且更重要的是——省代碼!效率也高些,記住下面的格式。
XML/HTML代碼
  1. {foreach item=person from=$persons}   
  2.     {$person}<br>  
  3. {/foreach}  
能夠理解爲把$persons數組拆開,每一項都丟進person變量中,與如下PHP代碼徹底同樣。因此,把section忘了吧。
PHP代碼
  1. foreach($persons as $person){   
  2.         echo $person;   
  3. }  
C。一維關聯數組
若是是一維相關數組的話,那更簡單,不須要使用循環了。
PHP代碼
  1. $smarty->assign("user",array('name'=>"星野天河",'iq'=>138, 'qq'=>15957674));    //一維相關數組的賦值  
XML/HTML代碼
  1. 一維關聯數組的使用: {$user.name}: {$user.iq} {$user.qq}  
看見了吧,簡單透頂,{$user.name}至關於PHP中的{$user['name']},這點和smarty簡化版不一樣(我更喜歡後者的格式{$user[name]}
D.二維索引數組
PHP代碼
  1. $smarty->assign("all"array(array(1,2,3,4,5), array(6,7,8,9,10), array(11,12,13,14,15)));   
XML/HTML代碼
  1. {foreach item=nums from=$all}   
  2.     {foreach item=num from=$nums}   
  3.         {$num}   
  4.     {/foreach}   
  5.     <br>  
  6. {/foreach}  
若是對操做PHP數組熟練,很容易理解這種循環鑲套,第一輪把$all二維數組中的每個元素拆到$nums變量中,第二輪再把$nums變量(這裏是一維數組了)拆開丟進$num變量中.
E。二維關聯數組的使用
PHP部分
PHP代碼
  1. $smarty->assign("guests"array(   
  2.        array("title" => "第一條留言的標題""content" => "第一條標題的內容""author" => "留言者小蕊"),           
  3.         array("title" => "第二條留言""content" => "今天帶筆了,要簽名的排隊""author" => "星野大叔"))   
  4. );  
實際的應用中,這個二維數組一般是數據庫輸出結果,因此爲了模板使用方便,用db類吧,直接輸出數組的那種.趕忙扔了那種wliel($row=mysql_fetch_assoc($rs)){ //一堆操做 }使用數據庫的方式.
迴歸正題,看一下模板裏怎麼用二維關聯數組吧.這回我不說累贅的section模式了.看foreach
XML/HTML代碼
  1. {foreach item=guest from=$guests}   
  2.     {$guest.title}<br>  
  3.     <p>{$guest.content}</p>  
  4.     留言者:{$guest.author}<br>  
  5. {/foreach}  
應該可以理解,將二維數組中的每個元素(一般是數據庫中的每一條記錄)扔進guest變量中,這個變量就是一維相關數組了,使用方式與一維相關數組徹底相同.
F.三維,四維……
二維及其以上的數組都分不清是索引仍是關聯數組了,極可能是混合型的,但都是以以一維數組的方式爲基的,只要理解數組的每一維屬於哪一種,用正常的方法解開(以上兩種方式之一)一層一層解開就好了,不要看到N維數組就頭痛。
呃說了一大堆,發現我只說數組,沒有說對象如何使用,這是由於我大多用數組的關係,對象的循環與數組同樣,只不過內部的使用格式不一樣罷了,可能{$item.id}變成{$item->id}這樣子,由於不多用對象模式輸出數據庫內容,又一直用smartyLight,因此smarty的記不清了,但要使用的時候上百度,一分鐘內就能找到答案。
 附:
通常默認配置就可使用了,但要更好的使用可能須要改一下配置。
PHP代碼
  1. $tpl->template_dir = __SITE_ROOT . "/templates/";    
  2. $tpl->compile_dir = __SITE_ROOT . "/templates_c/";    
  3. $tpl->config_dir = __SITE_ROOT . "/configs/";    
  4. $tpl->cache_dir = __SITE_ROOT . "/cache/";    
  5. $tpl->left_delimiter = '<{';    
  6. $tpl->right_delimiter = '}>';  
 template_dir是模板目錄,compile_dir是編譯目錄(不理解不要緊,但必須有這個目錄),最後兩個是模板中使用變量的包含符,能夠不用大括號以避開與js的衝突。這是由於js中有大括號
不過我仍是喜歡用大括號作包含符,由於簡單與習慣,也有辦法避開js衝突。例如
XML/HTML代碼
  1. <script>  
  2. {literal}   
  3. function abc(){   
  4.     //包含在{literal}中的代碼不會被模板引擎解析,因此js中的大括號就與模板的大括號無關了。   
  5. }   
  6. {/literal}   
  7. </script>  
  8.   
要注意只有在js中有大括號的時候才須要用literal包含,若是隻是外鏈的js就不須要了,由於沒有大括號。js的衝突與解決方法一樣適合於css代碼。改模板包含符仍是使用literal看你喜愛了
 
總結:
其實用smarty仍是很簡單的,只不過把使用變量的方式改一下、再用DB類直接輸出數組代替原來的過程式寫法(若是不這麼作,使用smarty會比較麻煩),重點就是記格式了,理解上沒有難點。
附帶說個很是有用的功能
XML/HTML代碼
  1. {include file="header.tpl" title=foo}  
 在模板中能夠用這個加載其它模板,並且你賦值的變量,在載入頁 (header.tpl)中仍然可使用,不像phplib模板類那樣還要再賦值。後面帶的參數任意,title=foo表示在header.tpl頁中,$title變量值改成foo,這頗有用,由於頭文件中,一般標題,關鍵字,css文件路徑要從新定義的。
以後的進階功能還有不少,不過作爲入門教程,這裏寫的已經能夠打發一段時間了,高級功能嘛,有朋友問的時候再寫,俺一貫比較懶
相關文章
相關標籤/搜索