文章详情

  • 游戏榜单
  • 软件榜单
关闭导航
热搜榜
热门下载
热门标签
php爱好者> php文档>phplib template 中文注释

phplib template 中文注释

时间:2006-11-23  来源:webvista


?php
/**
* phplib
*
* 潘春孟注释于2006.11.20 gb2312
* 联系QQ:121169238
*
* @author
* @copyright
* @version
*/
class Template {
    var $classname = "Template";
    var $debug = false; // 是否调试
    var $file = array(); // 包含了所有的模板文件名和模板名的数组
    var $root = ""; // root为模板文件的存放目录
    var $varkeys = array(); // 存放文本元素的键名
    var $varvals = array(); // 存放文本元素的值
    var $unknowns = "remove"; // 如何处理未知的变量
    var $halt_on_error = "yes"; // yes/no 报告错误,继续运行/忽略错误
    var $last_error = ""; // 上一次的错误保存在这里
    /**
     * 构造函数
     * 默认将文件目录设置为相同的目录
     * unknowns默认设置为"remove"
     *
     * @param String $root
     * @param Const $unknowns
     * @return Template
     */
    function Template($root = ".", $unknowns = "remove") {
        $this->set_root($root);
        $this->set_unknowns($unknowns);
    }
    /**
     * 设置根目录
     *
     * @param String $root
     * @return bool
     */
    function set_root($root) {
        if (!is_dir($root)) {
            $this->halt("set_root: $root is not a directory.");
        return false;
        }
   
        $this->root = $root;
        return true;
    }
    /**
     * 对未知变量的处理
     *
     * @param Const $unknowns
     */
    function set_unknowns($unknowns = "keep") {
        $this->unknowns = $unknowns; // "remove|keep"
    }
    /**
     * 该方法在数组$file中根据$handle提供的键名加入值
     *
     * @param String $handle
     * @param String $filename
     * @return bool(false) | no
     */
    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);
            }
       }
    }
    /**
     * 取出某个父模板文件中的一个子模板,将其作为块来加载,并用另外一个模板变量取代之
     *
     * @param String $parent 模板文件
     * @param String $handle 文件的句柄
     * @param String $name 子模板文件
     * @return bool | no
     */
    function set_block($parent, $handle, $name = "") {
        if (!$this->loadfile($parent)) {
            $this->halt("错误: 找不到模板 $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]);
        $this->set_var($parent, $str);
    }
  
    /**
     * 向$varname和varkeys数组中添加新的键-值对
     *
     * @param String $varname 将被定义的变量名
     * @param String $value 变量的值
     */
    function set_var($varname, $value = "") {
        if (!is_array($varname)) {
            if (!empty($varname))
                 if ($this->debug) print "scalar: set *$varname* to *$value*
\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) print "array: set *$k* to *$v*
\n";
                $this->varkeys[$k] = "/".$this->varname($k)."/";
                $this->varvals[$k] = $v;
           }
       }
    }
  /**
   * 将模板文件中的变化内容替换成确定内容的操作,实现数据和显示的分离
   * 标签=>详细内容
   *
   * @param String $handle 模板名
   * @return bool
   */
  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;
  }
  /**
   * 同subst,只是直接输出结果
   *
   * @param String $handle 模板名
   * @return bool
   */
  function psubst($handle) {
    print $this->subst($handle);
   
    return false;
  }
  /**
   * 将$handle代表的一个或多个文件中的内容完成替换.
   * 存放在$target为键值的varvals成员数组无素中或追加到其后
   * @param mixed $target
   * @param String $handle
   * @param bool $append
   * @return mixed
   */
  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;
  }
  
  /**
   * 同parse方法,只是该方法将结果输出
   *
   * @param mixed $target
   * @param String $handle
   * @param Bool $append
   * @return bool
   */
  function pparse($target, $handle, $append = false) {
    print $this->parse($target, $handle, $append);
    return false;
  }
  /**
   * 返回所有的键-值对中的值所组成的数组
   *
   * @return mixed
   */
  function get_vars() {
    reset($this->varkeys);
    while(list($k, $v) = each($this->varkeys)) {
      $result[$k] = $this->varvals[$k];
    }
   
    return $result;
  }
  /**
   * 根据键名返回对应的键一值勤对应的值
   *
   * @param mixed $varname
   * @return mixed
   */
  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;
    }
  }
  /**
   * 如果加载文件失败,返回错误并停止
   *
   * @param String $handle
   * @return bool
   */
  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;
  }
  /**
   * 完成对$str的最后的处理工作,利用类的属性$unknowns来确定对模板中无法处理的动态部分的处理方法
   *
   * @param String $str
   * @return String
   */
  function finish($str) {
    switch ($this->unknowns) {
      case "keep":
      break;
      
      case "remove":
        $str = preg_replace('/{[^ \t\r\n}]+}/', "", $str);
      break;
      case "comment":
        $str = preg_replace('/{([^ \t\r\n}]+)}/', "", $str);
      break;
    }
   
    return $str;
  }
  /**
   * 将参数变量对应的数组中的值处理后输出
   *
   * @access public
   * @param mixed $varname
   */
  function p($varname) {
    print $this->finish($this->get_var($varname));
  }
  /**
   * 参数变量对应的数组中的值处理后返回
   *
   * @access public
   * @param mixed $varname
   * @return mixed
   */
  function get($varname) {
    return $this->finish($this->get_var($varname));
  }
   
  /**
   * 检查并补充给定的文件名
   * 如果文件名前没有"/",这函数给补上"/"
   *
   * @access public
   * @param String $filename
   * @return String
   */
  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;
  }
  /**
   * 对变量名进行处理,将正则表达式中的敏感字符变为转义字符,并在变量名两端加上大括号
   *
   * @access public
   * @param String $varname
   * @return String
   */
  function varname($varname) {
    return preg_quote("{".$varname."}");
  }
  /**
   * 根据$varname加载文件到键-值对中
   *
   * @access public
   * @param mixed $handle
   * @return bool
   */
  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;
  }
  /**
   * 出错提示并终止程序运行
   *
   * @access public
   * @param mixed $msg
   * @return bool
   */
  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;
  }
  
  /**
   * 出错提示,以printf()格式输出参数$msg
   *
   * @access public
   * @param mixed $msg
   */
  function haltmsg($msg) {
    printf("Template Error: %s
\n", $msg);
  }
  
  
}
?>



