phplib7.2中文汉化版及调用示例
template.inc文件
PHP:
<?php
class Template
{
/*
*Session Management for PHP3
*(C) Copyright 1999-2000 NetUSE GmbH Kristian Koehntopp
*$Id: template.inc,v1.5 2000/07/12 18:22:35 kk Exp $
*汉化:Forest
*/
var $classname="Template";
var $debug=false;
var $filename=array();//包含了所有的模板文件名和模板名的数组
var $root="";//$root为模板文件的存放目录
var $varkeys=array();//存放文本元素的键名
var $varvals=array();//存放文本元素的值
var $unknowns="remove";//属性$unknowns设定了对未知内容的处理方法
var $halt_on_error="yes";//设定是否在发生错误的时候停止
var $last_error="";//记录最后一个错误信息
/*********************************************************/
//构造函数默认将模板文件目录设置为相同的目录
//$unknowns默认设置为"remove"
function Template($root=".",$unknowns="remove")
{
$this->set_root($root);
$this->set_unknowns($unknowns);
}
function set_root($root)//该方法设定$root的值,也就是模板文件的存放目录
{
if(!is_dir($root))//如果参数不是目录名,返回错误并停止
{
$this->halt("set_root: $root is not a directory.");
return false;
}
$this->root=$root;
return true;
}
function set_unknowns($unknowns="keep")//该方法设定属性unknowns的值
{
$this->unknowns=$unknowns;
}
function set_file($handle,$filename="")//该方法在数组file中根据$handle提供的键名加入值
{
if (!is_array($handle))//如果$handle不是数组
{
if($filename=="")//文件名为空则返回错误并停止
{
$this->halt("set_file:For handle $handle filename is empty.");
return false;
}
$this->file[$handle]=$this->filename($filename);//否则用$handle为键名添加新值到$file数组
}
else //如果$handle是数组
{
reset($handle);
while (list($h,$f)=each($handle))//将$handle的键名作为file数组的键名
{
$this->file[$h]=$this->filename($f);//将键名对应的值作为file数组的值
}
}
}
function set_block($parent,$handle,$name="")//该方法取出某个模板文件中的一个子模板将其作为“块”来加载并用另外一个模板变量取代之
{
if (!$this->loadfile($parent))
{
$this->halt("subst: unable to load $parent.");
return false;
}
if($name=="") $name=$handle;//没有指定模板变量的值就用子模板名作为模板变量名
$str=$this->get_var($parent);
$reg="/<!--\s+BEGIN $handle\s+-->(.*)\n\s*<!--\s+END $handle\s+-->/sm";
//进行抽取和替换
preg_match_all($reg,$str,$m);
$str=preg_replace($reg,"{"."$name}",$str);//替换父模板中的子模板
$this->set_var($handle,$m[1][0]);//子模板内容放在$handle为键值的数组元素中
$this->set_var($parent,$str);//重新写入替换后的父模板
}
function set_var($varname,$value="")//该方法向$varkeys和$varvals数组中添加新的键--值对
{
if(!is_array($varname))//如果$varname不是数组
{
if(!empty($varname))
{
if ($this->debug) print "scalar: set *$varname* to *$value*<br><br>";
$this->varkeys[$varname]="/".$this->varname($varname)."/";
$this->varvals[$varname]=$value;
}
}
else //如果$varname是数组
{
reset($varname);
while (list($k,$v)=each($varname))
{
if(!empty($k))
{
if ($this->debug) print "array:set *k* to *$v*<br><br>";
$this->varkeys[$k]="/".$this->varname($k)."/";
$this->varvals[$k]=$v;
}
}
}
}
function subst($handle)//该方法将模板文件中的变化内容替换成确定内容的操作,实现了数据和显示的分离
{
if (!$this->loadfile($handle))//加载模板文件,如果失败返回错误信息并停止
{
$this->halt("subst: unable to load $handle.");
return false;
}
$str=$this->get_var($handle);//读入文件内容到字符串$str
//对所有的已知键值进行替换并返回结果
$str=@preg_replace($this->varkeys,$this->varvals,$str);
return $str;
}
function psubst($handle)//该方法功能和susst相同,只是直接输出替换结果
{
print $this->subst($handle);
return false;
}
function parse($target,$handle,$append=false)//该方法将$handle代表的一个或多个文件中的内容完成替换存放在$target为键值的varvals数组元素中或追加到其后返回值和方法subst相同
{
if(!is_array($handle))
{
$str=$this->subst($handle);
if($append)
{
$this->set_var($target,$this->get_var($target).$str);
}
else
{
$this->set_var($target,$str);
}
}
else
{
reset($handle);
while (list($i,$h)=each($handle))
{
$str=$this->subst($h);
$this->set_var($target,$str);
}
return $str;
}
function pparse($target,$handle,$append=false)//该方法的功能与方法parse相同,只是该方法将结果输出
{
print $this->parse($target,$handle,$append);
return false;
}
function get_vars()//该方法返回所有的键--值对中的值所组成的数组
{
reset($this->varkeys);
while (list($k,$v)=each($this->varkeys))
{
$result[$k]=$this->varvals[$k];
}
return $result;
}
function get_var($varname)//该方法根据键名返回对应的键--值对的值
{
if(!is_array($varname))//如果$varname不是数组
{
return $this->varvals[$varname];//直接返回其对应的varvals数组中的值
}
else //如果$varname是数组
{
reset($varname);
while (list($k,$v)=each($varname))
{
$result[$k]=$this->varvals[$k];
}
return $result;
}
}
function get_undefined($handle)
{
//如果加载文件失败,返回错误并停止
if(!$this->loadfile($handle))
{
$this->halt("get_undefined: unable to load $handle.");
return false;
}
preg_match_all("/\{([^}]+)\}/",$this->get_var($handle),$m);
$m=$m[1];
//如果无法找到匹配的文本返回错误
if (!is_array($m)) return false;
//如果能够找到大括号中的非空字符则将其值作为键值,组成一个数组
reset($m);
while (list($k,$v)=each($m))
{
if(!isset($this->varkeys[$v]))
$result[$v]=$v;
}
//该数组不为空就返回该数组,否则返回错误
if(count($result)) return $result;
else return false;
}
function finish($str)//该方法的作用是完成对$str的最后的处理工作,利用类的属性$unknowns来确定对模板中无法处理的动态部分的处理方法
{
switch ($this->unknowns)
{
case "keep"://keep保持不变
break;
case "remove"://remove删除所有的非控制字符
$str=preg_replace('/{[^\t\r\n}]+}/',"",$str);
break;
case "comment"://comment将大括号中的动态部分替换为html注释
$str=preg_replace('/{([^ \t\r\l])+})/',"<!--Template $handle:Variable\\1 underfined-->",$str);
break;
}
return $str;
}
function p($varname)//该方法将参数变量对应的varvals数组中的值处理后输出
{
print $this->finish($this->get_var($varname));
}
function get($varname)//该方法将参数变量对应的varvals数组中的值处理后返回
{
return $this->finish($this->get_var($varname));
}
function filename($filename)//该方法的作用是检查并补充给定的文件名
{
if(substr($filename,0,1)!= "/")//如果文件名不是以/开头,则表示是相对路径,将其补充为完整的绝对路径
{
$filename=$this->root."/".$filename;
}
if (!file_exists($filename))//如果该文件不存在,停止并输出错误消息
{
$this->halt("filename: file $filename does not exist.");
}
return $filename;//返回的值为有效的文件名
}
function varname($varname)
{
return preg_quote("{".$varname."}");
}
function loadfile($handle)//该方法根据$handle加载文件到键--值对中
{//如果已经加载了$handle为句柄的文件,直接返回真值
if (isset($this->varkeys[$handle]) and !empty($this->varvals[$handle])) return true; if(!isset($this->file[$handle]))//如果句柄没有设定,返回错误并停止
{
$this->halt("loadfile: $handle is not a valid handle.");
return false;
}
$filename=$this->file[$handle];//句柄有效则取出对应的文件名
$str=implode("",@file($filename));//将文件的每一行连接成一个字符串
if(empty($str))//字符串空说明文件空或者不存在,返回错误并停止
{
$this->halt("loadfile: While loading $handle,$filename does not exist or is empty.");
return false;
}
//如果文件不为空,用$handle作为句柄,$str为变量名向键--值对中添加新的键--值
$this->set_var($handle,$str);
return true;
}
function halt($msg)//该方法停止程序运行并给出错误信息
{
$this->last_error=$msg;
if($this->halt_on_error!="no")
$this->haltmsg($msg);
if($this->halt_on_error=="yes")
die("<b>Halted.</b>");
return false;
}
function haltmsg($msg)//该方法给出错误信息
{
printf("<b>Template Error:</b>%s<br><br>",$msg);
}
}
?>