从康盛产品(discuz)提取出来的模板类

<div class="codetitle"><a style="CURSOR: pointer" data="4282" class="copybut" id="copybut4282" onclick="doCopy('code4282')"> 代码如下:

<div class="codebody" id="code4282">
<?php
/template.class.php
@康盛微博 模板提取类 觉得这个模板好用 花些时间独立出来。 by 雷日锦
@看了一下ctt 这个模板 跟 phpcms的模板类似 难道?? ^_^ 嘿嘿!!!
@ 微博 http://weibo.com/lrjxgl
@ 好东西大家共享 磕磕绊绊的提取出来 有问题请提出来
@ 模板文件默认为 .htm
$tpl = new template('skin',"default");
$tpl->objdir='tpp';
$tpl->rewrite=true;//开启rewrite 需要服务器支持
$tpl->rewrite_rule=array(array("/index.php/"),array("index.html")); //rewrite规则
$tpl->assign("indexurl","index.php");
$tpl->assign("str","我是字符串啦啦啦");
$tpl->assign("ec","我是被echo出来的");
$tpl->assign("subhtml","{subtpl ttt}这是用来引入一个模板文件的,这个就是引入ttt.htm");
$tpl->assign("a",array('dasdasd'.'bbbbbbb','cccccccccccccc'));
$tpl->assign("i",1);
$tpl->display("index");
/
if(!defined("CHARSET")) define("CHARSET","gb2312");//字符编码
if(!defined("DIR_TPL")) define("DIR_TPL","tpl");//默认模板目录
if(!defined("DIR_DATA")) define("DIR_DATA","data");//默认数据目录
if(!defined("DEBUG")) define("DEBUG",0);//默认运行模式
class template {
//note var
public $rewrite=false;//是否开启 伪静态 rewrite
public $rewrite_rule=array(); //设置伪静态规则
public $defaulttpldir;//默认的模板
public $tpldir;//模板目录
public $objdir;//编译缓存目录
public $tplfile;//模板文件
public $objfile;//编译文件
public $tplid=1;//模板编号
public $currdir='default';//当前风格目录
public $vars=array();//note 变量表
public $removeblanks=false;//移除空格
public $stdout='display';//输出类型
function construct($tplid,$currdir) {
$this->template($tplid,$currdir);
}
function template($tplid,$currdir) {
ob_start();
if(file_exists(DIR_TPL.'/'.$currdir)) {
$this->currdir = $currdir;
$this->tplid = $tplid;
} else {
$this->currdir = 'default';
$this->tplid = 1;
}
$this->defaulttpldir = DIR_TPL.'/default';
$this->tpldir = DIR_TPL.'/'.$this->currdir;
$this->objdir = DIR_DATA.'/cache/tpl';
if(version_compare(PHP_VERSION,'5') == -1) {
register_shutdown_function(array(&$this,'
destruct'));
}
}
//note publlic
function assign($k,$v) {
$this->vars[$k] = $v;
}
//note publlic
function display($file) {
extract($this->vars,EXTRSKIP);
include $this->getObj($file);
}
function getObj($file,$tpldir = '') {
$subdir = ($pos = strpos($file,'/')) === false ? '' : substr($file,$pos);
$file = $subdir ? substr($file,$pos + 1) : $file;
$this->tplfile = ($tpldir ? $tpldir : $this->tpldir).'/'.($subdir ? $subdir.'/' : '').$file.'.htm';
$this->objfile = $this->objdir.'/'.($tpldir ? '' : $this->tplid.'
').($subdir ? $subdir.'_' : '').$file.'.php';
//note 默认目录
if(@filemtime($this->tplfile) === FALSE) {
$this->tplfile = $this->defaulttpldir.'/'.($subdir ? $subdir.'/' : '').$file.'.htm';
}
//note 判断是否比较过期
if(!file_exists($this->objfile) || DEBUG && @filemtime($this->objfile) < filemtime($this->tplfile)) {
$this->compile();
}
return $this->objfile;
}
function getTpl($file) {
$subdir = ($pos = strpos($file,$pos + 1) : $file;
$tplfile = $this->tpldir.'/'.($subdir ? $subdir.'/' : '').$file.'.htm';
if(@filemtime($tplfile) === FALSE) {
$tplfile = $this->defaulttpldir.'/'.($subdir ? $subdir.'/' : '').$file.'.htm';
}
return $tplfile;
}
function compile() {
$varregexp = "\@?\\$[a-zA-Z]\w(?:[[\w.\"\'[]\$]+])";
$vtagregexp = "\<\?=(\@?\\$[a-zA-Z]\w(?:[[\w.\"\'[]\$]+]))\?>";
$const_regexp = "{([\w]+)}";
$template = file_get_contents($this->tplfile);
for($i = 1; $i <= 3; $i++) {
if(strpos($template,'{subtpl') !== FALSE) {
if(DEBUG == 2) {
$template = str_replace('{subtpl ','{tpl ',$template);
} else {
$template = pregreplace("/[\n\r\t]*{subtpl\s+([a-z0-9:\/]+)}[\n\r\t]/ies","file_get_contents(\$this->getTpl('\1'))",$template);
}
}
}
$remove = array(
'/(^|\r|\n)\/*.+?(\r|\n)*\/(\r|\n)/is',
'/\/\/note.+?(\r|\n)/i',
'/\/\/debug.+?(\r|\n)/i',
'/(^|\r|\n)(\s|\t)+/',
'/(\r|\n)/',
);
$this->removeblanks && $template = preg_replace($remove,'',$template);
$template = preg_replace("/\<!--{(.+?)}-->/s","{\1}",$template);
$template = preg_replace("/{($var_regexp)}/","<?=\1?>",$template);
$template = preg_replace("/{($const_regexp)}/",$template);
$template = preg_replace("/(?<!\<\?\=|\\)$var_regexp/","<?=\0?>",$template);
$template = pregreplace("/\<\?=(\@?\\$[a-zA-Z]\w
)(([[\$[]\w]+])+)\?>/ies","\$this->arrayindex('\1','\2')",$template);
$template = preg_replace("/{{eval (.?)}}/ies","\$this->stripvtag('<? \1?>')",$template);
$template = preg_replace("/{eval (.
?)}/ies",$template);
$template = preg_replace("/[\n\r\t]{echo\s+(.+?)}[\n\r\t]/ies","\$this->stripvtag('<? echo \1; ?>','')",$template);
$template = preg_replace("/{for (.?)}/ies","\$this->stripvtag('<? for(\1) {?>')",$template);
$template = preg_replace("/{elseif\s+(.+?)}/ies","\$this->stripvtag('<? } elseif(\1) { ?>')",$template);
for($i=0; $i<2; $i++) {
$template = preg_replace("/{loop\s+$vtag_regexp\s+$vtag_regexp\s+$vtag_regexp}(.+?){\/loop}/ies","\$this->loopsection('\1','\2','\3','\4')",$template);
$template = preg_replace("/{loop\s+$vtag_regexp\s+$vtag_regexp}(.+?){\/loop}/ies",'\3')",$template);
}
$template = preg_replace("/{if\s+(.+?)}/ies","\$this->stripvtag('<? if(\1) { ?>')",$template);
$template = preg_replace("/{tpl\s+(\w+?)}/is","<? include \$this->getObj(\"\1\");?>",$template);
$template = preg_replace("/{tpl\s+(.+?)}/ise","\$this->stripvtag('<? include \$this->getObj(\"\1\"); ?>')",$template);
$template = preg_replace("/{tmptpl\s+(\w+?)}/is","<? include \$this->getObj(\"\1\",\$this->objdir);?>",$template);
$template = preg_replace("/{tmptpl\s+(.+?)}/ise","\$this->stripvtag('<? include \$this->getObj(\"\1\",\$this->objdir); ?>')",$template);
$template = preg_replace("/{else}/is","<? } else { ?>",$template);
$template = preg_replace("/{\/if}/is","<? } ?>",$template);
$template = preg_replace("/{\/for}/is",$template);
$template = preg_replace("/$const_regexp/",$template);//note {else} 也符合常量格式,此处要注意先后顺序
$template = pregreplace("/(\\$[a-zA-Z]\w+[)([a-zA-Z_]\w+)]/i","\1'\2']",$template);
$fp = fopen($this->objfile,'w');
fwrite($fp,$template);
fclose($fp);
}
function arrayindex($name,$items) {
$items = pregreplace("/[([a-zA-Z]\w
)]/is","['\1']",$items);
return "<?=$name$items?>";
}
function stripvtag($s) {
$vtagregexp = "\<\?=(\@?\\$[a-zA-Z]\w(?:[[\w.\"\'[]\$]+]))\?>";
return preg_replace("/$vtag_regexp/is","\1",str_replace("\\"",'"',$s));
}
function loopsection($arr,$k,$v,$statement) {
$arr = $this->stripvtag($arr);
$k = $this->stripvtag($k);
$v = $this->stripvtag($v);
$statement = str_replace("\\"",$statement);
return $k ? "<? foreach((array)$arr as $k => $v) {?>$statement<?}?>" : "<? foreach((array)$arr as $v) {?>$statement<? } ?>";
}
function __destruct() {
$content = ob_get_contents();
//处理 rewrite
if($this->rewrite) {
$arr=$this->rewrite_rule;
$s=$arr[0];
$e=$arr[1];
$content=preg_replace($s,$e,$content);
}
ob_end_clean();
echo $content;
}
}
$tpl = new template('skin',1);
$tpl->display("index");
?>

新建 tpl/default/index.html
<div class="codetitle"><a style="CURSOR: pointer" data="95996" class="copybut" id="copybut95996" onclick="doCopy('code95996')"> 代码如下:
<div class="codebody" id="code95996">
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"&gt;
<html xmlns="http://www.w3.org/1999/xhtml"&gt;


无标题文档

1.字符串赋值 :

{$str}


2.数组赋值 :

{loop $a $v}{$v},{/loop}
或者

{loop $a $key $val }{$val},{/loop} 3.{$subhtml}

{subtpl ttt}

4.原来我是{$indexurl } 现在我被变成了index.php

5.我还可以 echo 出来呢

{echo $ec}

6.其实我还可以加减乘除的 678
{echo 678;}
7.常用的就这些了 还有什么不懂的



新建 tpl/default/ttt.html
新建 tpp目录 ok了

模板类

相关文章

文章浏览阅读8.4k次,点赞8次,收藏7次。SourceCodester Onl...
文章浏览阅读3.4k次,点赞46次,收藏51次。本文为大家介绍在...
文章浏览阅读1.1k次。- php是最优秀, 最原生的模板语言, 替代...
文章浏览阅读1.1k次,点赞18次,收藏15次。整理K8s网络相关笔...
文章浏览阅读1.2k次,点赞22次,收藏19次。此网络模型提供了...
文章浏览阅读1.1k次,点赞14次,收藏19次。当我们谈论网络安...