Chinaunix首页 | 论坛 | 博客
  • 博客访问: 18931339
  • 博文数量: 7460
  • 博客积分: 10434
  • 博客等级: 上将
  • 技术积分: 78178
  • 用 户 组: 普通用户
  • 注册时间: 2008-03-02 22:54
文章分类

全部博文(7460)

文章存档

2011年(1)

2009年(669)

2008年(6790)

分类:

2008-04-13 20:55:01

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="/(.*)\n\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*

"
;
        
$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*

"
;
            
$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])+})/',"",$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(
"Halted."
);
        
        return 
false
;
    }
        
    function 
haltmsg($msg)
//该方法给出错误信息
    
{
        
printf("Template Error:%s

"
,$msg
);
    }
    }
?> 

阅读(283) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~