igaofen

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

一、config.inc.php 模版的相关配置变量
//模板相关配置
define('TPL_ROOT', PHPCMS_ROOT.'templates/'); //模板保存物理路径
define('TPL_NAME', 'default'); //当前模板方案目录
define('TPL_CSS', 'default'); //当前样式目录
define('TPL_CACHEPATH', PHPCMS_ROOT.'data/cache_template/'); //模板缓存物理路径
define('TPL_REFRESH', 1); //是否开启模板缓存自动刷新

二、global.func.php 的相关调用函数
//模版调用函数(模块名,模版名,是否tag)
function template($module = 'phpcms', $template = 'index', $istag = 0) {
//模板编译命名规则
$compiledtplfile = TPL_CACHEPATH.$module.'_'.$template.'.tpl.php';
//判断模版生成文件是否过期,或不存在,否则重新生成
if(TPL_REFRESH && (!file_exists($compiledtplfile) || @filemtime(TPL_ROOT.TPL_NAME.'/'.$module.'/'.$template.'.html') > @filemtime($compiledtplfile) || @filemtime(TPL_ROOT.TPL_NAME.'/tag.inc.php') > @filemtime($compiledtplfile)))
{
//调用模版函数
require_once PHPCMS_ROOT.'include/template.func.php';
//生成最新模版相关文件
template_compile($module, $template, $istag);
}
//返回模板生成文件.php文件
return $compiledtplfile;
}
//生成tpl的数据模板
function tpl_data($module = 'phpcms', $template = 'index')
{
@extract($GLOBALS, EXTR_SKIP);
ob_start();
include template($module, $template);
$data = ob_get_contents();
ob_clean();
return $data;
}

