logo 西林@生存 - 骑猪闯天下!
写了个模板类
2007-11-29 17:18:00 By:xling

原来在 大饺子 上,用的是 "fakezilla"使用的模板类,

但是使用起来很麻烦,经常头晕,找不到北。

昨晚回去后,我熬到快一点,写了个大概,今天又做了一些调整,终于可以使用了!

程序:

<?php
class Tpl{
 private $debugMode = true;

 private $baseDir = "";
 private $logFile = "";

 private $tpl = array();
 /*
 $tpl[] = array(
 name => "header",
 file => "header.html",
 source => "...",//原始信息。
 content => "..."//解析后的内容
 )
 */
 private $key = array();
 private $block = array();
 private $loop = array();
 /*
 block:
 <tpl tplName>content...</tpl>
 */

 public function __construct(){
  $this->baseDir = func_get_arg(0);
  $this->logFile = func_get_arg(1);
 }

 /*
 example:
 $name = array(
 "header" => "header.html",
 "footer" => "footer.html"
 );
 */
 public function load($name){
  if(is_array($name)){
   while (list($k,$v) = each($name)) {
    $this->load($k,$v);
   }

   return;
  }
  
  $name = strtoupper($name);//转换为大写
  
  if(isset($this->tpl[$name])){
   $this->debug("重复的模板名称 : $name");
  }

  $file = func_get_arg(1);
  $source = "";
  if(!is_file($this->baseDir.$file)){
   $this->debug("找不到文件 : $file 文件夹 : $this->baseDir");
   return;
  }else{
   $source = join("",@file($this->baseDir.$file));
  }

  /*
  $reg = "/<tpl(.*)>(.*)<\/tpl>/iUs";
  $s = preg_match_all($reg,"<tpl aa>aaaa<tpl>fffff</tpl></tpl>dddddddddd<tpl bb>bbbb</tpl>eeeeeeee<tpl cc>cccc</tpl>",$su);

  var_dump($su);
  */

  $blockReg = "/<!--block(.*)-->(.*)<!--\/block-->/iUs";
  if( preg_match_all( $blockReg, $source ,$ma ) ){
   while (list($k,$v) = each($ma[1])) {
    
    $blockName = strtoupper( trim($v) ); //以完全被转换成大写了!

    if (isset($this->block[$blockName])) {
     $this->debug("以载入的模板中,有重复的块名称 : $blockName");
    }

    $this->block[$blockName] = array(
    "name"   =>$blockName,
    "parentName"  => $name,
    "file"   => $file,
    "source"  => $ma[2][$k],//原始信息
    "content"  => ""//解析后的内容,初始化为空
    );
   }
  }

  $this->tpl[$name] = array(
  "name"=>$name,
  "file"=>$file,
  "source"=>$source,//原始信息
  "content"=>$source//解析后的内容,这里是初始化
  );
 }

 public function assign($key){
  if(is_array($key)){
   while(list($k,$v) = each($key)){
    $this->assign($k,$v);
   }
   return;
  }
  
  $key = strtoupper($key);//转为大写
  
  $this->key[strtoupper($key)] = func_get_arg(1);
 }

 public function parseBlock($name){
  
  $name = strtoupper($name);
  
  if(!isset($this->block[$name])){
   $this->debug("没有找到块: $name 请确认该块是否存在于以载入的模板文件中!");
   return;
  }

  $source = $this->block[$name]["source"];
  $reg = array();
  $rep = array();
  reset($this->key);
  while (list($k,$v) = each($this->key)) {
   $reg[] = "/#%$k%#/iUs";
   $rep[] = "$v";
  }
  
  $this->block[$name]["content"] .= preg_replace($reg,$rep,$source);
 }

 public function parse($name){
  
  $name = strtoupper($name);//名字大小写统一,所以不区分大小写。
  
  if(!isset($this->tpl[$name])){
   $this->debug("没有找到模板: $name ,请确认是否载入!");
   return "";
  }

  /*替换block*/
  $blockReg = "/<!--block(.*)-->(.*)<!--\/block-->/iUs";
  if(preg_match_all( $blockReg ,  $this->tpl[$name]["source"]  , $ma)){//从source中查找block
   //$ma[1]中存放所有block的名称
   //var_dump($ma[1]);
   while (list($k,$v) = each($ma[1])) {
    $blockName = strtoupper( trim($v) );
    
    if (isset($this->block[$blockName])) {
     $this->tpl[$name]["content"] = str_ireplace(// str_ireplace ....
              $ma[0][$k],////////////
              $this->block[$blockName]["content"],
              $this->tpl[$name]["content"]);
    }
   }
  }

  $reg = array();
  $rep = array();

  reset($this->key);
  while (list($k,$v) = each($this->key)) {
   $reg[] = "/#%$k%#/iUs";
   $rep[] = "$v";
  }
  
  $this->tpl[$name]["content"] = preg_replace( $reg, $rep, $this->tpl[$name]["content"]);
  return $this->tpl[$name]["content"];
 }

