PHPlib Template 模板类中文文档 第一版 2004-10-16 iwind译 (2004-10-24更新) -boofee.net收集

第十章. 模板(Template)
目录

模板类实例变量
模板类实例方法
可调用的实例方法
内部实例方法
模板类应用举例
备注: 如果你认为它像FastTemplates,那你要认真阅读了,其实它不是.

该模板类允许你在一些外部文件中保留HTML代码,这些文件完全不包含PHP代码,只含有用以替换的字段(译注:就是下文中所说的变量的"引用")。这个类就提供了一些可以让你用任意的字符串填入欲替换字段的函数。

 备注: 该文档的版本不再维护,请参阅template.inc 源文件中的注释部分,以获得最可靠的文档.

模板类实例变量
可调用的实例变量

classname 字符串(String).类序列帮助:类名称.
debug 整型(Integer). 标识:设为1可观察所有变量赋值情况,设为2可观察可调用变量,设为4可观察内部函数调用.
unknowns 为"keep","comment", "remove" (默认)三者之一.决定了在输出环节上如何处理模板中未完成处理的变量名称.如果设为"keep",这些变量名称将原封不动的保留下来.如果设为"comment",那么会在报错的同时,将未完成处理的变量名
称全部转换成HTML的注释.如果设为"remove",未完成处理的变量名称便会被悄然删除(这也是默认的情况).
halt_on_error = "yes" 为"yes"(默认), "report", "no"三者之一. 决定了模板类错误处理方式.如设为"yes"(默认),错误就会被报告,程序执行也随之中断. 如果设为"report",错误同样会被报告,只是程序继续执行,并返回"false".如果设为"no",错误就被屏蔽掉,程序执行结果返回"false"
last_error = "" 最近的一次错误信息保存在这个变量里面.

内部实例变量

file 字符串散列.一个转换表,可以把变量名转换成与之相对应的文件名.
root 字符串 (路径名). 模板文件被加载的主目录.
varkeys 字符串散列.一个转换表,可以把变量名转换成与之相对应的正则表达式. 
varvals 字符串散列.一个转换表,可以把变量名转换成它们各自的varkey对应的替代值.

——————————————————————————–

模板类实例方法

可调用实例方法

Template($root = ".", $unknowns = "remove")

构造函数.可以有两个可选的参数.第一歌参数设定模板所在目录,第二个参数设定未知变量的处理方式.

set_root($root)

该函数检查$root是否为一个有效的目录,然后把这个模板存放所在目录设为瞩目路.

set_unknowns($unknowns = "remove")

该函数设定未处理的变量名称的处理方式.必须是"remove","comment"或"keep"三者中的一个. 如果设为"keep",这些变量名称将原封不动的保留下来.如果设为"comment",那么会在报错的同时,将未完成处理的变量名称全部转换成HTML的注释.如果设为"remove",未完成处理的变量名称便会被悄悄的删除(这是默认的情况).

set_file($varname, $filename = "")

该函数为一个函数的初值定义一个文件名,可以用一个$varname/$filename对或者一系列的$varname/$filename对来调用它.这些文件只有在需要时才会被加载.

set_block($parent, $varname, $name = "")

变量$parent可包含一个以$varname命名的变量块.该函数会从$parent中把这个块删除,然后用一个名称为$name的变量代替它.如果$name被忽略了,那么它将被假定为和$varname一样

set_var($varname, $value = "")

该函数设定一个变量的初值.可以用一个$varname/$value对或者一系列的$varname/$value对来调用它.

subst($varname)

该函数返回一个名为$varname的变量的值,所有以定义变量的值都已经填入.结果字符串并不是最终结果,而是未完全处理变量的处理还没有应用前的结果.

psubst($varname)

这个是print $this->subst($varname)的简写形式.

parse($target, $varname, $append = false)

该函数替代以$varname为名中的所有已定义变量的值,并存储或附加在以$target为变量名的结果中.

如果$varname为变量名数组,$append就会被屏蔽.以$varname为名的变量被连续的替代,每一个替代步骤的结果都存在$target里.最终的替代结果
可在以$target为名的变量里获得,可以视为下一个$varname的一个中间处理环节.

pparse($target, $varname, $append = false)

这个是print $this->parse(…). 的简写形式

get_vars()

返回所有以定义值的序列,每个值都以其名字为键.

query_id()

返回以$varname命名的变量的值.如果$varname对应着一个文件,而且文件尚未加载,就会报告变量为空.当用变量名称数组调用时,会返回一个值的序列,以它们的名字为键.

get_undefined($varname)

该函数以$varname,名称未键的方式,返回一系列未处理变量名称(即一个含$a[$name]=$name的序列).

finish($str)

该函数将返回$str的最终版本,即针对未完全处理的处理方式将应用到$str上来.

p($varname)

该函数将输出以$varname命名的变量的最后版本的值.

get($varname)

该函数将得到以$varname命名的变量的最后版本的值.

haltmsg($msg)

该函数可以在你的模板子类中被覆写.它可以输出用来调用的信息.

内部实例方法

filename($filename)

