成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

PHP開發(fā)必備 PHP模版引擎Dwoo深入學(xué)習(xí)

開發(fā) 后端
上一篇我們介紹了Dwoo的安裝、分析等基礎(chǔ)知識,本文將會為你介紹PHP模版引擎Dwoo的進(jìn)一步學(xué)習(xí),一起來看。

在上一篇關(guān)于Dwoo的教程中(PHP開發(fā)必備 一步步學(xué)PHP模版引擎Dwoo),我們討論了Dwoo中的基本用法。在本文中,我們將進(jìn)一步講解在Dwoo中的一些高級用法,比如插件機制的編寫以及如何跟常見的PHP框架整合。

一、Dwoo中模版的繼承

Dwoo的其中一個強大功能是它可以支持模版的繼承。這實現(xiàn)起來是十分簡單的,只需要定義好一個父模版,然后子模版則可以繼承父模版了,并且可以在子模版中定義多種新的特性。聰明的開發(fā)者會善于利用這個特性,去減少重復(fù)的勞動。

Dwoo中繼承模版的關(guān)鍵在于“擴(kuò)展”的插件機制,它允許模版去繼承另外一個模版。為了更好地理解這一特性,我們舉個例子說明如下。假設(shè)目前你已經(jīng)有一個基類的模版,名字叫base.tpl,其中包含了兩個區(qū)域,一個是導(dǎo)航區(qū),一個是內(nèi)容區(qū),如下:

  1. <html> 
  2. <head></head> 
  3. <body>   
  4. {block "nav"}  
  5. {/block}  
  6. {block "content"}  
  7. <div id="content"> 
  8. This is content for the main page.  
  9. </div>   
  10. {/block}  
  11. </body> 
  12. </html> 

