帝国软件
  设为首页 加入收藏 关于我们
 
解密帝国网站管理系统
栏 目:
 
您的位置:首页 > 技术文档 > PHP编程
一个易用的模板类
作者:匿名 发布时间:2002-12-17 来源:phpx

这几天好像不少人都关心用模板的问题。在这里我就把自己的模类贴出来。

我这个类是是继承于phplib7.0的template,并修改相关的程序。做了简单的优化,其实phplib7.0的模板处理比fasttemplate的来得快,经多次test.

PHP:

<?php
if(!defined("__TEMPLATE_H_PHP__")){
define("__TEMPLATE_H_PHP__","template.h.php");
/******************** CODE START ********************/

//PHP类库:template.h.php
//运行环境:PHP4.0
//修改时间:2002-08-01
//最后修改:stangly.wrong
//类库简介:模板的提取显示的类
/////////////////////////////////////////////////////////////

    //类名:模板基类 Template_base
    //功能:模板具体操作类。
    
class Template_base {
       var 
$classname "Template_base";

       
/* if set, echo assignments */
       
var $debug     false;

       
/* $file[handle] = "filename"; */
       
var $file  = array();

       
/* relative filenames are relative to this pathname */
       
var $root   "";

       
/* $varkeys[key] = "key"; $varvals[key] = "value"; */
       
var $varkeys = array();
       var 
$varvals = array();

       
/* "remove"  => remove undefined variables
        * "comment" => replace undefined variables with comments
        * "keep"    => keep undefined variables
       */
       
var $unknowns "remove";

       
/* "yes" => halt, "report" => report error, continue, "no" => ignore error quietly */
       
var $halt_on_error  "yes";

       
/* last error message is retained here */
       
var $last_error     "";


       
/***************************************************************************/
       /* public: Constructor.
        * root:     template directory.
        * unknowns: how to handle unknown variables.
       */
       
function Template_base($root "."$unknowns "remove") {
          
$this->set_root($root);
          
$this->set_unknowns($unknowns);
       }

       
/* public: setroot(pathname $root)
       * root:   new template directory.
       */
       
function set_root($root) {
          if (!
is_dir($root)) {
             
$this->halt("set_root: $root is not a directory.");
             return 
false;
          }

          
$this->root $root;
          return 
true;
       }

       
/* public: set_unknowns(enum $unknowns)
       * unknowns: "remove", "comment", "keep"
       *
       */
       
function set_unknowns($unknowns "keep") {
          
$this->unknowns $unknowns;
       }

       
/* public: set_file(array $filelist)
       * filelist: array of handle, filename pairs.
       *
       * public: set_file(string $handle, string $filename)
       * handle: handle for a filename,
       * filename: name of template file
       */
       
function set_file($handle$filename "") {
          if (!
is_array($handle)) {
             if (
$filename == "") {
                
$this->halt("set_file: For handle $handle filename is empty.");
                return 
false;
             }
             
$this->file[$handle] = $this->filename($filename);
          } else {
             
reset($handle);
             while(list(
$h$f) = each($handle)) {
                
$this->file[$h] = $this->filename($f);
             }
          }
       }

       
/* public: set_block(string $parent, string $handle, string $name = "")
       * extract the template $handle from $parent,
       * place variable {$name} instead.
       */
       
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 $handles+-->(.*)ns*<!--s+END $handles+-->/sm";
          
preg_match_all($reg$str$m);
          
$str preg_replace($reg"{" "$name}"$str);
          
$this->set_var($handle$m[1][0]);
          
$this->set_var($parent$str);
       }

       
/* public: set_var(array $values)
        * values: array of variable name, value pairs.
        *
        * public: set_var(string $varname, string $value)
        * varname: name of a variable that is to be defined
        * value:   value of that variable
       */
       
function set_var($varname$value "") {
          if (!
is_array($varname)) {
             if (!empty(
$varname))
                if (
$this->debug) echo "scalar: set *$varname* to *$value*<br>n";
             
$this->varkeys[$varname] = "/".$this->varname($varname)."/";
             
$this->varvals[$varname] = $value;
          } else {
             
reset($varname);
             while(list(
$k$v) = each($varname)) {
                if (!empty(
$k))
                if (
$this->debug) echo "array: set *$k* to *$v*<br>n";
                
$this->varkeys[$k] = "/".$this->varname($k)."/";
                
$this->varvals[$k] = $v;
             }
          }
       }

       
/* public: subst(string $handle)
       * handle: handle of template where variables are to be substituted.
       */
       
function subst($handle) {
          if (!
$this->loadfile($handle)) {
             
$this->halt("subst: unable to load $handle.");
             return 
false;
          }

          
$str $this->get_var($handle);
          
$str = @preg_replace($this->varkeys$this->varvals$str);
          return 
$str;
       }

       
/* public: psubst(string $handle)
       * handle: handle of template where variables are to be substituted.
       */
       
function psubst($handle) {
          echo 
$this->subst($handle);

          return 
false;
       }

       
/* public: parse(string $target, string $handle, boolean append)
       * public: parse(string $target, array  $handle, boolean append)
       * target: handle of variable to generate
       * handle: handle of template to substitute
       * append: append to target handle
       */
       
function parse($target$handle$append false) {
          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) {
          echo 
$this->parse($target$handle$append);
          return 
false;
       }

       
/* public: get_vars()*/
       
function get_vars() {
          
reset($this->varkeys);
          while(list(
$k$v) = each($this->varkeys)) {
             
$result[$k] = $this->varvals[$k];
          }

          return 
$result;
       }

       
/* public: get_var(string varname)
       * varname: name of variable.
       *
       * public: get_var(array varname)
       * varname: array of variable names
       */
       
function get_var($varname) {
          if (!
is_array($varname)) {
             return 
$this->varvals[$varname];
          } else {
             
reset($varname);
             while(list(
$k$v) = each($varname)) {
                
$result[$k] = $this->varvals[$k];
             }

             return 
$result;
          }
       }

       
/* public: get_undefined($handle)
       * handle: handle of a template.
       */
       
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;
       }

      