当用一个相对路径调用时,函数返回一个路径名,附带从$this->root中提取的合适的目录名.如果是绝对路径,则不加变化即被使用.

结果文件名必须是存在的,否则就会长生一个错误.

varname($varname)

该函数根据所给的变量名称构造一个变量名称表达式(译注:即 var -> &leftsign; var &rightsign;).

loadfile($varname)

如果一个变量未定义或者为空,并且对应一个文件,对应着的这个文件就会被加载,文件内容将被赋为该变量的值.

halt($msg)

无论何时发生了一个错误,这个函数都将被唤起,并根据 $this->halt_on_error定义的方式处理这个错误.

模板类应用实例

该模板类管理一些变量的集合,都为文本字符串.这些字符串可能以 &leftsign; 变量 &rightsign;的形式包含其他变量的引用.当分析或替换时,一个变量的引用就会被那个变量的值所替代.例如,如果你这样

<?php
$t = new Template;

$t->set_var("a", "defined as hugo");
$t->set_var("b", "the value of a is &leftsign; a &rightsign;");

print $t->subst("b")
?>

将输出"the value of a is defined as hugo".

一个变量的值可以以手工调用set_var(\’名称", "值");的方式定义,或者可能调用set_file("名称","filename.ihtml");从一个文件中定义.在后一种情况中,当需要时(尽可能晚)文件内容就被加载,并被设置为变量的值.

第三种定义变量值的方式是调用set_block("parent", "block", "name");.这种情况下,以"parent"为名的变量被当作以<!– BEGIN block –>为开始,以<!– END block –>为结束的块被查找.字符串从变量"parent"中被删除,赋给以"block"为名的变量.在"parent"里的"name"对应的变量引用被替代了.如果可选项"name"
留空,"block"将被用于替代.

例如,如果这样写

<?php
$t = new Template;

$t->set_var("a", "front matter

<!– BEGIN b –>
this is block b
<!– END b –>

end matter");
$t->set_block("a", "b", "bb");
?>

会把变量"a"定义为"front matter &leftsign; bb &rightsign; end matter",变量"b"则作为一个块.这一切使得当你在下例中设置内部变量debug为7时,跟踪变量访问情况变得更加清晰.

直接使用模板类或者如有需要的话,定义一个模板类的子类.

象下面一样定义一个名为page.ihtml的模板文件.

<html>
<head><title>&leftsign; PAGETITLE &rightsign;</title></head>
<body bgcolor="#ffffff">
<table border=1 cellpadding=4 cellspacing=0 bgcolor="#eeeeee">
<tr>
<td colspan=2><h1>&leftsign; PAGETITLE &rightsign;</h1></td>
</tr>
<tr>
<td>&leftsign; OUT &rightsign;</td>
<td>Content<br>&leftsign; UNDEFINED_VARIABLE &rightsign;</td>
</tr>
</table>
</body>
</html>

这个文件包含一个对应变量PAGETITLET的引用和一个以OUT命名的引用.另外一个以UNDEFINED_VARIABLE为名的变量的引用不作解析.另外一个模板文件,命名为box.ihtml,包含一个名为row的块,含有三个变量引用. &leftsign; TITLE &rightsign;, &leftsign; NUM &rightsign; 和&leftsign; BIGNUM &rightsign;:

<!– start box.ihtml –>
<table border=1 bgcolor="#cccccc" cellpadding=4 cellspacing=0>
<tr>
<td colspan=2><b>&leftsign; TITLE &rightsign;</b></td>
</tr>
<!– BEGIN row –>
<tr>
<td>&leftsign; NUM &rightsign;</td>
<td>&leftsign; BIGNUM &rightsign;
</tr>
<!– END row –>
</table>
<!– end box.ihtml –>

下面的php文件示范如何使用这些模板:

<?php
/* 引入模板类 */
include("template.inc");

/* 用需要的参数生成模板类的一个实例对象 */
$t = new Template("/home/kris/www/test.koehntopp.de/pages/template", "keep");
/* $t->debug = 7; */ /* 激活全部调试 */

/* 从文件中定义两个变量 */
$t->set_file(array(
"page" => "page.ihtml",
"box" => "box.ihtml"));

/* 定义包含在另一个变量里面的变量 */
$t->set_block("box", "row", "rows");

/* 手动定义两个变量 */
$t->set_var(array("TITLE" => "Testseite",
"PAGETITLE" => "hugo"));

for ($i=1; $i<=3; $i++) &leftsign;
$n = $i;
$nn = $i*10;

/* 给NUM和BIGNUM赋值 */
$t->set_var(array("NUM" => $n, "BIGNUM" => $nn));

/* 替换row中的NUM和BIGNUM
* 把结果附加到rows */
$t->parse("rows", "row", true);
&rightsign;

/* 替换box里的所有变量,
结果存储在OUT里面 */
$t->parse("OUT", array("box", "page"));

/* 打印OUT*/
$t->p("OUT");
?>
<hr>
输出未定义变量:
<?php
print @implode(", ", $t->get_undefined("OUT"));
?>

历史博文

标签:, ,
八月 25, 2005 at 9:01 下午 by yippee 1,032 次
Category: Info
Tags: , ,