一个PHP Template

  1. class Template {
  2.   var $classname = "Template";
  3.   /* if set, echo assignments */
  4.   var $debug     = false;
  5.   /* $file[handle] = "filename"; */
  6.   var $file  = array();
  7.   /* relative filenames are relative to this pathname */
  8.   var $root   = "";
  9.   /* $varkeys[key] = "key"; $varvals[key] = "value"; */
  10.   var $varkeys = array();
  11.   var $varvals = array();
  12.   /* "remove"  => remove undefined variables
  13.    * "comment" => replace undefined variables with comments
  14.    * "keep"    => keep undefined variables
  15.    */
  16.   var $unknowns = "remove";
  17.   
  18.   /* "yes" => halt, "report" => report error, continue, "no" => ignore error quietly */
  19.   var $halt_on_error  = "yes";
  20.   
  21.   /* last error message is retained here */
  22.   var $last_error     = "";
  23.   /***************************************************************************/
  24.   /* public: Constructor.
  25.    * root:     template directory.
  26.    * unknowns: how to handle unknown variables.
  27.    */
  28.   function Template($root = "."$unknowns = "remove") {
  29.     $this->set_root($root);
  30.     $this->set_unknowns($unknowns);
  31.   }
  32.   /* public: setroot(pathname $root)
  33.    * root:   new template directory.
  34.    */  
  35.   function set_root($root) {
  36.     if (!is_dir($root)) {
  37.       $this->halt("set_root: $root is not a directory.");
  38.       return false;
  39.     }
  40.     
  41.     $this->root = $root;
  42.     return true;
  43.   }
  44.   /* public: set_unknowns(enum $unknowns)
  45.    * unknowns: "remove", "comment", "keep"
  46.    *
  47.    */
  48.   function set_unknowns($unknowns = "keep") {
  49.     $this->unknowns = $unknowns;
  50.   }
  51.   /* public: set_file(array $filelist)
  52.    * filelist: array of handle, filename pairs.
  53.    *
  54.    * public: set_file(string $handle, string $filename)
  55.    * handle: handle for a filename,
  56.    * filename: name of template file
  57.    */
  58.   function set_file($handle$filename = "") {
  59.     if (!is_array($handle)) {
  60.       if ($filename == "") {
  61.         $this->halt("set_file: For handle $handle filename is empty.");
  62.         return false;
  63.       }
  64.       $this->file[$handle] = $this->filename($filename);
  65.     } else {
  66.       reset($handle);
  67.       while(list($h$f) = each($handle)) {
  68.         $this->file[$h] = $this->filename($f);
  69.       }
  70.     }
  71.   }
  72.   /* public: set_block(string $parent, string $handle, string $name = "")
  73.    * extract the template $handle from $parent, 
  74.    * place variable {$name} instead.
  75.    */
  76.   function set_block($parent$handle$name = "") {
  77.     if (!$this->loadfile($parent)) {
  78.       $this->halt("subst: unable to load $parent.");
  79.       return false;
  80.     }
  81.     if ($name == "")
  82.       $name = $handle;
  83.     $str = $this->get_var($parent);
  84.     $reg = "/(.*)\n\s*/sm";
  85.     preg_match_all($reg$str$m);
  86.     $str = preg_replace($reg"{" . "$name}"$str);
  87.     $this->set_var($handle$m[1][0]);
  88.     $this->set_var($parent$str);
  89.   }
  90.   
  91.   /* public: set_var(array $values)
  92.    * values: array of variable name, value pairs.
  93.    *
  94.    * public: set_var(string $varname, string $value)
  95.    * varname: name of a variable that is to be defined
  96.    * value:   value of that variable
  97.    */
  98.   function set_var($varname$value = "") {
  99.     if (!is_array($varname)) {
  100.       if (!emptyempty($varname))
  101.         if ($this->debug) print "scalar: set *$varname* to *$value*
    \n"
    ;
  102.         $this->varkeys[$varname] = "/".$this->varname($varname)."/";
  103.         $this->varvals[$varname] = $value;
  104.     } else {
  105.       reset($varname);
  106.       while(list($k$v) = each($varname)) {
  107.         if (!emptyempty($k))
  108.           if ($this->debug) print "array: set *$k* to *$v*
    \n"
    ;
  109.           $this->varkeys[$k] = "/".$this->varname($k)."/";
  110.           $this->varvals[$k] = $v;
  111.       }
  112.     }
  113.   }
  114.   /* public: subst(string $handle)
  115.    * handle: handle of template where variables are to be substituted.
  116.    */
  117.   function subst($handle) {
  118.     if (!$this->loadfile($handle)) {
  119.       $this->halt("subst: unable to load $handle.");
  120.       return false;
  121.     }
  122.     $str = $this->get_var($handle);
  123.     $str = @preg_replace($this->varkeys, $this->varvals, $str);
  124.     return $str;
  125.   }
  126.   
  127.   /* public: psubst(string $handle)
  128.    * handle: handle of template where variables are to be substituted.
  129.    */
  130.   function psubst($handle) {
  131.     print $this->subst($handle);
  132.     
  133.     return false;
  134.   }
  135.   /* public: parse(string $target, string $handle, boolean append)
  136.    * public: parse(string $target, array  $handle, boolean append)
  137.    * target: handle of variable to generate
  138.    * handle: handle of template to substitute
  139.    * append: append to target handle
  140.    */
  141.   function parse($target$handle$append = false) {
  142.     if (!is_array($handle)) {
  143.       $str = $this->subst($handle);
  144.       if ($append) {
  145.         $this->set_var($target$this->get_var($target) . $str);
  146.       } else {
  147.         $this->set_var($target$str);
  148.       }
  149.     } else {
  150.       reset($handle);
  151.       while(list($i$h) = each($handle)) {
  152.         $str = $this->subst($h);
  153.         $this->set_var($target$str);
  154.       }
  155.     }
  156.     
  157.     return $str;
  158.   }
  159.   
  160.   function pparse($target$handle$append = false) {
  161.     print $this->parse($target$handle$append);
  162.     return false;
  163.   }
  164.   
  165.   /* public: get_vars()
  166.    */
  167.   function get_vars() {
  168.     reset($this->varkeys);
  169.     while(list($k$v) = each($this->varkeys)) {
  170.       $result[$k] = $this->varvals[$k];
  171.     }
  172.     
  173.     return $result;
  174.   }
  175.   
  176.   /* public: get_var(string varname)
  177.    * varname: name of variable.
  178.    *
  179.    * public: get_var(array varname)
  180.    * varname: array of variable names
  181.    */
  182.   function get_var($varname) {
  183.     if (!is_array($varname)) {
  184.       return $this->varvals[$varname];
  185.     } else {
  186.       reset($varname);
  187.       while(list($k$v) = each($varname)) {
  188.         $result[$k] = $this->varvals[$k];
  189.       }
  190.       
  191.       return $result;
  192.     }
  193.   }
  194.   
  195.   /* public: get_undefined($handle)
  196.    * handle: handle of a template.
  197.    */
  198.   function get_undefined($handle) {
  199.     if (!$this->loadfile($handle)) {
  200.       $this->halt("get_undefined: unable to load $handle.");
  201.       return false;
  202.     }
  203.     
  204.     preg_match_all("/\{([^}]+)\}/"$this->get_var($handle), $m);
  205.     $m = $m[1];
  206.     if (!is_array($m))
  207.       return false;
  208.     reset($m);
  209.     while(list($k$v) = each($m)) {
  210.       if (!isset($this->varkeys[$v]))
  211.         $result[$v] = $v;
  212.     }
  213.     
  214.     if (count($result))
  215.       return $result;
  216.     else
  217.       return false;
  218.   }
  219.   /* public: finish(string $str)
  220.    * str: string to finish.
  221.    */
  222.   function finish($str) {
  223.     switch ($this->unknowns) {
  224.       case "keep":
  225.       break;
  226.       
  227.       case "remove":
  228.         $str = preg_replace('/{[^ \t\r\n}]+}/'""$str);
  229.       break;
  230.       case "comment":
  231.         $str = preg_replace('/{([^ \t\r\n}]+)}/'""$str);
  232.       break;
  233.     }
  234.     
  235.     return $str;
  236.   }
  237.   /* public: p(string $varname)
  238.    * varname: name of variable to print.
  239.    */
  240.   function p($varname) {
  241.     print $this->finish($this->get_var($varname));
  242.   }
  243.   function get($varname) {
  244.     return $this->finish($this->get_var($varname));
  245.   }
  246.     
  247.   /***************************************************************************/
  248.   /* private: filename($filename)
  249.    * filename: name to be completed.
  250.    */
  251.   function filename($filename) {
  252.     if (substr($filename, 0, 1) != "/") {
  253.       $filename = $this->root."/".$filename;
  254.     }
  255.     
  256.     if (!file_exists($filename))
  257.       $this->halt("filename: file $filename does not exist.");
  258.     return $filename;
  259.   }
  260.   
  261.   /* private: varname($varname)
  262.    * varname: name of a replacement variable to be protected.
  263.    */
  264.   function varname($varname) {
  265.     return preg_quote("{".$varname."}");
  266.   }
  267.   /* private: loadfile(string $handle)
  268.    * handle:  load file defined by handle, if it is not loaded yet.
  269.    */
  270.   function loadfile($handle) {
  271.     if (isset($this->varkeys[$handle]) and !emptyempty($this->varvals[$handle]))
  272.       return true;
  273.     if (!isset($this->file[$handle])) {
  274.       $this->halt("loadfile: $handle is not a valid handle.");
  275.       return false;
  276.     }
  277.     $filename = $this->file[$handle];
  278.     $str = implode("", @file($filename));
  279.     if (emptyempty($str)) {
  280.       $this->halt("loadfile: While loading $handle, $filename does not exist or is empty.");
  281.       return false;
  282.     }
  283.     $this->set_var($handle$str);
  284.     
  285.     return true;
  286.   }
  287.   /***************************************************************************/
  288.   /* public: halt(string $msg)
  289.    * msg:    error message to show.
  290.    */
  291.   function halt($msg) {
  292.     $this->last_error = $msg;
  293.     
  294.     if ($this->halt_on_error != "no")
  295.       $this->haltmsg($msg);
  296.     
  297.     if ($this->halt_on_error == "yes")
  298.       die("Halted.");
  299.     
  300.     return false;
  301.   }
  302.   
  303.   /* public, override: haltmsg($msg)
  304.    * msg: error message to show.
  305.    */
  306.   function haltmsg($msg) {
  307.     printf("Template Error: %s
    \n"
    $msg);
  308.   }
  309. }
  310.   function savetofile ($dir,$varname){
  311.    $data=$this->finish($this->get_var($varname));
  312.    $fp=fopen($dir,"w+");
  313.    fwrite($fp,$data);
  314.   }
  315.    function renew(){
  316.     $this->varkeys=array();
  317.     $this->varvals=array();
  318.     $this->file=array();
  319.     }
  320. ?>

 测试页面:

  1. "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
  2. "Content-Type" content="text/html; charset=gb2312">
  3. 无标题文档
  4.  require("template.inc");
  5.  faction staticinfo ($id){
  6.   mysql_connection(localhost, root,);
  7.   mysql_select_db (dbname);
  8.   global $table,$template,$itpl
  9.   $rs=mysql_query("select id from $table where id=$id");
  10.   $array=mysql_fetch_query("$rs");
  11.   $target=$array[“target”];
  12.   $title=$array[“title”];
  13.   $itpl=new template;
  14.   
  15.   //分析模板
  16.   $tpl->set_file(“main”,$template);
  17.   //把模板中的{title}变量换成$title
  18.   $itpl->set_var(“title”,$title”);
  19.   //分析整个模板
  20.   $itpl->set_var(“mains”,”main”);
  21.   //把mains写入文件
  22.   $tpl->savetofile($target,"mains");
  23.   //置空
  24.   $tpl->renew();
  25. ?>

你可能感兴趣的:(PHP)