三、template.func.php 的相关函数
function template_compile($module, $template, $istag = 0)
{
$tplfile = TPL_ROOT.TPL_NAME.'/'.$module.'/'.$template.'.html'; //生成模版名
$content = @file_get_contents($tplfile); //加载模版文件
if($content === false) showmessage("$tplfile is not exists!");
$compiledtplfile = TPL_CACHEPATH.$module.'_'.$template.'.tpl.php'; //生成模版cache文件名
$content = ($istag || substr($template, 0, 4) == 'tag_') ? ''.template_parse($content, 1).'' : template_parse($content);
//用template_parse正则替换后,形成可以执行的php文件
$strlen = file_put_contents($compiledtplfile, $content); //写到cache里
@chmod($compiledtplfile, 0777);
return $strlen; //返回生成值
}
function template_refresh($tplfile, $compiledtplfile) //单个模版文件的更新
{
$str = file_get_contents($tplfile);
$str = template_parse($str);
$strlen = file_put_contents($compiledtplfile, $str);
@chmod($compiledtplfile, 0777);
return $strlen;
}
function template_module($module) //更新一个模块的所有缓存文件
{
$files = glob(TPL_ROOT.TPL_NAME.'/'.$module.'/*.html'); //征收成文件名数组
if(is_array($files))
{
foreach($files as $tpl)
{
$template = str_replace('.html', '', basename($tpl)); //正则取文件名,去掉.html
template_compile($module, $template); //重新生成module的cache
}
}
return TRUE;
}
function template_cache() //生成所能的模块cache文件
{
global $MODULE; //全局变量module 可能是调用的cache.func生成的文件下的变量引入的,暂时没明,下回分解
foreach($MODULE as $module=>$m)
{
template_module($module);
}
return TRUE;
}
function template_block($blockid)
{
$tplfile = TPL_ROOT.TPL_NAME.'/phpcms/block/'.$blockid.'.html';
$compiledtplfile = TPL_CACHEPATH.'phpcms_block_'.$blockid.'.tpl.php';
if(TPL_REFRESH && (!file_exists($compiledtplfile) || @filemtime($tplfile) > @filemtime($compiledtplfile)))
{
template_refresh($tplfile, $compiledtplfile);
}
return $compiledtplfile;
}
function template_parse($str, $istag = 0)
//此函数的最终目地是将,模版文件.html文件,形成/daba/data_templete/module_name.tpl.php 文件,也就是一些正则的转换,和dz的模式差不多
{
$str = preg_replace("/([\n\r]+)\t+/s","http://www.cnblogs.com/igaofen/admin/file://1%22,$str/);
$str = preg_replace("/\<\!\-\-\{(.+?)\}\-\-\>/s", "{\\1}",$str);
$str = preg_replace("/\{template\s+(.+)\}/","",$str);
$str = preg_replace("/\{include\s+(.+)\}/","",$str);
$str = preg_replace("/\{php\s+(.+)\}/","",$str);
$str = preg_replace("/\{if\s+(.+?)\}/","",$str);
$str = preg_replace("/\{else\}/","",$str);
$str = preg_replace("/\{elseif\s+(.+?)\}/","",$str);
$str = preg_replace("/\{\/if\}/","",$str);
$str = preg_replace("/\{loop\s+(\S+)\s+(\S+)\}/","",$str);
$str = preg_replace("/\{loop\s+(\S+)\s+(\S+)\s+(\S+)\}/"," http://www.cnblogs.com/igaofen/admin/file://0.0.0.3/) { ?>",$str);
$str = preg_replace("/\{\/loop\}/","",$str);
$str = preg_replace("/\{\/get\}/","",$str);
$str = preg_replace("/\{tag_([^}]+)\}/e", "get_tag('\\1')", $str);
$str = preg_replace("/\{get\s+([^}]+)\}/e", "get_parse('\\1')", $str);
$str = preg_replace("/\{([a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff:]*\(([^{}]*)\))\}/","",$str);
$str = preg_replace("/\{\\$([a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff:]*\(([^{}]*)\))\}/","",$str);
$str = preg_replace("/\{(http://www.cnblogs.com/igaofen/admin/file://$[a-za-z_/x7f-/xff][a-zA-Z0-9_/x7f-/xff]*)/%7D/%22,%22%3C?php echo http://www.cnblogs.com/igaofen/admin/file://1;/?>",$str);
$str = preg_replace("/\{(http://www.cnblogs.com/igaofen/admin/file://$[a-za-z0-9_/[/]/'/%22/$/x7f-/xff]+)/%7D/es", "addquote('')",$str);
$str = preg_replace("/\{([A-Z_\x7f-\xff][A-Z0-9_\x7f-\xff]*)\}/s", "",$str);
if(!$istag) $str = "".$str;
return $str;
}
function get_tag($tagname) //获取phpcms的tag数据
{
global $TAG;
if(!isset($TAG)) $TAG = cache_read('tag.inc.php', TPL_ROOT.TPL_NAME.'/');
return isset($TAG[$tagname]) ? '' : '{tag_'.$tagname.'}';
}
function addquote($var) //变量数据加双相号
{
return str_replace("\\\"", "\"", preg_replace("/\[([a-zA-Z0-9_\-\.\x7f-\xff]+)\]/s", "['\\1']", $var));
}
function get_parse($str) //正则匹配
{
preg_match_all("/([a-z]+)\=\"([^\"]+)\"/i", stripslashes($str), $matches, PREG_SET_ORDER);
foreach($matches as $v)
{
$r[$v[1]] = $v[2];
}
extract($r);
if(!isset($dbsource)) $dbsource = '';
if(!isset($dbname)) $dbname = '';
if(!isset($sql)) $sql = '';
if(!isset($rows)) $rows = 0;
if(!isset($return) || !preg_match("/^\w+$/i", $return)) $return = 'r';
if(isset($page))
{
$str = "\${$return}){\$n++;?>";
}
else
{
$str = substr($str, -1) == '/' ? "" : " \${$return}) { \$n++;?>";
}
return $str;
}
?>
以上这些就是phpcms的默认文件cache模版的生成原理
现看一下首页的调用
.........
include template('phpcms', 'index'); //加载进来,就是我们看到的首页了,也就是加载了 /dada/cache_templete/phpcms_index.tpl.php
.......
?>

本文来自CSDN博客:http://blog.csdn.net/guwenzhong/archive/2009/03/05/3959491.aspx 

posted on 2009-08-26 16:17  igaofen  阅读(522)  评论(0编辑  收藏  举报