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


Posted in PHP onJune 28, 2011
<?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, 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)\}/", "<?=\\1?>", $template); 
$template = preg_replace("/\{($const_regexp)\}/", "<?=\\1?>", $template); 
$template = preg_replace("/(?<!\<\?\=|\\\\)$var_regexp/", "<?=\\0?>", $template); 
$template = preg_replace("/\<\?=(\@?\\\$[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", "\$this->stripvtag('<? \\1?>')", $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", "\$this->loopsection('\\1', '', '\\2', '\\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/", "<?=\\1?>", $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 "<?=$name$items?>"; 
} 
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 ? "<? 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',"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
<!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=gb2312" /> 
<title>无标题文档</title> 
</head> <body> 
1.字符串赋值 :<br /> 
{$str} 
<br /> 
2.数组赋值 :<br /> 
{loop $a $v}{$v},{/loop} 
或者<br /> 
{loop $a $key $val }{$val},{/loop} 
3.{$subhtml}<br /> 
{subtpl ttt}<br /> 
4.原来我是{$indexurl } 现在我被变成了index.php<br /> 
5.我还可以 echo 出来呢<br /> 
{echo $ec}<br /> 
6.其实我还可以加减乘除的 6*7*8 
{echo 6*7*8;} 
7.常用的就这些了 还有什么不懂的 <br /> 
</body> 
</html>

新建 tpl/default/ttt.html
新建 tpp目录 ok了
PHP 相关文章推荐
dedecms模板标签代码官方参考
Mar 17 PHP
php Sql Server连接失败问题及解决办法
Aug 07 PHP
PHP 采集程序原理分析篇
Mar 05 PHP
php 获取全局变量的代码
Apr 21 PHP
PHP中使用数组实现堆栈数据结构的代码
Feb 05 PHP
PHP实现显示照片exif信息的方法
Jul 11 PHP
PHP操作MySQL的mysql_fetch_* 函数的常见用法教程
Dec 25 PHP
PHP中时间加减函数strtotime用法分析
Apr 26 PHP
Laravel框架生命周期与原理分析
Jun 12 PHP
PHP利用Mysql锁解决高并发的方法
Sep 04 PHP
java解析json方法总结
May 16 PHP
如何用PHP实现多线程编程
May 26 PHP
php skymvc 一款轻量、简单的php
Jun 28 #PHP
关于php mvc开发模式的感想
Jun 28 #PHP
yii框架源码分析之创建controller代码
Jun 28 #PHP
关于PHP中Object对象的笔记分享
Jun 28 #PHP
php dirname(__FILE__) 获取当前文件的绝对路径
Jun 28 #PHP
php新建文件自动编号的思路与实现
Jun 27 #PHP
调整优化您的LAMP应用程序的5种简单方法
Jun 26 #PHP
You might like
PHP学习之PHP表达式
2006/10/09 PHP
php REMOTE_ADDR之获取访客IP的代码
2008/04/22 PHP
使用VisualStudio开发php的图文设置方法
2010/08/21 PHP
PHP 函数执行效率的小比较
2010/10/17 PHP
使用php实现截取指定长度
2013/08/06 PHP
php实现的操作excel类详解
2016/01/15 PHP
PHP filesize函数用法浅析
2019/02/15 PHP
js获得指定控件输入光标的坐标兼容IE,Chrome,火狐等多种主流浏览器
2013/05/21 Javascript
屏蔽script注入小例子
2013/11/12 Javascript
jQuery获得子元素个数的方法
2015/04/14 Javascript
js实现选中复选框文字变色的方法
2015/08/14 Javascript
javascript中SetInterval与setTimeout的定时器用法
2015/08/24 Javascript
jQuery三级下拉列表导航菜单代码分享
2020/04/15 Javascript
js命名空间写法示例
2015/12/18 Javascript
Angularjs实现分页和分页算法的示例代码
2016/12/23 Javascript
JS+canvas动态绘制饼图的方法示例
2017/09/12 Javascript
帝国cms首页列表页实现点赞功能
2017/10/30 Javascript
Vue项目中设置背景图片方法
2018/02/21 Javascript
VSCode搭建React Native环境
2020/05/07 Javascript
Python 条件判断的缩写方法
2008/09/06 Python
详解Python中的循环语句的用法
2015/04/09 Python
在Python的Flask框架中构建Web表单的教程
2016/06/04 Python
Anaconda2下实现Python2.7和Python3.5的共存方法
2018/06/11 Python
Python实现点阵字体读取与转换的方法
2019/01/29 Python
对python For 循环的三种遍历方式解析
2019/02/01 Python
python matplotlib中的subplot函数使用详解
2020/01/19 Python
Jupyter Notebook远程登录及密码设置操作
2020/04/10 Python
波兰运动鞋网上商店:Distance.pl
2020/07/30 全球购物
链表面试题-一个链表的结点结构
2015/05/04 面试题
科研课题实施方案
2014/03/18 职场文书
开展批评与自我批评发言材料
2014/05/15 职场文书
2014年师德承诺书
2014/05/23 职场文书
2014年药店工作总结
2014/11/20 职场文书
2014年干部培训工作总结
2014/12/17 职场文书
工会经费申请报告
2015/05/15 职场文书
解决Pytorch修改预训练模型时遇到key不匹配的情况
2021/06/05 Python