从康盛产品(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 相关文章推荐
用ODBC的分页显示
Oct 09 PHP
PHP运行模式的深入理解
Jun 03 PHP
smarty中js的调用方法示例
Oct 27 PHP
浅谈php冒泡排序
Dec 30 PHP
PHP中使用Imagick读取pdf并生成png缩略图实例
Jan 21 PHP
分享PHP函数实现数字与文字分页代码
Jul 28 PHP
thinkphp3.x中变量的获取和过滤方法详解
May 20 PHP
详解PHP安装mysql.so扩展的方法
Dec 31 PHP
php使用Jpgraph创建柱状图展示年度收支表效果示例
Feb 15 PHP
php实时倒计时功能实现方法详解
Feb 27 PHP
laravel5.4利用163邮箱发送邮件的步骤详解
Sep 22 PHP
在laravel中实现事务回滚的方法
Oct 10 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
服务器端解压缩zip的脚本
2006/12/22 PHP
PHP入门学习的几个不错的实例代码
2008/07/13 PHP
发款php蜘蛛统计插件只要有mysql就可用
2010/10/12 PHP
PHP PDO fetch 模式各种参数的输出结果一览
2015/01/07 PHP
使用ThinkPHP的自动完成实现无限级分类实例详解
2016/09/02 PHP
tp5(thinkPHP5)框架连接数据库的方法示例
2018/12/24 PHP
js控制框架刷新
2008/08/01 Javascript
ext checkboxgroup 回填数据解决
2009/08/21 Javascript
JavaScript 笔记二 Array和Date对象方法
2010/05/22 Javascript
JavaScript中为元素加上name属性的方法
2011/05/09 Javascript
formvalidator验证插件中有关ajax验证问题
2013/01/04 Javascript
利用JS进行图片的切换即特效展示图片
2013/12/03 Javascript
angularJS 中$attrs方法使用指南
2015/02/09 Javascript
通过隐藏iframe实现无刷新上传文件操作
2016/03/16 Javascript
Vue.js 父子组件通讯开发实例
2016/09/06 Javascript
js常用DOM方法详解
2017/02/04 Javascript
js中事件对象和事件委托的介绍
2019/01/21 Javascript
JS实现给数组对象排序的方法分析
2019/06/24 Javascript
原生JS无缝滑动轮播图
2019/10/22 Javascript
vue中注册自定义的全局js方法
2019/11/15 Javascript
[01:00:26]Ti4主赛事胜者组第一天 EG vs NEWBEE 1
2014/07/19 DOTA
[01:11:21]DOTA2-DPC中国联赛 正赛 VG vs Elephant BO3 第一场 3月6日
2021/03/11 DOTA
Python字符串处理的8招秘籍(小结)
2019/08/13 Python
Python使用百度api做人脸对比的方法
2019/08/28 Python
Python3 实现爬取网站下所有URL方式
2020/01/16 Python
pytorch进行上采样的种类实例
2020/02/18 Python
python3列表删除大量重复元素remove()方法的问题详解
2021/01/04 Python
HTC VIVE美国官网:VR虚拟现实眼镜
2018/02/13 全球购物
加拿大的标志性百货公司:Hudson’s Bay(哈得逊湾)
2019/09/03 全球购物
智乐游戏测试笔试题
2014/05/21 面试题
介绍一下XMLHttpRequest对象
2012/02/12 面试题
教师自我鉴定
2013/12/13 职场文书
本科生求职信
2014/06/17 职场文书
一次性工伤赔偿协议书范本
2014/11/25 职场文书
民主生活会汇报材料
2014/12/15 职场文书
新闻发布会新闻稿
2015/07/17 职场文书