/* public: finish(string $str)
       * str: string to finish.
       */
       
function finish($str) {
          switch (
$this->unknowns) {
             case 
"keep":
                break;
             case 
"remove":
                
$str preg_replace('/{[^ trn}]+}/'""$str);
                break;
             case 
"comment":
                
$str preg_replace('/{([^ trn}]+)}/'"<!-- Template $handle: Variable 1 undefined -->"$str);
                break;
          }

          return 
$str;
       }

      
/* public: p(string $varname)
       * varname: name of variable to print.
       */
      
function p($varname) {
          echo 
$this->finish($this->get_var($varname));
       }

       function 
get($varname) {
          return 
$this->finish($this->get_var($varname));
       }

      
/***************************************************************************/
      /* private: filename($filename)
       * filename: name to be completed.
       */
      
function filename($filename) {
          if (
substr($filename01) != "/") {
             
$filename $this->root."/".$filename;
          }

          if (!
file_exists($filename))
             
$this->halt("filename: file $filename does not exist.");

          return 
$filename;
       }

      
/* private: varname($varname)
       * varname: name of a replacement variable to be protected.
       */
      
function varname($varname) {
          return 
preg_quote("{".$varname."}");
       }

       
/* private: loadfile(string $handle)
       * handle:  load file defined by handle, if it is not loaded yet.
       */
       
function loadfile($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;
          }

          
$this->set_var($handle$str);

          return 
true;
       }

       
/***************************************************************************/
       /* public: halt(string $msg)
       * msg:    error message to show.
       */
       
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;
       }

       
/* public, override: haltmsg($msg)
       * msg: error message to show.
       */
       
function haltmsg($msg) {
          
printf("<b>Template Error:</b> %s<br>n"$msg);
       }
    }
#end Template_base class

    //类名:Template
    //功能:模板处理扩展
    //说明:继承于Tempalte_base,修改了部分的模板处理函数
    
class Template extends Template_base {
       var 
$handelkey = array();
       var 
$handelcount;

       function 
Template($filename) {
          
$this->Template_base();
          if(empty(
$filename) || !file_exists($filename)) {
             die(
"Template -> Template() : Error - file $filename does not exist");
          }
          
$this->set_file('ihtml',$filename);
          
$this->handelcount 1;
          return 
true;
       }

       function 
Output() {
          
$this->p('out');
          return 
true;
       }

       function 
Compile() {
          
$this->parse('out','ihtml');
          return 
true;
       }

