极品分享

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

template.class.php

/*template.class.php 
@康盛微博 模板提取类 觉得这个模板好用 花些时间独立出来。
@看了一下ctt 这个模板 跟 phpcms的模板类似
@ 模板文件默认为 .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, EXTR_SKIP); 
include $this->getObj($file); 
} 
function getObj($file, $tpldir = '') { 
$subdir = ($pos = strpos($file, '/')) === false ? '' : substr($file, 0, $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, '/')) === false ? '' : substr($file, 0, $pos); 
$file = $subdir ? substr($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() { 
$var_regexp = "\@?\\\$[a-zA-Z_]\w*(?:\[[\w\.\"\'\[\]\$]+\])*"; 
$vtag_regexp = "\<\?=(\@?\\\$[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 = preg_replace("/[\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)\}/", "", $template); 
$template = preg_replace("/\{($const_regexp)\}/", "", $template); 
$template = preg_replace("/(?", $template); 
$template = preg_replace("/\<\?=(\@?\\\$[a-zA-Z_]\w*)((\[[\\$\[\]\w]+\])+)\?\>/ies", "\$this->arrayindex('\\1', '\\2')", $template); 
$template = preg_replace("/\{\{eval (.*?)\}\}/ies", "\$this->stripvtag('')", $template); 
$template = preg_replace("/\{eval (.*?)\}/ies", "\$this->stripvtag('')", $template); 
$template = preg_replace("/[\n\r\t]*\{echo\s+(.+?)\}[\n\r\t]*/ies", "\$this->stripvtag('','')", $template); 
$template = preg_replace("/\{for (.*?)\}/ies", "\$this->stripvtag('')", $template); 
$template = preg_replace("/\{elseif\s+(.+?)\}/ies", "\$this->stripvtag('')", $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", "\$this->loopsection('\\1', '', '\\2', '\\3')", $template); 
} 
$template = preg_replace("/\{if\s+(.+?)\}/ies", "\$this->stripvtag('')", $template); 
$template = preg_replace("/\{tpl\s+(\w+?)\}/is", "getObj(\"\\1\");?>", $template); 
$template = preg_replace("/\{tpl\s+(.+?)\}/ise", "\$this->stripvtag('getObj(\"\\1\"); ?>')", $template); 
$template = preg_replace("/\{tmptpl\s+(\w+?)\}/is", "getObj(\"\\1\", \$this->objdir);?>", $template); 
$template = preg_replace("/\{tmptpl\s+(.+?)\}/ise", "\$this->stripvtag('getObj(\"\\1\", \$this->objdir); ?>')", $template); 
$template = preg_replace("/\{else\}/is", "", $template); 
$template = preg_replace("/\{\/if\}/is", "", $template); 
$template = preg_replace("/\{\/for\}/is", "", $template); 
$template = preg_replace("/$const_regexp/", "", $template);//note {else} 也符合常量格式,此处要注意先后顺序 
$template = preg_replace("/(\\\$[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 = preg_replace("/\[([a-zA-Z_]\w*)\]/is", "['\\1']", $items); 
return ""; 
} 
function stripvtag($s) { 
$vtag_regexp = "\<\?=(\@?\\\$[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 ? " $v) {?>$statement" : "$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',"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"); 
?>



新建 tpl/default/index.html

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.其实我还可以加减乘除的 6*7*8 
{echo 6*7*8;} 
7.常用的就这些了 还有什么不懂的



新建 tpl/default/ttt.html 

新建 tpp目录 ok了 




2019-11-18 0 /
PHP学习
/
标签: 

评论回复

回到顶部