現(xiàn)在,假設(shè)你的一些頁面需要使用水平導(dǎo)航條,你只需要繼承基類模版頁即可,并且可以重新定義導(dǎo)航條的樣式,如下代碼,我們把這個代碼定義為child.tpl:

  1. {extends "base.tpl"}  
  2. {block "nav"}  
  3. <div id="nav">  
  4. <a href="#">Home</a> |   
  5. <a href="#">News</a> |  
  6. <a href="#">Weather</a> |  
  7. <a href="#">Hotels</a> |  
  8. <a href="#">Dining</a>  
  9. </tr>  
  10. </table>  
  11. </div>  
  12. {/block

這里使用了{(lán)extends “base.tpl”}指出是繼承了父類的模版,并且在這里的{block “nav”}區(qū)域中,重寫了導(dǎo)航條的內(nèi)容,最后輸出為如下圖:

shuchujieguo

現(xiàn)在我們考察另外一種情況,假設(shè)一些頁面中需要額外的子導(dǎo)航菜單,比如需要以垂直形式顯示導(dǎo)航條,這時,我們可以采用如下代碼:

 

  1. {extends "child.tpl"}  
  2. {block "nav"}  
  3. {$dwoo.parent}  
  4. <div id="sub-nav">  
  5. <h2>{$subtitle}</h2>  
  6. <ul>  
  7. {loop $items}  
  8. <li><a href="#">{$item}</a></li>   
  9. {/loop}  
  10. </ul>  
  11. </div>   
  12. {/block}  
  13. {block "content"}  
  14. <div id="content">  
  15. This is content for the Dining page.  
  16. </div>  
  17. {/block

在這里,使用了{(lán)$dwoo.parent}去調(diào)用了父類模版,注意這里是繼承了child.tpl這個模版,也就是說,調(diào)用了父類模版中的導(dǎo)航條中的內(nèi)容,并且這里又重新定義了一個垂直的導(dǎo)航條,注意這里還重寫了content區(qū)域的內(nèi)容,覆蓋了父模版中對應(yīng)的content區(qū)域的內(nèi)容了,結(jié)果如下圖:

shuchujieguo

可以看到,只要適當(dāng)使用模版繼承,則可以大大方便開發(fā)。

#p#

二、子模版

Dwoo支持子模版,這些子模版使得開發(fā)者可以在應(yīng)用中重用它們。子模版的創(chuàng)建方法是使用標(biāo)簽{template}….{/template},其中要提供唯一的名稱,以便在其他地方進(jìn)行引用。而在其他地方引用子模版,可以使用”load template”標(biāo)簽加載。

子模版中可以傳遞多個參數(shù),下面直接看例子以方便理解。首先編寫一個子模版,名稱叫slave.tpl,代碼如下:

  1. {template mylist data}  
  2. <ul>  
  3. {foreach $data d}  
  4. <li>{$d}</li>  
  5. {/foreach}  
  6. </ul>  
  7. {/template} 

這里,我們把這個子模版命名為mylist,其中有一個循環(huán)取讀取data變量中的值并輸出。

有了子模版后,我們就可以在需要其的地方加載它,比如,在一個模版文件master.tpl中,可以這樣調(diào)用:

  1. {load_templates "slave.tpl"}  
  2. {mylist $items

這里用load_templates加載slave.tpl的子模版,并且為子模版mylist賦值items變量,而items變量可以由如下代碼去賦值:

  1. <?php  
  2. include 'dwooAutoload.php';  
  3. try {  
  4. $dwoo = new Dwoo();  
  5. $tpl = new Dwoo_Template_File('tmpl/master.tpl');  
  6. $data = array();   
  7. $data['items'] = array('red''blue''green''yellow');;  
  8. $dwoo->output($tpl$data);  
  9. } catch (Exception $e) {  
  10. echo "Error: " . $e->getMessage();   
  11. }  
  12. ?> 

可以看到輸出如下:

shuchujieguo

可以看到,子模版的確十分方便使用,而且子模版中的內(nèi)容一旦變更,其他所有用到子模版地方的內(nèi)容也會接著變化。

#p#

三、編寫自己的插件

Dwoo中的一個前大功能是能可以讓開發(fā)者編寫插件,并通過Dwoo的addplugin機制加載自己寫的類,現(xiàn)舉一個簡單例子說明。比如下面的代碼,封裝了對email的操作:

  1. <?php  
  2. function fix_address(Dwoo $dwoo$str) {  
  3. return str_replace(  
  4. array('@''.''-'),   
  5. array(' at '' dot '' dash '),   
  6. $str 
  7. );  
  8. }  
  9. include 'dwooAutoload.php';  
  10. try {  
  11. $dwoo = new Dwoo();  
  12. $tpl = new Dwoo_Template_File('tmpl/plugin.tpl');  
  13. $dwoo->addPlugin('email_safe''fix_address');  
  14. $data['string']= 'vikram@example.com';  
  15. $dwoo->output($tpl$data);  
  16. } catch (Exception $e) {  
  17. echo "Error: " . $e->getMessage();   
  18. }  
  19. ?> 

在這個例子中,我們想將用戶EMAIL中的象@,分隔符等符號用英文替換掉,這樣防止象網(wǎng)上機器人等去采集EMAIL,泄露私隱。其中fix_address方法為替換的方法。而通過dwoo中的addPlugin方法,命名一個插件,名字為email_safe,而插件的內(nèi)容則指定為fix_address方法。在使用這個插件時,可以如下使用,plugin.tpl內(nèi)容為:

  1. {email_safe($string)} 

下圖為輸出結(jié)果:

shuchujieguo

而另外一種使用dwoo插件的方法為繼承Dwoo_Filter abstract class,如下:

  1. <?php  
  2. class Dwoo_Plugin_email_safe extends Dwoo_Plugin  
  3. {   
  4. public function process($email)  
  5. {  
  6. return str_replace(  
  7. array('@''.''-'),   
  8. array(' at '' dot '' dash '),   
  9. $email 
  10. );  
  11. }  
  12. }  
  13. ?> 

如果用這種方式的話,則可以把該文件保存在dwoo目錄下的plugins目錄下,則dwoo的自動加載機制會自動加載這個插件,而不用每次使用時都使用addplugin的功能。

#p#

四、DWOO的過濾器

同樣,dwoo中也支持用戶編寫過濾器,它可以在模版內(nèi)容向用戶輸出前進(jìn)行一些相關(guān)的操作,跟插件類似,可以使用addFilter()加載自己編寫的過濾器,例子如下:

  1. <?php  
  2. function activate_mailto_links(Dwoo $dwoo$str) {  
  3. return preg_replace('/([a-zA-Z0-9]+@[a-zA-Z0-9._-]+\.[a-zA-Z]+)/''<a href="mailto:$1">$1</a>'$str);  
  4. }  
  5. include 'dwooAutoload.php';  
  6. try {  
  7. $dwoo = new Dwoo();  
  8. $dwoo->addFilter('activate_mailto_links');  
  9. $tpl = new Dwoo_Template_File('tmpl/filter.tpl');  
  10. $data['string']= 'Press enquiries: press@example-domain.com or call 1-800-1234. General inquiries: info@example-domain.com.';  
  11. $dwoo->output($tpl$data);  
  12. } catch (Exception $e) {  
  13. echo "Error: " . $e->getMessage();   
  14. }  
  15. ?> 

這個例子的過濾器中,作用是自動把模版合成輸出后的內(nèi)容中的含有的郵件地址自動加上mailto:的郵件鏈接。結(jié)果如下輸出:

shuchujieguo

同樣,也可以這樣寫:

  1. <?php  
  2. class Dwoo_Filter_activate_mailto_links extends Dwoo_Filter  
  3. {   
  4. public function process($str)  
  5. {  
  6. return preg_replace('/([a-zA-Z0-9]+@[a-zA-Z0-9._-]+\.[a-zA-Z]+)/''<a href="mailto:$1">$1</a>'$str);  
  7. }  
  8. }  
  9. ?> 

把該文件保存在dwoo下的plugins目錄中,同樣DWOO會自動加載。

#p#

五、DWOO中的緩存

Dwoo中已經(jīng)內(nèi)置了很好的緩存功能,大大提高了效率,下面講解使用dwoo緩存的步驟:

1. 在Dwoo_Template_File的構(gòu)造函數(shù)中,設(shè)定cache的名稱和緩存時間。

2. 在isCached()方法中,編寫相關(guān)的模版生成代碼,并且當(dāng)緩存存在的時候,直接返回緩存中的頁面。

下面舉一個搜索Twitter中信息的例子來說明如何使用緩存:

  1. <html> 
  2. <head> 
  3. <style type="text/css">...  
  4. div.outer {...}{  
  5. border-bottom: dashed orange 1px;  
  6. padding: 4px;  
  7. clear: both;  
  8. height: 50px;  
  9. }   
  10. div.img {...}{  
  11. float:left;  
  12. padding-right: 2px;  
  13. }  
  14. span.attrib {...}{  
  15. font-style: italic;  
  16. }  
  17. </style>   
  18. </head> 
  19. <body> 
  20. <h2>{$title}</h2> 
  21. {loop $records}  
  22. <div class="outer"> 
  23. <div class="img"><img width=48" height="48" src="{$image}" /></div> 
  24. <div>{$tweet} <br/> <span class="attrib">By <a href="{$uri}">{$owner}</a> on {$time}</span></div> 
  25. </div>   
  26. {/loop}  
  27. </body> 
  28. </html> 

上面的模版是循環(huán)輸出在Twitter中檢索輸出的微博內(nèi)容。接下來看處理模版的PHP程序,如下:

 

  1. <?php  
  2. include 'dwooAutoload.php';  
  3. $dwoo = new Dwoo();  
  4. $tpl = new Dwoo_Template_File('tmpl/tweets.tpl', 120, 'id_g75430i472j');  
  5. //檢查緩存中是否已經(jīng)存在該文件,存在的話,從緩存中顯示  
  6. if ($dwoo->isCached($tpl)) {  
  7. $dwoo->output($tplarray());  
  8. echo '(cached output)';  
  9. else {  
  10. //緩存中不存在,直接搜索twitter   
  11. $result = simplexml_load_file('http://search.twitter.com/search.atom?q=pasta&lang=en');  
  12. $records = array();  
  13. foreach ($result->entry as $entry) {  
  14. $item['image'] = (string)$entry->link[1]['href'];   
  15. $item['owner'] = (string)$entry->author->name;  
  16. $item['uri'] = (string)$entry->author->uri;  
  17. $item['tweet'] = (string)$entry->content;  
  18. $item['time'] = date('d M Y, h:i'strtotime($entry->published));   
  19. $records[] = $item;  
  20. }  
  21. $data = new Dwoo_Data();  
  22. $data->assign('records'$records);  
  23. $data->assign('title'$result->title);  
  24. $dwoo->output($tpl$data);   

上面的PHP代碼中,首先是用isCached()方法,判斷緩存中是否有該文件,如果有的話則直接讀取緩存中已經(jīng)合成好的頁面文件顯示給用戶,否則的話調(diào)用twitter的Atom公開API接口去查詢關(guān)鍵字pasta,再輸出到頁面。輸出結(jié)果如下圖:

shuchujieguo

同時注意,$tpl = new Dwoo_Template_File('tmpl/tweets.tpl', 120, 'id_g75430i472j');中,第2個參數(shù)是緩存的過期時間,為120秒,第3個參數(shù)是緩存的名稱,而且該名稱在應(yīng)用中必須是唯一的。

【編輯推薦】

  1. PHP開發(fā)程序應(yīng)該注意的42個優(yōu)化準(zhǔn)則
  2. PHP正則表達(dá)式 PHP中的正則函數(shù)
  3. PHP程序員突破成長瓶頸
  4. PHP中幾個常用的時間應(yīng)用方式
責(zé)任編輯:于鐵 來源: IT168
相關(guān)推薦

2011-05-19 10:39:12

2009-11-17 14:13:34

PHP配置

2009-11-16 16:31:56

PHP數(shù)組刪除

2009-11-17 11:14:14

PHP日期函數(shù)

2009-11-16 15:40:58

PHP數(shù)組函數(shù)

2011-07-07 16:24:09

Smarty

2011-05-12 13:57:59

PHP持續(xù)集成

2011-05-12 14:11:12

2010-07-14 13:18:40

Perl開發(fā)工具

2015-09-29 08:57:46

javascript對象

2020-03-23 14:15:51

RadonDB安裝數(shù)據(jù)庫

2010-08-31 13:06:45

CSS

2010-09-28 09:22:34

DOM模型Html

2015-09-29 09:27:04

JavaScript對象

2010-06-29 15:29:22

UML建模流程

2010-08-11 09:29:25

FlexJava數(shù)據(jù)模型

2010-09-25 14:38:18

Java內(nèi)存分配

2023-12-12 13:13:00

內(nèi)存C++編程語言

2019-07-08 20:00:35

Linux內(nèi)核模塊

2009-05-06 14:35:17

搜索引擎PHP技術(shù)
點贊
收藏

51CTO技術(shù)棧公眾號

主站蜘蛛池模板: 欧美精品一二三区 | 国产精品色 | 国产麻豆乱码精品一区二区三区 | 国产成人精品综合 | 亚洲va在线va天堂va狼色在线 | 9色网站| 欧美日韩三区 | 国产高清视频在线观看 | 一区二区三区视频在线观看 | 久久综合伊人一区二区三 | 国产精品久久99 | 亚洲免费影院 | 91大片| 久久久精彩视频 | 亚洲国产精品一区二区第一页 | 亚洲精品中文字幕在线 | 国产1区2区在线观看 | 一级欧美一级日韩片 | 国产成人综合在线 | 精品一区二区av | 99在线免费观看 | 日韩中文字幕在线免费 | 欧美日韩在线免费 | 最新国产精品精品视频 | 欧美日韩亚洲成人 | 久久久久久久久久久高潮一区二区 | 九九久久国产 | 国产一区二区三区在线 | 91久久精品一区二区二区 | 国产精品网址 | 日本一二三区在线观看 | 不卡一二区 | 欧美久久久网站 | 精品久| 国产亚洲精品区 | 中文字幕一区在线观看视频 | 99久久久久国产精品免费 | 黄色av网站在线观看 | 国产亚洲一区在线 | 亚洲综合在线视频 | 久久久久亚洲 |