澳门新葡萄京娱乐场PHPCMS2008源码浅析-模板原理分析 PHPCMS20008二次开发

/*作者: 牛哄哄Q Q: 455703030*/function
template($template,$cacheFile,$set){is_readable($template) ||
exit(‘模板文件不存在!’);filemtime($template) @filemtime($cacheFile)
parse_template($template,$cacheFile);$inTemplate =
true;is_readable($cacheFile) ? include $cacheFile :
exit(‘无法读取缓存,缓存路径可能有误!’);}function
parse_template($template,$cacheFile=”){$content =
file_get_contents($template);$content =
preg_replace(‘//{/*([^/{/}]*)/*/}/’,”,$content);$content =
preg_replace(‘//$([A-Za-z0-9_]+)/’,’$set[/’//1/’]’,$content);$content
= preg_replace(‘//$/[([A-Za-z0-9_]+)/]/’,’$//1′,$content);$content
= preg_replace(‘//{/$([A-Za-z0-9_/[/]/’]+)/}/’,’? echo $//1;
?’,$content);$content = preg_replace(‘//{include/(([^/{/}]+)/)/}/’,’?
include //1; ?’,$content);$content =
preg_replace(‘//{echofile/(([^/{/}]+)/)/}/’,’? echo
file_get_contents(//1); ?’,$content);$content =
preg_replace(‘//{code/(([^/{/}]+)/)/}/’,’? //1; ?’,$content);$content
= preg_replace(‘//{if/(([^/{/}]+)/)/}/’,’? if (//1) {
?’,$content);$content = preg_replace(‘//{elseif/(([^/{/}]+)/)/}/’,’?
} elseif(//1) { ?’,$content);$content =
preg_replace(‘//{while/(([^/{/}]+)/)/}/’,’? while (//1) {
?’,$content);$content = preg_replace(‘//{foreach/(([^/{/}]+)/)/}/’,’?
foreach (//1) { ?’,$content);$content =
str_replace(array(‘{else}’,'{/if}’,'{/while}’,'{/foreach}’),array(‘?
}else{ ?’,’? } ?’,’? } ?’,’? } ?’),$content);if
(preg_match_all(‘//{template/(([^/{/}]+)/)/}/’,$content,$tplName)){foreach
($tplName[1] as $value) $tplContent[] = parse_template(eval(‘return
‘.$value.’;’));$content =
str_replace($tplName[0],$tplContent,$content);}if (” == $cacheFile)
return $content;@file_put_contents($cacheFile,’? true===$inTemplate ||
exit(/’非法访问!/’); ?’.$content);}

<?php
PHPCMS2008模版原理篇

1,修复一个因为疏忽造成的小BUG,编译之后的代码少
了一个{符号,呵呵2,更改模板嵌套的编译模式,现在这种模式使用更简单方便,也更符合大家的习惯3,增加了一个新的功能,其实本来提供的功能,也可以实现此功能,但是毕竟不专业,用起来不方便。此功能用来直接输出一个静态的文件,我曾经做过测试,这样直接输出,效率要比include高的多的多此模板函数提供的标签及功能:1,添加注释{*
*}2,输出变量{$i}
//需要对变量进行格式化,可以使用{code()}标签来执行一个函数进行格式化输出3,包含一个动态文件{include()}4,包含一个静态文件{echofile()}5,嵌套一个模板{template()}6,判断,分支{if()}
{elseif()}{else} {/if}7,循环{while()}
{/while}{foreach()}{/foreach}8,执行一段PHP代码,包括赋值,函数等等等等{code()}有了这些东西,基本上就没有什么工作完成不了了。内附比较详细的使用说明

一、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 的相关调用函数

function template($module = ‘phpcms’, $template = ‘index’, $istag =
0)    //模版调用函数(模块名,模版名,是否tag)
{
$compiledtplfile =
TPL_CACHEPATH.$module.’_’.$template.’.tpl.php’;      
//根据参数生成cache模板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);         
//生成最新模版相关文件
}
return $compiledtplfile;                               
//返回模板生成文件.php文件
}

function tpl_data($module = ‘phpcms’, $template = ‘index’)  
//生成tpl的数据模板
{
@extract($GLOBALS, EXTR_SKIP);
ob_start();
include template($module, $template);
$data = ob_get_contents();
ob_clean();
return $data;
}

三、template.func.php 的相关函数
<?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_’) ? ‘<?php
function _tag_’.$module.’_’.$template.'($data, $number, $rows,
$count, $page, $pages, $setting){ global
$PHPCMS,$MODULE,$M,$CATEGORY,$TYPE,$AREA,$GROUP,$MODEL,$templateid,$_userid,$_username;@extract($setting);?>’.template_parse($content,
1).'<?php } ?>’ : 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”,”//1″,$str);
$str = preg_replace(“//</!/-/-/{(.+?)/}/-/-/>/s”,
“{//1}”,$str);
$str = preg_replace(“//{template/s+(.+)/}/”,”<?php include
template(//1); ?>”,$str);
$str = preg_replace(“//{include/s+(.+)/}/”,”<?php include //1;
?>”,$str);
$str = preg_replace(“//{php/s+(.+)/}/”,”<?php //1?>”,$str);
$str = preg_replace(“//{if/s+(.+?)/}/”,”<?php if(//1) {
?>”,$str);
$str = preg_replace(“//{else/}/”,”<?php } else { ?>”,$str);
$str = preg_replace(“//{elseif/s+(.+?)/}/”,”<?php } elseif (//1) {
?>”,$str);
$str = preg_replace(“//{//if/}/”,”<?php } ?>”,$str);
$str = preg_replace(“//{loop/s+(/S+)/s+(/S+)/}/”,”<?php
if(is_array(//1)) foreach(//1 AS //2) { ?>”,$str);
$str = preg_replace(“//{loop/s+(/S+)/s+(/S+)/s+(/S+)/}/”,”<?php
if(is_array(//1)) foreach(//1 AS //2 => //3) { ?>”,$str);
$str = preg_replace(“//{//loop/}/”,”<?php } ?>”,$str);
$str = preg_replace(“//{//get/}/”,”<?php } unset(/$DATA);
?>”,$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:]*/(([^{}]*)/))/}/”,”<?php
echo //1;?>”,$str);
$str =
preg_replace(“//{//$([a-zA-Z_/x7f-/xff][a-zA-Z0-9_/x7f-/xff:]*/(([^{}]*)/))/}/”,”<?php
echo //1;?>”,$str);
$str =
preg_replace(“//{(//$[a-zA-Z_/x7f-/xff][a-zA-Z0-9_/x7f-/xff]*)/}/”,”<?php
echo //1;?>”,$str);
$str =
preg_replace(“//{(//$[a-zA-Z0-9_/[/]/’/”/$/x7f-/xff]+)/}/es”,
“addquote(‘<?php echo //1;?>’)”,$str);
$str =
preg_replace(“//{([A-Z_/x7f-/xff][A-Z0-9_/x7f-/xff]*)/}/s”,
“<?php echo //1;?>”,$str);
if(!$istag) $str = “<?php defined(‘IN_PHPCMS’) or exit(‘Access
Denied’); ?>”.$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]) ? ‘<?php echo
‘.$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 = “<?php /$ARRAY = get(/”$sql/”, $rows, $page, /”$dbname/”,
/”$dbsource/”);/$DATA=/$ARRAY[‘data’];/$total=/$ARRAY[‘total’];/$count=/$ARRAY[‘count’];/$pages=/$ARRAY[‘pages’];unset(/$ARRAY);foreach(/$DATA
AS /$n=>/${$return}){/$n++;?>”;
}
else
{
   $str = substr($str, -1) == ‘/’ ? “<?php /${$return} =
get(/”$sql/”, -1, 0, /”$dbname/”, /”$dbsource/”);?>” : “<?php
/$DATA = get(/”$sql/”, $rows, 0, /”$dbname/”,
/”$dbsource/”);foreach(/$DATA AS /$n => /${$return}) {
/$n++;?>”;
}
return $str;
}
?>

以上这些就是phpcms的默认文件cache模版的生成原理

现看一下首页的调用

<?php
………

include template(‘phpcms’, ‘index’);  
//加载进来,就是我们看到的首页了,也就是加载了
/dada/cache_templete/phpcms_index.tpl.php
…….
?>


发表评论

电子邮件地址不会被公开。 必填项已用*标注