您好,欢迎访问一九零五行业门户网

给PHPLIB模版加两个函数,解决模版文件内图片、CSS和JS包括路径问题

加了两个函数,用法和原来的一样,具体看代码里面说明。
只是在声明的时候要指定图片的路径,默认为当前目录,也就是php文件所在目录。
注意的是图片目录要相对于模版文件目录的,模版文件和图片文件不能在同一级目录下。
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     = ;
  var $path = .;
  /*********************************/
  /* public: constructor.
   * root:     template directory.
   * unknowns: how to handle unknown variables.
   */
  function template($root = ., $path = ., $unknowns = remove) {
    $this->set_root($root);
    $this->set_path($path);
    $this->set_unknowns($unknowns);
  }
  /* 设置图片路径
   */
  function set_path($path){
    if($path == .) return true;
    if (!is_dir($this->root . / . $path)) {
      $this->halt(set_path: $path is not a directory.);
      return false;
    }
    $this->path = $path;
    return true;
  }
  /* 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 = /(.*)\ns*/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);
    $this->set_var($name);
  }
/* 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) 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;
      }
    }
  }
  /* 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) {
    print $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) {
    print $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('/{[^ \t\r\n}]+}/', , $str);
      break;
      case comment:
        $str = preg_replace('/{([^ \t\r\n}]+)}/', , $str);
      break;
    }
    return $str;
  }
  /* public: p(string $varname)
   * varname: name of variable to print.
   */
  function p($varname) {
    print $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($filename, 0, 1) != /) {
      $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;
    }
    $str = $this->parsepath($str);//替换图片路径
    $this->set_var($handle, $str);
    return true;
  }
  /*  重新分析替换模版目录下指定路径(一般为图片文件路径)
   */
  function parsepath($str = ){
      if(/ != substr($this->path, -1)){
        $this->path .= /;
    }
    if(./ == $this->path) return $str;
    $str = preg_replace(|.$this->path.|, $this->root./.$this->path, $str);
    return $str;
  }
  /**********************/
  /* 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(halted.);
    return false;
  }
/* public, override: haltmsg($msg)
   * msg: error message to show.
   */
  function haltmsg($msg) {
    printf(template error: %s
\n, $msg);
  }
}
?>
//这个声明表明moban目录和img目录在同一级目录下
$t = new template(moban, ../img);
//这个表明img目录在moban目录里
$t = new template(moban, img);
?>
其它类似信息

推荐信息