       function 
OP() {
          
$copyright '<p align=center>&copy; 2002 new Maya workroom</p>';
          
$this->SetVar('copyright',$copyright);
          
$this->Compile();
          
$this->OutPut();
          return 
true;
       }

       
//example:  var or array
       //        $key = array(
       //            'row1' => '序号',
       //            'row2' => '姓名',
       //            'row3' => '性别'
       //        )
       
function SetVar($key,$value '') {
          
$this->set_var($key,$value);
          return 
true;
       }

       
// $key is define the current block
       
function SetBlock($blockname) {
          
$this->handelkey[$blockname] = $this->handelcount;
          
$this->set_block('ihtml',$blockname,$this->handelcount);

          
$this->handelcount ++;
          return 
true;
       }

       
//example : array
       //        $data = array (
       //            '0' => array('1','2','3'),
       //            '1' => array('4','5','6'),
       //        );
       // or var
       
function SetBlockVar($data,$blockname,$var '') {
          if(
is_array($data)) {
             
$x count($data);
             
$y count($data[0]);

             for(
$i $i $x $i++) {
                for(
$j $j $y $j++) {
                   
$this->set_var('var'.$j,$data[$i][$j]);
                }
                
$this->parse($this->handelkey[$blockname],$blockname,true);
             }
          } else {
             
$this->set_var($var,$data);
          }
          return 
true;
       }

       function 
BlockParse($blockname) {
          if(!empty(
$blockname)) {
             
$this->parse($this->handelkey[$blockname],$blockname,true);
             return 
true;
          }
          return 
false;
       }

    }
#end Template class

/******************** CODE END ********************/
}
?>



调用的方法
$t = new template('test.tpl');
$t->SetVar('test','中国');//替换相关的字串。
$t->OP();

如果是用这样的一个模板
<table>
<!-- BEGIN list -->
<tr>
<td>{var0}</td>
<td>{var1}</td>
</tr>
<!-- END list -->
</table>

<table>
<!-- BEGIN list2 -->
<tr>
<td>{var0}</td>
<td>{var1}</td>
</tr>
<!-- END list2 -->
</table>

则这样用
<?
include("template.h.php");
include('template.h.php');
$data=array();
$data['list']=array(
'0'=>array('a1','a2'),
'1'=>array('b1','b2')
);
$data['list2']=array(
'0'=>array('aa1','aa2'),
'1'=>array('bb1','bb2')
);
$t = new template('test.tpl');
$t->SetBlock('list');
$t->SetBlockVar($data['list'],'list');
$t->SetBlock('list2');
$t->SetBlockVar($data['list2'],'list2');
$t->OP();
?>

其它的方法大家再研究一下吧。如果有兴趣的话,可以帮我扩充一下。呵呵
  
评论】【加入收藏夹】【 】【打印】【关闭
※ 相关链接
 ·如何定义一个session 数组?  (2005-03-12)
 ·用ASP实现一个真正的注册页面  (2005-03-12)
 ·一个简单聊天室的建立.(供学习参  (2005-03-12)
 ·怎样才能将query string从一个as  (2005-03-12)
 ·一个BBS的源代码(一)  (2005-03-12)
 ·一个BBS的源代码(二)  (2005-03-12)
 ·一个BBS的源代码(三)  (2005-03-12)
 ·一个BBS的源代码(四)  (2005-03-12)
 ·一个BBS的源代码(五)  (2005-03-12)
 ·一个BBS的源代码(六)  (2005-03-12)

   栏目导行
  PHP编程
  ASP编程
  ASP.NET编程
  JAVA编程
   站点最新
·致合作伙伴的欢迎信
·媒体报道
·帝国软件合作伙伴计划协议
·DiscuzX2.5会员整合通行证发布
·帝国CMS 7.0版本功能建议收集
·帝国网站管理系统2012年授权购买说
·PHPWind8.7会员整合通行证发布
·[官方插件]帝国CMS-访问统计插件
·[官方插件]帝国CMS-sitemap插件
·[官方插件]帝国CMS内容页评论AJAX分
   类别最新
·Windows下集成安装Apache,PHP,MYSQ
·Mysql注入:SQL Injection with MyS
·PHP 的来龙去脉
·PHP 的功能概述
·PHP与其它CGI的比较
·PHP 的编译配置详细选项
·php.ini 配置详细选项
·如何写作PHP程序
·Hello,World
·嵌入方法
 
关于帝国 | 广告服务 | 联系我们 | 程序开发 | 网站地图 | 留言板 帝国网站管理系统