 protected function debug($msg){
  if(!$this->debugMode || !is_file($this->logFile)){
   return;
  }

  error_log(sprintf("%s\t%s\r\n",date("Y/m/d H:i:s"),$msg),3,$this->logFile);
 }
}
?>

模板:header.html

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>#%title%#</title>
</head>

<body>
<!--block a-->
aaaaaaa#%path%#
<br />
aaaaaaaaaa#%title%#
<br />
<!--/block-->

<select>
<!--block b-->
<option>#%i%#</option>
<!--/block-->
</select>


<select>
<!--block c-->
<option>#%i%#</option>
<!--/block-->

<!--block d-->
<option>#%i%#</option>
<!--/block-->
</select>

模板:footer.html

#%path%##%title%#


</body>
</html>

调用(别给我说我没有调用Tpl.inc.php,如果你这样认为的话,请查:__autoload

<?php
include("common.inc.php");
$tpl = new Tpl("tplTest/","tplLog.log");
$tpl->load(array(
 "header" => "header.html",
 "footer" => "footer.html"
));

$tpl->assign(array(
 "title" => "Dajiaozi!",
 "path" => "js/lib/JObj/"
));

$tpl->parseBlock("a");
for($i=2;$i>=0;$i--){
 $tpl->assign("i",$i);
 $tpl->parseBlock("b");
 
 $tpl->assign("i",$i + 1);
 $tpl->parseBlock("B"); 
}

$tpl->parseBlock("c");

echo $tpl->parse("header");
echo $tpl->parse("footer");
?>

上面这个只是个例子,没有实用价值,下面在给个 大饺子 中的程序:

<?php
require_once("../common.inc.php");

$tpl = new Tpl(PATH_FULL.Config::DIR_TEMPLATE ,PATH_FULL.Config::FILE_TEMPLATE_LOG);
$tpl->load(array(
 "header" => "header.html",
 "menu"  => "menu.html",
 "holler" => "holler/holler.html",
 "hollerJs" => "holler/hollerJs.html",
 "footer" => "footer.html",
 "customJs" => "error/customJs.html",
 "pagination" => "pagination.html"
));

$tpl->assign(array(
 "title" => "我要\"小声\"叫喊  ".Config::TITLE_DOMAIN,
 "path" => PATH_BASE_ROOT,
 "formAction" => PATH_BASE_ROOT."holler/do.php?".FORM_KEY_ACTION."=".FORM_KEY_ADD
));

$tpl->parseBlock("tplOtherPlus");

$page = Holler::getList();
$result = $page->process();

$tpl->assign(array(
 "recordNum" => $page->recordNum,
 "totalPage" => $page->totalPage,
 "currPage" => $page->currPage,
 "pageSize" => $page->pageSize,
 "rangeS" => $page->rangeS,
 "rangeE" => $page->rangeE,
 "pageLabels" => $page->exportPageLabel()
));
$pagination = $tpl->parse("pagination");

$tpl->assign("pagination",$pagination);


while ($row = mysql_fetch_array($result)){

 $tpl->assign(array(
  "hollerTitle" => $row["TITLE"],
  "hollerContent" => nl2br( htmlspecialchars($row["CONTENT"])),
  "hollerId"  => $row["ID"],
  "hollerTime" => $row["PUB_DATE"],
  "hollerIP"  => $row["IP"],
 ));
 $tpl->parseBlock("tplHollerList");
}

$tpl->parseBlock("tplHollerNew");

echo $tpl->parse("header");
echo $tpl->parse("menu");
echo $tpl->parse("holler");
echo $tpl->parse("hollerJs");
echo $tpl->parse("footer");

ReWrite::flush();
?>

转我的贴,写你的名,是一种可耻的行为!请不要让我BS你!
阅读全文 | 回复(0) | 引用通告 | 编辑

发表评论:

    密码:
    主页:
    标题:
    页面数据正在载入...
<<  < 2008 - 11 >  >>
        1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30
Placard
请职:PHP或JS都行,如果学历要求本科的,请直接忽略。谢谢。 有意者请联系:1fairy1#163.com
Logon System
Search
Info about this blog
Others
myDream
JGrid

数据表格
JTree

树状控件
JMenuTab

标签控件(滑动门)
JTrackBar / JScroll

滑动条/模拟滚动条
JAccordion

(QQ菜单)
关于:
xling,也叫xlingFairy 艾克司令 西林.
Email:1fairy1#163.com
喜欢javascript,喜欢java(汗...还在学习中...水平菜的要死...)
bxna 京ICP备05002321号