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

博客介绍了在PHP中添加两个函数,使用方法与原函数相同。声明时需指定图片路径,默认是PHP文件所在目录,且图片目录要相对于模版文件目录,模版和图片文件不能在同一级目录。还给出了相关代码示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

加了两个函数,用法和原来的一样,具体看代码里面说明。
只是在声明的时候要指定图片的路径,默认为当前目录,也就是PHP文件所在目录。
注意的是图片目录要相对于模版文件目录的,模版文件和图片文件不能在同一级目录下。 
来源:http://blog.youkuaiyun.com/kingerq
 
<?php
/*
 * Session Management for PHP3
 *
 * (C) Copyright 1999-2000 NetUSE GmbH
 *                    Kristian Koehntopp
 *
 * $Id: template.inc,v 1.5 2000/07/12 18:22:35 kk Exp $
 *
 */

class Template {
  var $classname = "Template";

  /* 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     = "";

  var $path = ".";
  /***************************************************************************/
  /* public: Constructor.
   * root:     template directory.
   * unknowns: how to handle unknown variables.
   */
  function Template($root = ".", $path = ".", $unknowns = "remove") {
    $this->setroot($root);
    $this->setpath($path);
    $this->setunknowns($unknowns);
  }
  /* 设置图片路径
   */
  function setpath($path){
    if($path == ".") return true;
    if (!is_dir($this->root . "/" . $path)) {
      $this->halt("setpath: $path is not a directory.");
      return false;
    }
   
    $this->path = $path;
    return true;
  }

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

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

  /* public: setfile(array $filelist)
   * filelist: array of handle, filename pairs.
   *
   * public: setfile(string $handle, string $filename)
   * handle: handle for a filename,
   * filename: name of template file
   */
  function setfile($handle, $filename = "") {
    if (!is_array($handle)) {
      if ($filename == "") {
        $this->halt("setfile: 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: setblock(string $parent, string $handle, string $name = "")
   * extract the template $handle from $parent,
   * place variable {$name} instead.
   */
  function setblock($parent, $handle, $name = "") {
    if (!$this->loadfile($parent)) {
      $this->halt("subst: unable to load $parent.");
      return false;
    }
    if ($name == "")
      $name = $handle;

    $str = $this->getvar($parent);
    $reg = "/<!--/s+BEGIN $handle/s+-->(.*)/n/s*<!--/s+END $handle/s+-->/sm";
    preg_match_all($reg, $str, $m);
    $str = preg_replace($reg, "{" . "$name}", $str);
    $this->setvar($handle, $m[1][0]);
    $this->setvar($parent, $str);
    $this->setvar($name);
  }
 
  /* public: forblock( string $parent, string $handle, array $values )
   * extract the template $handle from $parent,
   * values: array of variable name, value pairs.
   */
  function forblock( $parent, $handle, $values, $step = 1 ) {
    if( ! $step ) $step = 1;
    $postfix = "_postfix";
 
    if( is_array( $handle ) ) {
      for( $i = 0; $i < count( $handle ); $i++ ) {
        $this->setblock( $parent, $handle[$i], $handle[$i].$postfix );
      }
    }else {
      $this->setblock( $parent, $handle, $handle.$postfix );
    }
 
    if( ! is_array( $values ) || ! $values ) return;
 
    if( is_array( current($values) ) ){
      foreach( $values as $key => $val ) {
        $this->setvar( $val );
        if( is_array( $handle ) ) {
          $this->parse( $handle[0].$postfix, $handle[0], true );
          if( ( $key + 1 ) % $step == 0 ) {
            $this->parse( $handle[1].$postfix, $handle[1], true );
   $this->setvar( $handle[0].$postfix );
          }
        }else {
          $this->parse( $handle.$postfix, $handle, true );
        }
      }
      if( ( $key + 1 ) % $step != 0 && is_array( $handle ) ) {
        $this->parse( $handle[1].$postfix, $handle[1], true );
      }
    } else {
      $this->setvar( $values );
      $this->parse( $handle.$postfix, $handle, true );
    }
  }
 
  /* public: setvar(array $values)
   * values: array of variable name, value pairs.
   *
   * public: setvar(string $varname, string $value)
   * varname: name of a variable that is to be defined
   * value:   value of that variable
   */
  function setvar($varname, $value = "") {
    if (!is_array($varname)) {
      if (!empty($varname))
        if ($this->debug) print "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) print "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->getvar($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->setvar($target, $this->getvar($target) . $str);
      } else {
        $this->setvar($target, $str);
      }
    } else {
      reset($handle);
      while(list($i, $h) = each($handle)) {
        $str = $this->subst($h);
        $this->setvar($target, $str);
      }
    }
   
    return $str;
  }
 
  function pparse($target, $handle, $append = false) {
    print $this->parse($target, $handle, $append);
    return false;
  }
 
  /* public: getvars()
   */
  function getvars() {
    reset($this->varkeys);
    while(list($k, $v) = each($this->varkeys)) {
      $result[$k] = $this->varvals[$k];
    }
   
    return $result;
  }
 
  /* public: getvar(string varname)
   * varname: name of variable.
   *
   * public: getvar(array varname)
   * varname: array of variable names
   */
  function getvar($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: getundefined($handle)
   * handle: handle of a template.
   */
  function getundefined($handle) {
    if (!$this->loadfile($handle)) {
      $this->halt("getundefined: unable to load $handle.");
      return false;
    }
   
    preg_match_all("//{([^}]+)/}/", $this->getvar($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}]+)}/', "<!-- Template $handle: Variable //1 undefined -->", $str);
      break;
    }
   
    return $str;
  }

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

  function get($varname) {
    return $this->finish($this->getvar($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->setvar($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("<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);
  }
}
?>

<?

//这个声明表明moban目录和img目录在同一级目录下

$t = new Template("moban", "../img");



//这个表明img目录在moban目录里

$t = new Template("moban", "img");



?>

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值