template_class.php
上传用户:yttaitong
上传日期:2009-05-10
资源大小:128k
文件大小:7k
源码类别:

WEB源码(ASP,PHP,...)

开发平台:

PHP

  1. <?php
  2. /*
  3.     [BBWPS!] (C)2006-2010 小蜜蜂版权所有.
  4. This is NOT a freeware, use is subject to license terms
  5.     时间:2007年12月
  6.     描述:模板调用
  7. */
  8. class Template {
  9.   var $classname = "Template";      //CLASS NAME
  10.   var $debug     = false;           //是否打开调试状态
  11.   var $file  = array();             //文件句柄
  12.   var $root   = "";                 //模板所在的目录
  13.   var $varkeys = array();           //变量下标数组
  14.   var $varvals = array();           //变量元素数组
  15.   var $unknowns = "remove";         //模板变量的处理方式
  16.   var $halt_on_error  = "yes";      //提示错误是否打开
  17.   var $last_error     = "";         //错误缓冲池
  18. //构造函数
  19.   function Template($root = ".", $unknowns = "remove") {
  20.     $this->set_root($root);         //初始化目录
  21.     $this->set_unknowns($unknowns); //
  22.   }
  23. //设置目录
  24.   function set_root($root) {
  25.     if (!is_dir($root)) {
  26.       $this->halt("设置目录: $root 不是一个目录文件.");
  27.       return false;
  28.     }
  29.     $this->root = $root;
  30.     return true;
  31.   }
  32.   function set_unknowns($unknowns = "keep") {
  33.     $this->unknowns = $unknowns;
  34.   }
  35.   //设置文件句柄
  36.   function set_file($handle, $filename) {
  37.     if (!is_array($handle)) {
  38.       if ($filename == "") {
  39.         $this->halt("设置文件句柄: 句柄->$handle文件名为空.");
  40.         return false;
  41.       }
  42.       $this->file[$handle] = $this->filename($filename); 
  43.       } else {
  44.       reset($handle);  //从第一元素开始遍历
  45.       while(list($h, $f) = each($handle)) {
  46.         $this->file[$h] = $this->filename($f);
  47.       }
  48.     }
  49.   }
  50.   //设置一段文本为模板
  51.   //第一个参数是该段文本所在的文件
  52.   //第二个参数是模板句柄
  53.   //第三个参数是模板名称。默认为空
  54.   function set_block($parent, $handle, $name = "") {
  55.     if (!$this->loadfile($parent)) {
  56.       $this->halt("设置文本体: 没有加载成功$parent.");
  57.       return false;
  58.     }
  59.     if ($name == ""){
  60.       $name = $handle; //让句柄和名称相同
  61.     }
  62.     $str = $this->get_var($parent);  //获得文件内容
  63.     //设置匹配规则<!--开头任何的空白符(最少一个空白符)BEGIN 句柄 任何的空白符(最少一个空白符)-->
  64.     //任何字符,任何空白符,任何换行符
  65.     //设置匹配规则<!--任何的空白符(最少一个空白符 END 句柄 任何的空白符(最少一个空白符)-->结尾
  66.     $reg = "/<!--s+BEGIN $handles+-->(.*?)<!--s+END $handles+-->/is";
  67.     preg_match_all($reg, $str, $m);
  68.     $str = preg_replace($reg, "{".$name."}", $str);
  69.     $this->set_var($handle, $m[1][0]); //设置内容
  70.     $this->set_var($parent, $str);     //把内容用变量替换
  71.   }
  72.   //设置变量
  73.   //第一个参数是模板中的变量名称
  74.   //第二个参数是要给的值一般都是一一对应
  75.   function set_var($varname, $value = "") {
  76.     if (!is_array($varname)) {    //可以是数组
  77.       if (!empty($varname))
  78.         if ($this->debug) print "变量: 设置 *$varname* -> *$value*<br>n";
  79.         $this->varkeys[$varname] = "/".$this->varname($varname)."/";
  80.         $this->varvals[$varname] = $value;
  81.     } else {
  82.       reset($varname);   //数组遍历
  83.       while(list($k, $v) = each($varname)) {
  84.         if (!empty($k))
  85.           if ($this->debug) print "变量数组: 设置 *$k* -> *$v*<br>n";
  86.           $this->varkeys[$k] = "/".$this->varname($k)."/";
  87.           $this->varvals[$k] = $v;
  88.       }
  89.     }
  90.   }
  91.  
  92.   function subst($handle) {
  93.     if (!$this->loadfile($handle)) {
  94.       $this->halt("获取文件: 不能载入文件 $handle.");
  95.       return false;
  96.     }
  97.     $str = $this->get_var($handle);
  98.     $str = @preg_replace($this->varkeys, $this->varvals, $str);
  99.     return $str;
  100.   }
  101.   
  102.  
  103.   function psubst($handle) {
  104.     print $this->subst($handle);  
  105.     return false;
  106.   }
  107.  //解析句柄和输出的变量
  108.  //第一个参数就是下一步要输出的变量
  109.  //第二个参数就是前面载入模板的句柄
  110.  //第三个参数是附加参数,如是TRUE就要加上以前该变量的内容,否则就覆盖以前该变量的内容
  111.   function parse($target, $handle, $append = false) {
  112.     if (!is_array($handle)) {
  113.       $str = $this->subst($handle); //获得模板的内容
  114.       if ($append) {     //附加变量内容
  115.           $this->set_var($target, $this->get_var($target) . $str);
  116.       } else {    //覆盖变量内容
  117.           $this->set_var($target, $str);
  118.       }
  119.     } 
  120.     else {
  121.       reset($handle);  //遍历数组,在这里没有设置是否附加的功能,全部都是覆盖以前的变量
  122.       while(list($i, $h) = each($handle)) {
  123.         $str = $this->subst($h);
  124.         $this->set_var($target, $str);
  125.       }
  126.     }
  127.     return $str;
  128.   }
  129.   //显示当前解析后的模板
  130.   function pparse($target, $handle, $append = false) {
  131.     print $this->parse($target, $handle, $append);
  132.     return false;
  133.   }
  134.   //获得所有的变量
  135.   function get_vars() {
  136.     reset($this->varkeys);
  137.     while(list($k, $v) = each($this->varkeys)) {
  138.       $result[$k] = $this->varvals[$k];
  139.     }
  140.     return $result;
  141.   }
  142.   //获得具体的变量
  143.   function get_var($varname) {
  144.     if (!is_array($varname)) {
  145.       return $this->varvals[$varname];
  146.     } else {
  147.       reset($varname);
  148.       while(list($k, $v) = each($varname)) {
  149.         $result[$k] = $this->varvals[$k];
  150.       } 
  151.       return $result;
  152.     }
  153.   }
  154.   //获得还没有解析的句柄
  155.   function get_undefined($handle) {
  156.     if (!$this->loadfile($handle)) {
  157.       $this->halt("获得未定义句柄: 不能加载模板$handle.");
  158.       return false;
  159.     }
  160.     //匹配模板中的变量
  161.     preg_match_all("/{([^}]+)}/", $this->get_var($handle),$m);
  162.     $m = $m[1];
  163.     if (!is_array($m))
  164.       return false;
  165.     reset($m); //开始遍历
  166.     while(list($k, $v) = each($m)) {
  167.       if (!isset($this->varkeys[$v]))
  168.         $result[$v] = $v;
  169.     }
  170.     if (count($result))
  171.       return $result;
  172.     else
  173.       return false;
  174.   }
  175.  
  176.   function finish($str) {
  177.     switch ($this->unknowns) {
  178.       //跳过
  179.       case "keep":
  180.       break;
  181.       //删除变量
  182.       case "remove":
  183.         $str = preg_replace('/{[^ trn}]+}/', "", $str);
  184.       break;
  185.       //设置注释
  186.       case "comment":
  187.         $str = preg_replace('/{([^ trn}]+)}/', "<!-- Template $handle: Variable \1 undefined -->", $str);
  188.       break;
  189.     }
  190.     return $str;
  191.   }
  192.   //把解析好的内容显示,并做处理
  193.   function p($varname) {
  194.     print $this->finish($this->get_var($varname));
  195.   }
  196.   //把具体的变量做处理但是不显示出来
  197.   function get($varname) {
  198.     return $this->finish($this->get_var($varname));
  199.   }
  200.  //设置带路径的模板
  201.   function filename($filename) {
  202.     if (substr($filename, 0, 1) != "/") {
  203.       $filename = $this->root."/".$filename;
  204.     }
  205.     //检测模板文件是否存在
  206.     if (!file_exists($filename))
  207.       $this->halt("模板: $filename 不存在.");
  208.     return $filename;
  209.   }
  210.   //设置变量
  211.   function varname($varname) {
  212.     return preg_quote("{".$varname."}");//转义字符串,让所有的正则表达式的特殊字符前面加上
  213.   }
  214.   //装载模板
  215.   function loadfile($handle) {
  216.     //判断是不是变量,或者是已经装载
  217.     if (isset($this->varkeys[$handle]) and !empty($this->varvals[$handle]))
  218.       return true;
  219.    
  220.     if (!isset($this->file[$handle])) {
  221.       $this->halt("载入模板: $handle不是一个正确的句柄.");
  222.       return false;
  223.     }
  224.     $filename = $this->file[$handle];
  225.     //开始IO操作读取文件
  226.     $str = implode("", @file($filename));
  227.     if (empty($str)) {
  228.       $this->halt("载入模板: 句柄$handle, $filename不存在或者是空文件.");
  229.       return false;
  230.     }
  231.     $this->set_var($handle, $str); //保存到缓冲中
  232.     return true;
  233.   }
  234.   //错误处理,终止程序
  235.   function halt($msg) {
  236.     $this->last_error = $msg;
  237.     
  238.     if ($this->halt_on_error != "no")
  239.       $this->haltmsg($msg);
  240.     
  241.     if ($this->halt_on_error == "yes")
  242.       die("<b>程序终止.</b>");
  243.     
  244.     return false;
  245.   }
  246.   function haltmsg($msg) {
  247.     printf("<b>模板调用错误:</b> %s<br>n", $msg);
  248.   }
  249. }
  250. ?>