`

phpcms 源码解析-------模板引擎

阅读更多
PHPCMS 整站代码分析讲解(六)之模板引擎
发布:水水

19 May

<?php
/**
函数 template函数是在global.func.php 里面定义的。 在前面的phpcms 的首页 index.php 里就见到了。  用法: include template()    用法很熟, 呵呵其实和 dz 的模板引擎一样的用法。 但DZ的模板引擎比 PHPCMS 的简单很多,因为没有用到模板的标签技术。 大家有空可以研究下DZ的模板引擎。这里不说。  好分析下上面这个 模板的主要函数吧。  他的作用是返回编译好的模板文件路径。也就是把模板 X.html(模板文件) 用正则替换成 x.php(编译后的PHP文件).然后使用 include  函数。懂了吧! php的模板引擎都一个鸟样。 然后剩下的就是正则的东西了。等下再说。
*/
function template($module = 'phpcms', $template = 'index')
{
global $CONFIG;
$compiledtplfile = $CONFIG['templatescachedir'].$module.'_'.$template.'.tpl.php';
/**
因为phpcms是分模块来存放模板文件。所以 template 函数有两个参数: 第一个就是模块目录名,第二个就是此模块里面的模板文件名.
$CONFIG['templatescachedir']  这个是放编译后php文件存放的目录。在config.inc.php 站点配置文件里面定义的自己去看。 这样就取得了模板编译后的php文件路径。
*/
if($CONFIG['templaterefresh']) //$CONFIG['templaterefresh']  在 config.inc.php里面配置了。默认是1  。是更新模板开关。如果你设置为0 那么模板更新了。程序也不会更新。
{
        $tplfile = PHPCMS_ROOT.'/templates/'.$CONFIG['defaulttemplate'].'/'.$module.'/'.$template.'.html';
  /**
  和上面那句意思差不多。$CONFIG['defaulttemplate'] 是默认模板目录  。这句是获取你要的那个模块和里面的那个模板文件的路径(@@获取没编译前的模板文件)
  */
        if(!file_exists($compiledtplfile) || @filemtime($tplfile) > @filemtime($compiledtplfile))
  {
   /**
   我把文件编译成了php文件。那么模板改变了。 php文件总得也改变吧。要不你修改了模板后。站还是以前那个样子没变那有什么意思呢。
   首先判断模板编译文件是否存在。如果不存在那么后边那个条件不用判断了。 因为编译文件都不存在。程序肯定运行不了拉。(因为其实我们主要是运行编译后的那个php文件,模板文件是html的运行个P呀)
   或  后边那个 @filemtime($tplfile) > @filemtime($compiledtplfile)  很容易就明白:  函数 filetime() 判断文件最近修改的时间,返回Unix 时间戳。 如果模板文件的修改时间 大于 编译文件。 那么证明 模板文件  在 编译文件生成后 还进行了修改。那么我们是不是还要在更新次编译文件呀 ,那是肯定的拉。 所以继续执行下去。
   */
   require_once PHPCMS_ROOT.'/include/template.func.php';   // 加载编译函数
   template_refresh($tplfile, $compiledtplfile);// 这个就是模板的 编译启动函数 ,带动一系列的模板编译函数来最终生成模板编译文件。
  }
}
return $compiledtplfile; // 返回 模板编译后的PHP文件路径。
}

defined('IN_PHPCMS') or exit('Access Denied');
function template_compile($module,$template) //和下面那个一样是编译模板启动函数。不过两函数的参数不一样,按照上下文意思。这个函数是为了配合批量编译模板而写的。第一个是模块目录名,第二是模板文件名,解释同下。请看下面那个
{
global $CONFIG;
$content = file_get_contents(PHPCMS_ROOT.'/templates/'.$CONFIG['defaulttemplate'].'/'.$module.'/'.$template.'.html');
$content = template_parse($content);
$compiledtplfile = $CONFIG['templatescachedir'].$module.'_'.$template.'.tpl.php';
$strlen = file_put_contents($compiledtplfile, $content);
@chmod($compiledtplfile, 0777);
return $strlen;
}
function template_refresh($tplfile,$compiledtplfile) //模板编译启动函数。 参数 第一个是 模板文件名  第二个是 编译后的php文件名
{
$str = file_get_contents($tplfile); //使用了php5 的最爽函数:file_get_contents() 获取文件的内容 。
$str = template_parse($str); /*然后 使用 template_parse() 函数来对文件内容进行替换。比如把一些我们自己定义的语句:{if xx > xx}  正则替换成 <?php if(xx > xx){?>具体看下面*/
$strlen = file_put_contents($compiledtplfile, $str);//编译完成后。把内容写到我们的 那个所谓的编译PHP文件。
@chmod($compiledtplfile, 0777);  //别忘了设置下权限。
return $strlen; //返回 写到编译文件里的内容字大小节数,下面我们看下 template_parse() 函数
}
function template_module($module)//这个很有用。批量编译某模块目录下的模板文件
{
global $CONFIG;
$files = glob(PHPCMS_ROOT.'/templates/'.$CONFIG['defaulttemplate'].'/'.$module.'/*.html');
/*
glob 函数  取得 在此路径下的所有 *.html 以html为扩展名的文件列表。 具体看手册。
**/
if(is_array($files))
{
  foreach($files as $tpl)
  { //开始批量
   $template = str_replace('.html', '', basename($tpl));
   // 获取模板文件名。以次来做编译后的PHP文件名
   template_compile($module, $template); //这个函数上面讲过了。看上面
  }
}
return TRUE;
}
function template_cache() //这个是比上面那个更大批量的生成。因为 $MODULE 里面的所有模块  $MODULE 存在于缓存文件模板。前面已经说了。自己看吧
{
    global $MODULE;
foreach($MODULE as $module=>$m)
    {
        template_module($module);
}
return TRUE;
}
/**
哇,别给它吓到。其实都是些简单的正则。只要知道他们是干什么的就好办了。 在模板里面我们使用了些自己定义的标签呀。语句呀。这些东西不是PHP标准语法。所以根本不可能运行。
那么怎么办呢。通过正则对我们自己定义的语法 。转变成标准的PHP语法。然后写到我们的 PHP文件里。所以下面正则都是对我们自己定义的语法进行编译。
下面讲解下正则。按照本人水平解释。大概的解释了下。不过不懂正则的请自己百度学下。有不对的地方。大家可以讨论下。@@   还没懂 preg_replace() 函数的同学兄弟朋友姐妹。请自己看手册。
*/
function template_parse($str)
{
$str = preg_replace("/([\n\r]+)\t+/s","\\1",$str); 
// 用 \n\r 过滤掉 tab制表符,  \\1 是逆向引用了第一个括号里面\n换行\r换页匹配的文本 (@@解释好要口,最好自己看下正则知识 /s为修正符。自己百度吧)
$str = preg_replace("/\<\!\-\-\{(.+?)\}\-\-\>/s", "{\\1}",$str);
// 以 {xx} 来替换 <!--{xx}--> {xx}在下面肯定还要进行第二次正则替换,要不是不能在PHP里面运行的。  .+? 和 .+ 一个是懒惰 一个是贪婪。  看名字就知道。不知道的 百度吧: 正则贪婪。

$str = preg_replace("/\{template\s+(.+)\}/","\n<?php include template(\\1); ?>\n",$str);
/* 把模板里面的 {template 'xx','jj'} 编译成PHP标准写法:<?php include template('xx','jj') ?>   大家可能一看就明白了: include template()  这个在那里见过。对了。这个在PHP里也可以运行的。因为 template() 函数不是定义了吗。*/
$str = preg_replace("/\{include\s+(.+)\}/","\n<?php include \\1; ?>\n",$str);
/* 模板里面的 {include xx.php} 编译成 PHP文件里的 <?php include xx.php?>**/
$str = preg_replace("/\{php\s+(.+)\}/","\n<?php \\1?>\n",$str);
/* 模板里面的 {php xxxx} 编译成 <?php xxxx?>  大家也应该明白了。 xxxx 肯定是PHP的标准语法拉。 所以phpcms模板语句: {php } 就是用来给你在模板里写要运行的PHP语句。在smarty 里也有这功能**/
$str = preg_replace("/\{if\s+(.+?)\}/","<?php if(\\1) { ?>",$str);
/* 这个就更简单了。 把模板里面的{if xxxx}  编译成 <?php if(){?>  看这样一步一步的把一些自己定义的语句编译成PHP的标准语法。这个就叫模板引擎了。**/
$str = preg_replace("/\{else\}/","<?php } else { ?>",$str);
/* {else } 转 <?php } else {?>**/
$str = preg_replace("/\{elseif\s+(.+?)\}/","<?php } elseif (\\1) { ?>",$str);
/* {elseif } 转 <?php } elseif {?>**/
$str = preg_replace("/\{\/if\}/","<?php } ?>",$str);
/* {/if} 转 <?php }?>  phpcms 模板语法有: {/if}的哦。大家别忘了,要不 php肯定运行不了**/
$str = preg_replace("/\{loop\s+(\S+)\s+(\S+)\}/","<?php if(is_array(\\1)) foreach(\\1 AS \\2) { ?>",$str);
/* 下面就是循环了。模板里用{loop xx jj} 其实编译成了PHP的 foreach(xx AS jj) 这样大家都会用了吧**/
$str = preg_replace("/\{loop\s+(\S+)\s+(\S+)\s+(\S+)\}/","\n<?php if(is_array(\\1)) foreach(\\1 AS \\2 => \\3) { ?>",$str);
/* 这句和上面也差不多。不过是多了个取出数组的标名  {loop xx jj yy}  成 foreach(xx as jj=> yy)**/
$str = preg_replace("/\{\/loop\}/","\n<?php } ?>\n",$str);
/* 循环结束别忘了 {/loop}  对应PHP的 <?php }?>**/
$str = preg_replace("/\{tag_([^}]+)\}/e", "get_tag('\\1')", $str);
/* {tag_xx}  替换为 get_tag('xx')  get_tag()  函数是自己定义的函数,因为phpcms 的模板引擎应用了标签功能。这个函数就是为了调用标签的。**/
$str = preg_replace("/\{([a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*\(([^{}]*)\))\}/","<?php echo \\1;?>",$str);
/* {xxx(jj)}  这么个奇怪的东西。因为奇怪所以我找了下PHPCMS的模板文件。找了几个文件都没发现这个怪物。大家有谁找到的说下我去看下。怕是我理解错了正则。先谢了**/
$str = preg_replace("/\{\\$([a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*\(([^{}]*)\))\}/","<?php echo \\1;?>",$str);
/* {$xxx(wwsd)} 专换成 <?php echo xxx(wwsd)?>   当然了 xxx() 是程序中定义过的函数**/
$str = preg_replace("/\{([a-zA-Z0-9_\x7f-\xff]*)\}/]\\$[a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*)\}/","<?php echo \\1;?>",$str);
/* 把{$xxjj} 转成 <?php echo $xxjj?>  当然了是把变量输出**/
$str = preg_replace("/\{(\]\\$[a-zA-Z0-9_\[\]\'\"\$\x7f-\xff]+)\}/es", "addquote('<?php echo \\1;?>')",$str);
/* 主要是把{$xxx['jj']} 转成 <?php echo $xxx['jj']?>  addquote() 函数自己定义的看下面,二次过滤。有代验证,头昏了看太久的黄色字。我昏**/
$str = preg_replace("/\{([A-Z_\x7f-\xff][A-Z0-9_\x7f-\xff]*)\}/s", "<?php echo \\1;?>",$str);
/* {XXJJ}  <?php echo XXJJ?>  XXJJ 是我们定义的常量**/
$str = "<?php defined('IN_PHPCMS') or exit('Access Denied'); ?>".$str;
/* 最后别忘了在自己的每个编译后的文件里加上这个。以前讲过了不明白找前面例子**/
return $str; //最后返回过滤完成的内容
}
function get_tag($tagname) //这个函数在  上面这个编译函数里面看到了。 其实就是获取对应标签的内容,头有点昏,下节再说标签吧。
{
global $tags,$html,$CONFIG;
    if(!$tags) require PHPCMS_ROOT.'/templates/'.$CONFIG['defaulttemplate'].'/tags.php';
    if(!$html) require PHPCMS_ROOT.'/templates/'.$CONFIG['defaulttemplate'].'/html.php';
if(!isset($tags[$tagname])) return '{tag_'.$tagname.'}';
$code = isset($html[$tagname]) ? 'tag_read('.$html[$tagname].')' : $tags[$tagname];
return "<?php echo $code;?>";
}
function addquote($var)
{
return str_replace("[url=]\\\[/url]"", """, preg_replace("/\[([a-zA-Z0-9_\-\.\x7f-\xff]+)\]/s", "['\\1']", $var));
}
?>
[size=xx-small][/size]
分享到:
评论

相关推荐

    商业源码-编程源码-PhpCMS2008 sp4 build 20100921 简体中文 UTF-8.zip

    《深入解析商业源码:PhpCMS2008 SP4》 PhpCMS2008 SP4是一款在2010年9月21日发布的、基于PHP编程语言的开源内容管理系统(CMS)。这款系统以其强大的功能、易用性和可扩展性在当时的Web开发领域中占有重要地位,...

    商业源码-编程源码-phpcms网站管理系统 v2.4 Buld 1207 简体中文版.zip

    5. **模板引擎**:phpcms内置模板引擎,允许开发者通过HTML模板来设计网站的外观,与内容管理逻辑分离,提高了前端展示的灵活性。同时,它支持自定义标签,让开发者可以创建个性化的网站元素。 6. **SEO优化**:...

    phpcms_v9.2.4_UTF8

    3. **模板引擎** - **标签系统**:强大的标签系统使得模板制作简单易行,通过简单的标签语法即可调用后台数据。 - **自定义模板**:支持自定义模板,满足个性化网站设计需求,同时提供后台模板管理功能。 4. **...

    仿2345多特软件下载站网站源码(PHPCMS内核)

    1. **PHPCMS系统**:PHPCMS是一款开源的PHP内容管理系统,具有模板引擎、广告管理、会员管理、文章管理、视频管理、下载管理等多个功能模块。在这个项目中,开发者可能已经根据2345多特软件下载站的样式和需求,定制...

    PHPCMS 源代码

    总结,PHPCMS的源代码解析涉及到的内容广泛,包括MVC架构的理解、数据库操作、模板引擎的使用、缓存机制、安全防护以及权限控制等方面。通过深入学习和实践,开发者可以更好地利用PHPCMS构建高效、安全的网站。

    PHP实例开发源码-phpcms v9.6.4 维护版.zip

    2. **模板引擎**:phpcms提供了一套自定义模板机制,允许开发者通过HTML和简单的模板标签来设计网站外观,实现了内容与表现的分离。 3. **数据库操作**:phpcms支持MySQL等多种数据库,提供了便捷的数据操作接口,...

    phpcms_v9.2.5_UTF8

    2. **模板引擎**:其内置的模板引擎使开发者能够轻松设计符合自身风格的网站界面,同时支持静态页面生成,提高网站加载速度。 3. **权限管理**:系统具备多级用户权限设置,可以灵活控制不同角色的访问和操作权限。...

    PHPCMS整站源代码分析讲解

    针对于phpcms源代码的解析,大家可以看一看,有错语的地方请指正

    phpcms餐饮手机网站整站源码分享打包

    【phpcms餐饮手机网站整站源码解析】 phpcms,作为一款开源的PHP内容管理系统,以其强大的功能和灵活的扩展性,在网站开发领域备受青睐。本整站源码专为餐饮行业设计,提供了完整的手机网站解决方案,适用于移动端...

    医疗网phpcmsv9

    本文将围绕“医疗网phpcmsv9”这一主题,深入探讨其核心功能、架构特点以及源码解析,帮助读者理解如何利用phpcmsv9这一强大的内容管理系统(CMS)来构建大型医疗网站。 一、phpcmsv9简介 phpcmsv9是由风雷建站...

    phpcms2008内容管理系统源代码

    2. **模板引擎**:强大的模板引擎支持自定义模板设计,允许开发者通过HTML和CSS实现网站界面的个性化定制。 3. **权限管理**:完善的用户、角色、权限三级权限管理机制,保证了网站数据的安全性,便于团队协作。 4...

    PHP实例开发源码——光线phpCMS影视系统(百度奇艺电影模板整站源码).zip

    7. 模板引擎:光线phpCMS可能采用特定的模板引擎,如Smarty或Twig,使得开发者可以编写分离的模板文件,将内容和呈现方式分开,提高代码的可维护性。 8. 安全性:对于任何Web应用,安全性都是关键。此系统可能包含...

    phpcms 开发手册

    2. **模板引擎**:提供自定义模板功能,支持HTML和PHP模板,方便开发者进行页面布局和样式设计。 3. **会员系统**:内置会员注册、登录、积分、权限等功能,可实现个性化会员服务。 4. **广告管理**:可设置多种...

    phpcms一键排版完美插件

    1. 模板引擎优化:插件可能对phpcms的默认模板引擎进行了增强,以更好地支持动态内容布局和响应式设计。 2. CSS样式预设:内置多种预设样式,用户可根据需要选择合适的排版风格,或自定义样式。 3. HTML结构分析:...

    PHPCMS_整站代码分析讲解

    2. **视图(View)**:视图部分主要由模板文件组成,使用 Smarty 模板引擎进行解析。Smarty 提供了丰富的函数和控制结构,如循环、条件判断等,方便开发者定制页面样式和布局。 3. **控制器(Controller)**:控制器是...

    PHPCMSV9 二次开发

    PHPCMSV9 使用自定义的模板引擎,开发者可以通过修改或创建模板文件来改变网站的外观。了解模板语法,如标签调用、条件判断、循环结构等,是进行前端定制的基础。 3. **模块开发** 学习如何创建新的模块是二次...

    PHP实例开发源码—CMSHead 开源的PHPCMS系统.zip

    通过研究和分析源码,可以深入理解PHP的MVC(Model-View-Controller)设计模式、数据库交互、模板引擎、权限控制等核心概念。 1. MVC架构:CMSHead采用了MVC设计模式,将应用程序分为模型(Model)、视图(View)和...

    PHPCMS 二次开发在线课最后一讲,所有资料集合

    通过学习这些资料,开发者可以了解如何利用PHPCMS的模板引擎、数据库操作、用户权限管理等特性来定制功能,同时也可以掌握如何优化性能和保证系统安全。 MVC模式是软件设计中的一种经典模式,它将应用程序分为模型...

    phpcms 代码分析

    最后,熟悉PHP的模板引擎,如Smarty或ThinkPHP的模板引擎,能够帮助我们解析phpcms的视图层代码,理解如何将数据渲染成网页。此外,理解MVC(模型-视图-控制器)架构模式,有助于我们把握phpcms的整体设计思路。 总...

    phpcms v9.6.4 维护版.zip

    《phpcms v9.6.4 维护版:深入解析与应用》 phpcms v9.6.4 是一款广泛应用于网站建设和管理的开源内容管理系统(CMS)。这个维护版本的发布,旨在修复已知问题,提升系统稳定性和安全性,为用户提供了更可靠的后台...

Global site tag (gtag.js) - Google Analytics