++

  
    /**
     * 将结果写入变量
     * 根据键名$varname提供的变量进行最后处理后写入变量
     *
     * @access public
     * @param string $varname
     * @return string
     */
    function putVar($varname) {
        $newvar = $this->finish($this->get_var($varname));
     return $newvar;
    }
  /**
   * 写入文件
   * 将$handle代表的一个或多个文件中的内容写入文件
   *
   * @access public
   * @param string $filename
   * @param mixed $target  键名
   * @param mixed $handle  
   * @param string $sdir   目录
   * @return bool|no
   */
  function makeHtml($filename,$target,$handle,$sdir="./") {
    if (!is_dir($sdir)) {
        exit("error: $sdir is not a directory.");
        return false;
    }
$fp =  @fopen($sdir."/".$filename,"w");
    @fwrite($fp, $this->parse($target, $handle));
    @fclose($fp);
    // PHP5用file_put_contents() ,  === fopen()+fwrite()+fclose(), 可提高性能
  }



相关阅读 更多 +
排行榜 更多 +
幸运硬币官方正版下载

幸运硬币官方正版下载

休闲益智 下载
宝宝来找茬手机版 v9.86.00.00 安卓版

宝宝来找茬手机版 v9.86.00.00 安卓版

休闲益智 下载
翻滚飞机大战最新版 v1.0.4 安卓版

翻滚飞机大战最新版 v1.0.4 安卓版

飞行射击 下载