发信人: jackyz() 
整理人: dalasthunder(2002-07-25 06:22:07), 站内信件
 | 
 
 
PHP3 之 FastTemplate
 
 当你在建立一个站点的时候,可能不得不面对以下现实:
 站点需要一名程序员来设计程序和一名网站设计者来组织页面。那么,是否有
 使两者很好的结合起来的方法呢?
 
 有的,就是使用模板(FastTemplate),这将会使你的工作更加轻松。
 
 下面解释一下使用模板的好处:
 
 1、在很短的时间内可以替换整个站点的外观
 2、使程序员可以抽象编程,而无须接触HTML代码
 3、速度非常之快
 4、可以重复利用以前的模板
 
 模板的来历:FastTemplate来自于同名的Perl软件包(在CPAN上可以找到)。
 它被移植到了PHP3平台上。你只需要一个基础类文件class.FastTemplate.php3
  
 先解释一下使用模板和使用echo或print命令建立html页面的区别,echo和
 print在编写短小的脚本时显得非常实用,但是做出来的脚本的组织性和可定制
  性不好,修改起来颇废工夫,模板在编写支持多国语种的站点时的效率则要高
 的多,如用echo和print可以想象工作量之大。
 
 不用担心,熟练使用FastTemplate会占去你一部分时间,但是这些时间会在你
 以后的工作中弥补回来,尤其是大工程时。
 
 那么,怎么使用FastTemplate呢?
 
 第一步,只需使用函数<?php $tpl = new FastTemplate( "path"); ?>,其中
 path指向template目录所在的路径。这句函数建立了一个$tpl对象,以后可以
 对它指定参数,进行处理或用来建立各种页面等等。
 
 FastTemplate是建立在这么一种理论基础之上的,即假定一个web页是由许多小
  的部分组成的。举例来说,如WEB页细分为TITLE、PAGE、FOOT等等。整个页被
 赋予一个变量名,每一个小部分又被赋予一个变量名,最小的不可分割的部分
 通常就是字符串了,它也被赋予一个变量名。具体处理的时候,是一层层的包
 含关系。被包含部分在上一层中以宏{NAME}的形式出现。最后经过一层层的向
 上输出,得到完整的页面。
 
 那么最底层的向字符串赋值的函数是什么呢,就是:
 
 <?php $tpl->assign(NAME, "text"); ?> 
 
 通过这个功能,FastTemplate将字符串text赋予了变量NAME,以后上一层就可
 替换宏{NAME}的内容为text。
 
 例如:
 
 $tpl->assign(NAME, "me"); 
 
 这就将变量NAME赋值了字符串"me"。
 
 第二步,$tpl需要知道其所调用的所有模板文件,即各个小部分。这个功能由
 define一个数组实现:
 <?php $tpl->define(); ?>
 
 例如:
 
 <?php $tpl->define(array(foo => "foo.tpl", bar => "bar.tpl")); ?>
 
 这说明总共包括了两个模板文件:foo.tpl和bar.tpl,并给它们指定了名字foo
  和bar。
  
 有了第一节的知识以后,你现在是否想试一试将模板文件中所包含的宏
 {MACROS}部分按照自己定义的变量替换呢?
 使用以下的命令即可实现:
 
 <?php
 
 $tpl->parse(PAGECONTENT, "foo"); 
 
 ?>
 
 这条命令的具体意义是:
 
 我们首先已经用assign定义了FOO模板中包含的若干宏变量,然后根据这些变量
  对模板文件FOO进行替换处理,并将替换后的模板文件赋予另一个变量名
 PAGECONTENT。
 
 完整如下:
 
 <?php
 
 $tpl->assign(NAME, "me"); 
 $tpl->parse(PAGECONTENT, "foo"); 
 
 ?>
 
 当然,我们还没有作完,因为bar模板文件才是WEB的主输出部分,BAR模板包含
  着FOO模板,BAR中还包含着宏变量{PAGETITLE}和{PAGECONTENT}等待处理,
 PAGECONTENT经过对FOO的处理已经得到,PAGETITLE还未指定,所以还要还要指
  定PAGETITLE,并调用函数
 <?php $tpl->parse(MAIN, "bar"); ?>
 进行处理,并将处理后的结果赋予变量MAIN。
 
 如下:
 
 <?php 
 
 $tpl->assign(PAGETITLE, "FooBar test"); 
 $tpl->parse(MAIN, "bar"); 
 
 ?>
 
 很简单吧,最后我们只需输出页面即可: 
 
 <?php 
 
 $tpl->FastPrint(MAIN); 
 
 ?>
 
 下面就是foo.tpl,bar.tpl与最终的demo.php3文件。
 请大家仔细琢磨琢磨:
 
 -------------------------------------------------------------
 foo.tpl 
 
 <!-- foo.tpl --> 
 This does not do anything obvious. Please look at {NAME}.
 
 -------------------------------------------------------------
 bar.tpl 
 
 <!-- bar.tpl --> 
 <HTML> 
 <HEAD><TITLE>Feature world - {PAGETITLE}</TITLE></HEAD> 
 <BODY BGCOLOR=BLACK TEXT=WHITE> 
 <H1>{PAGETITLE}</H1> 
 {PAGECONTENT} 
 </BODY> 
 </HTML>
 
 ------------------------------------------------------------
 demo.php3 
 
 <?php 
 
 include "class.FastTemplate.php3"; 
 
 $tpl = new FastTemplate( "."); 
 $tpl->define(array(foo => "foo.tpl", bar => "bar.tpl")); 
 
 $tpl->assign(NAME, "me"); 
 $tpl->parse(PAGECONTENT, "foo");
 
 $tpl->assign(PAGETITLE, "Welcome!"); 
 $tpl->parse(MAIN, "bar"); 
 
 $tpl->FastPrint(MAIN); 
 
 ?>
 ------------------------------------------------------------
 
 编制一个表格的例子:
 
 经过以上的阐述,大家是否已经明白一点了。
 下面是一个处理表格的例子,首先我们再学一些新知识。
 
 当我们当处理完foo模板后,并赋予了变量TPL1,我们可以将bar模板的内容处
 理后追加进TPL1中,这样就不必定义过多变量,也易于理解,例处理完页面的
 title后将content部分追加进去,最后将foot追加,生成完整一个页面再输
 出。这条命令就是:
 <?php $tpl->parse(TPL1, ".bar"); ?>
 其中的.表示追加。
 
 如下:
 
 <?php 
 
 # 处理模板foo,并赋予变量TPL1 
 $tpl->parse(TPL1, "foo"); 
 
 # 处理模板bar,并追加进变量TPL1 
 $tpl->parse(TPL1, ".bar"); 
 
 ?>
 
 下面是一个完整的表格例子,大家好好揣摸揣摸
 
 page.tpl 
 
 <HTML> 
 <HEAD><TITLE>Feature world - {PAGE_TITLE}</TITLE></HEAD> 
 <BODY BGCOLOR=BLACK TEXT=WHITE> 
 <H1>{PAGE_TITLE}</H1> 
 {PAGE_CONTENT} 
 </BODY> 
 </HTML>
 
 table.tpl 
 
 <TABLE> 
 <TR> <TH>name</TH> <TH>size</TH> </TR> 
 {TABLE_ROWS} 
 </TABLE>
 
 table_row.tpl 
 
 <TR> 
 <TD>{FILENAME}</TD> 
 <TD>{FILESIZE}</TD> 
 </TR>
 
 yad.php3 
 
 <?php 
 
 include "class.FastTemplate.php3"; 
 
 function InitializeTemplates() { 
 global $tpl; 
 
 $tpl = new FastTemplate( "."); 
 $tpl->define( 
 array( 
 page => "page.tpl", 
 table => "table.tpl", 
 table_row => "table_row.tpl" 
 ) 
 ); 
 } 
 
 function ReadCurrentDirectory() { 
 global $tpl; 
 
 $handle = opendir( "."); 
 while($filename = readdir($handle)) { 
 $tpl->assign(FILENAME, $filename); 
 $tpl->assign(FILESIZE, filesize($filename)); 
 $tpl->parse(TABLE_ROWS, ".table_row"); 
 } 
 closedir($handle); 
 $tpl->parse(PAGE_CONTENT, "table"); 
 } 
 
 function PrintPage($title) { 
 global $tpl; 
 
 $tpl->assign(PAGE_TITLE, $title); 
 $tpl->parse(FINAL, "page"); 
 $tpl->FastPrint(FINAL); 
 } 
 
 InitializeTemplates(); 
 ReadCurrentDirectory(); 
 Printpage( "Yet Another Demo"); 
 
 ?>
 
 关于速度的最后一点讨论:
 
 看完以上的例子,你会说“太棒了!漂亮,但是,速度怎么样呢?”
 
 没问题,你的站点会变得很快。简单的说:因为你是一个程序员,你应该关注
 于程序代码的设计,代码应该更加有效率,应容易修改和容易理解。使用
 FastTemplate可以可以帮助你做到这一点,所以它使你的工作更加轻松一些。
 
 如果你想替代一个已经建好的Web站点,我们建议使用regex(替换表达式)来
 替换,实际上FastTemplate使用的就是regex 来替换模板中的宏。
 
 ---------------------------------------------------------------------
  转载自"BOY工作室"
 原文由"linuxboy and ntboy"发表
 ---------------------------------------------------------------------
  注:
 FastTemplate:[http://www.thewebmasters.net/php/]
  -- ※ 来源:.月光软件站 http://www.moon-soft.com.[FROM: 202.96.191.29]
  | 
 
 
 |