PHP开发必备PHP模版引擎Dwoo深入学习

在上一篇关于Dwoo的教程中(PHP开发必备 一步步学PHP模版引擎Dwoo),我们讨论了Dwoo中的基本用法。在本文中,我们将进一步讲解在Dwoo中的一些高级用法,比如插件机制的编写以及如何跟常见的PHP框架整合。

为甘南等地区用户提供了全套网页设计制作服务,及甘南网站建设行业解决方案。主营业务为成都网站制作、成都做网站、甘南网站设计,以传统方式定制建设网站,并提供域名空间备案等一条龙服务,秉承以专业、用心的态度为用户提供真诚的服务。我们深信只要达到每一位用户的要求,就会得到认可,从而选择与我们长期合作。这样,我们也可以走得更远!

一、Dwoo中模版的继承

Dwoo的其中一个强大功能是它可以支持模版的继承。这实现起来是十分简单的,只需要定义好一个父模版,然后子模版则可以继承父模版了,并且可以在子模版中定义多种新的特性。聪明的开发者会善于利用这个特性,去减少重复的劳动。

Dwoo中继承模版的关键在于“扩展”的插件机制,它允许模版去继承另外一个模版。为了更好地理解这一特性,我们举个例子说明如下。假设目前你已经有一个基类的模版,名字叫base.tpl,其中包含了两个区域,一个是导航区,一个是内容区,如下:

 
 
 
 
  1.  
  2. {block "nav"}
  3. {/block}
  4. {block "content"}
  5. This is content for the main page.
 
  • {/block}
  • 现在,假设你的一些页面需要使用水平导航条,你只需要继承基类模版页即可,并且可以重新定义导航条的样式,如下代码,我们把这个代码定义为child.tpl:

     
     
     
     
    1. {extends "base.tpl"}
    2. {block "nav"}
    3. Home | 
    4. News |
    5. Weather |
    6. Hotels |
    7. Dining
  • {/block}
  • 这里使用了{extends “base.tpl”}指出是继承了父类的模版,并且在这里的{block “nav”}区域中,重写了导航条的内容,最后输出为如下图:

    现在我们考察另外一种情况,假设一些页面中需要额外的子导航菜单,比如需要以垂直形式显示导航条,这时,我们可以采用如下代码:

     
     
     
     
    1. {extends "child.tpl"}
    2. {block "nav"}
    3. {$dwoo.parent}
    4. {$subtitle}

      • {loop $items}
      • {$item}
      •  
      • {/loop}
     
  • {/block}
  • {block "content"}
  • This is content for the Dining page.
  • {/block}
  • 在这里,使用了{$dwoo.parent}去调用了父类模版,注意这里是继承了child.tpl这个模版,也就是说,调用了父类模版中的导航条中的内容,并且这里又重新定义了一个垂直的导航条,注意这里还重写了content区域的内容,覆盖了父模版中对应的content区域的内容了,结果如下图:

    可以看到,只要适当使用模版继承,则可以大大方便开发。

    #p#

    二、子模版

    Dwoo支持子模版,这些子模版使得开发者可以在应用中重用它们。子模版的创建方法是使用标签{template}….{/template},其中要提供唯一的名称,以便在其他地方进行引用。而在其他地方引用子模版,可以使用”load template”标签加载。

    子模版中可以传递多个参数,下面直接看例子以方便理解。首先编写一个子模版,名称叫slave.tpl,代码如下:

     
     
     
     
    1. {template mylist data}
      • {foreach $data d}
      • {$d}
      • {/foreach}
    2. {/template}

    这里,我们把这个子模版命名为mylist,其中有一个循环取读取data变量中的值并输出。

    有了子模版后,我们就可以在需要其的地方加载它,比如,在一个模版文件master.tpl中,可以这样调用:

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

    这里用load_templates加载slave.tpl的子模版,并且为子模版mylist赋值items变量,而items变量可以由如下代码去赋值:

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

    可以看到输出如下:

    可以看到,子模版的确十分方便使用,而且子模版中的内容一旦变更,其他所有用到子模版地方的内容也会接着变化。

    #p#

    三、编写自己的插件

    Dwoo中的一个前大功能是能可以让开发者编写插件,并通过Dwoo的addplugin机制加载自己写的类,现举一个简单例子说明。比如下面的代码,封装了对email的操作:

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

    在这个例子中,我们想将用户EMAIL中的象@,分隔符等符号用英文替换掉,这样防止象网上机器人等去采集EMAIL,泄露私隐。其中fix_address方法为替换的方法。而通过dwoo中的addPlugin方法,命名一个插件,名字为email_safe,而插件的内容则指定为fix_address方法。在使用这个插件时,可以如下使用,plugin.tpl内容为:

     
     
     
     
    1. {email_safe($string)}

    下图为输出结果:

    而另外一种使用dwoo插件的方法为继承Dwoo_Filter abstract class,如下:

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

    如果用这种方式的话,则可以把该文件保存在dwoo目录下的plugins目录下,则dwoo的自动加载机制会自动加载这个插件,而不用每次使用时都使用addplugin的功能。

    #p#

    四、DWOO的过滤器

    同样,dwoo中也支持用户编写过滤器,它可以在模版内容向用户输出前进行一些相关的操作,跟插件类似,可以使用addFilter()加载自己编写的过滤器,例子如下:

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

    这个例子的过滤器中,作用是自动把模版合成输出后的内容中的含有的邮件地址自动加上mailto:的邮件链接。结果如下输出:

    同样,也可以这样写:

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

    把该文件保存在dwoo下的plugins目录中,同样DWOO会自动加载。

    #p#

    五、DWOO中的缓存

    Dwoo中已经内置了很好的缓存功能,大大提高了效率,下面讲解使用dwoo缓存的步骤:

    1. 在Dwoo_Template_File的构造函数中,设定cache的名称和缓存时间。

    2. 在isCached()方法中,编写相关的模版生成代码,并且当缓存存在的时候,直接返回缓存中的页面。

    下面举一个搜索Twitter中信息的例子来说明如何使用缓存:

     
     
     
     
    1. ...
    2. div.outer {...}{
    3. border-bottom: dashed orange 1px;
    4. padding: 4px;
    5. clear: both;
    6. height: 50px;
    7. div.img {...}{
    8. float:left;
    9. padding-right: 2px;
    10. }
    11. span.attrib {...}{
    12. font-style: italic;
    13. }
    14.  
    15. {$title}

    16. {loop $records}
    17. {$tweet} 
       By {$owner} on {$time}
    18.  
    19. {/loop}

    上面的模版是循环输出在Twitter中检索输出的微博内容。接下来看处理模版的PHP程序,如下:

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

    上面的PHP代码中,首先是用isCached()方法,判断缓存中是否有该文件,如果有的话则直接读取缓存中已经合成好的页面文件显示给用户,否则的话调用twitter的Atom公开API接口去查询关键字pasta,再输出到页面。输出结果如下图:

    同时注意,$tpl = new Dwoo_Template_File('tmpl/tweets.tpl', 120, 'id_g75430i472j');中,第2个参数是缓存的过期时间,为120秒,第3个参数是缓存的名称,而且该名称在应用中必须是唯一的。

    标题名称:PHP开发必备PHP模版引擎Dwoo深入学习
    转载源于:http://www.shufengxianlan.com/qtweb/news44/288044.html

    网站建设、网络推广公司-创新互联,是专注品牌与效果的网站制作,网络营销seo公司;服务项目有等

    广告

    声明:本网站发布的内容(图片、视频和文字)以用户投稿、用户转载内容为主,如果涉及侵权请尽快告知,我们将会在第一时间删除。文章观点不代表本网站立场,如需处理请联系客服。电话:028-86922220;邮箱:631063699@qq.com。内容未经允许不得转载,或转载时需注明来源: 创新互联

    猜你还喜欢下面的内容

    虚拟主机知识

    同城分类信息