dedecms代码研究(2)从index开始

现在继续,今天讲的主要是dedecms的入口代码。

先打开index.PHP看看里面是什么吧。打开根目录下的index.php嗯

映入眼帘的是一个if语句。检查/data/common.inc.php是否存在。如果不存在就跳转到安装界面。

if(!file_exists(dirname(__FILE__).'/data/common.inc.php'))
{
header('Location:install/index.php');
exit();
}

我们来到/data/看看这个目录和common.inc.php。

打开/data/,里面很多目录和文件,有上传的临时目录,模板缓存,压缩的临时目录,各种数据库里保存的系统配置信息的缓存文件以及其他的一些东西,就一个字乱~

好吧,我们打开common.inc.php。哦,原来就是保存了数据库连接的相关变量而已。说白了,就是dedecms的数据库连接配置文件,估计是安装完系统生成的。所以/index.php会检查它是否存在。

我们回到/index.php中继续往下看,第二个if语句,判断GET请求“upcache”是否存在,存在就更新首页缓存,不存在就直接301跳转到index.html,也就是dedecms的静态首页(记住,dedecms的前台页面都是系统生成的静态页面)。

想想接下来我们要研究什么?对,就是GET请求“upcache”存在的时候,更新首页缓存这小段代码啦。代码如下:

if(isset($_GET['upcache']) || !file_exists('index.html'))
{
require_once (dirname(__FILE__) . "/include/common.inc.php");
require_once DEDEINC."/arc.partview.class.php";
$GLOBALS['_arclistEnv'] = 'index';
$row = $dsql->GetOne("Select * From `#@__homepageset`");
$row['templet'] = MfTemplet($row['templet']);
$pv = new PartView();
$pv->SetTemplet($cfg_basedir . $cfg_templets_dir . "/" . $row['templet']);
$row['showmod'] = isset($row['showmod'])? $row['showmod'] : 0;
if ($row['showmod'] == 1)
{
$pv->SaveToHtml(dirname(__FILE__).'/index.html');
include(dirname(__FILE__).'/index.html');
exit();
} else {
$pv->Display();
exit();
}
}
else
{
header('HTTP/1.1 301 Moved Permanently');
header('Location:index.html');
}

①加载/include/common.inc.php,估计是一些常用函数和加载其他系统函数和类的文件。

②接下来又加载了DEDEINC."/arc.partview.class.php",注意DEDEINC这个常量,我们知道经过前期对dedecms目录结构观察,arc.partview.class.php是在/include目录下的,而加载/include/common.inc.php却没有用DEDEINC这个常量,这说明,common.inc.php里面定义了DEDEINC这个常量,所以后面得以使用,也印证了common.inc.php大体作用就是系统运行基本部分,都在这里面啦。我们不急着进common.inc.php,继续把index.php的更新缓存代码看完。

第三句,设置了一个全局变量:$GLOBALS['_arclistEnv'] = 'index';

第四行,获取一个表'#@__homepageset'的所有记录,当然如果你看下数据库,里面没有“#@__homepageset”这个表,我们判断,是数据库操作相关函数把表名用表名前缀替换了一下前半部分,这个都不重要了,重要的是,通过这句,获取了首页的相关配置信息,我们打开数据库里面的dede_homepageset表,晕,就一条记录,俩字段,基本猜到了,一个是首页模板名称,一个是生成的静态文件的位置。
aaarticlea/png;base64,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" alt="" />
回来继续分析前面的代码

$row['templet'] = MfTemplet($row['templet']);

通过MfTemplet函数好像把$row['templet']进行了某些转换。我们记下MfTemplet函数,以待后面挖掘。

接下来,就是new了一个PartView类,看这个名字,我们就知道了前面加载arc.partview.class.php的作用啦。

至于这个PartView类有什么作用,我们继续看代码。看了下面两行,我想大家应该都明白啦

$pv->SetTemplet($cfg_basedir . $cfg_templets_dir . "/" . $row['templet']);

$pv->SaveToHtml(dirname(__FILE__).'/index.html');

创建个视图对象(PartView类的实例,我们姑且叫视图对象),设置模板,通过SaveToHtml方法,把最后生成的页面写到指定位置。

首页生成完毕,接下来就是把生成的静态文件通过include的形式显示出来,然后exit中断页面解析。

至此,/index.php就分析完啦。

它先是通过/data/common.inc.php,判断是否安装了dedecms或者说判断是否定义了数据库配置信息,好为后面操作打下基础。

然后判断是否有GET请求"upcache",如果有就加载/include/common.inc.php初始化系统,然后调用partview类的相关方法来生成静态首页文件,最后显示出来。

这么来看dedecms也没有太多的秘密嘛~

不过呢,我们这篇文章也遗留下了几个问题:

1)加载了/include/common.inc.php,里面做了哪些工作?

2)/include/arc.partview.class.php到底是干什么的,/include/下还有很多arc开头的文件都是干什么的?

3)MfTemplet这个函数到底对模板文件路径这个字符串做了什么操作?

4)partview类的相关方法都有什么秘密?

带着这几个疑问,我们将结束本文,后面的文章将将这些谜题一一揭开。 博主个人博客:www.kanronghua.com 欢迎学习交流。

dedecms代码研究二的更多相关文章

  1. dedecms代码研究七

    简单回顾一下,前面我们首页动态文件index.PHP调用arc.partview.class.php来初始化首页模板 arc.partview.class.php通过SetTemplet调用DedeT ...

  2. dedecms代码研究五

    上一次留几个疑问: 1)DedeTagParse类LoadTemplet方法. 2)MakeOneTag到底在搞什么. 从DedeTagParse开始前面,我们一直在dedecms的外围,被各种全局变 ...

  3. dedecms代码研究四

    partview php文件之前,我们像掉进沼泽一样,看到无尽的变量,数组元素,莫名其面的东西摆在我们面前.今天,我们继续艰难前行,想办法走出partview类的泥潭.上一篇,我们胡乱分析了partv ...

  4. dedecms代码研究三

    上次,我们从dedecms的index.PHP文件中了解到了很多信息,也提出了一些问题: 1)加载了/include/common.inc.php,里面做了哪些工作? 2)/include/arc.p ...

  5. dedecms代码研究一

    dedecms相信大家一定都知道这个cms系统,功能比较强大,有比较完善的内容发布,还有内容静态化系统,还有就是它有自己独特的标签系统和模板系统.而模板系统也是其他cms系统比较难模仿的的东西,这个东 ...

  6. dedecms代码研究六

    今天讲的是dedecms最关键的东西,模板分析啦.也就是dedetag.class.php 里面的ParseTemplet方法 模板解析方法 先看看一个dedecms标签,大家心里有个数: {dede ...

  7. (转)dedecms代码详解 很全面

    dedecms代码研究(1)开篇dedecms 相信大家一定都知道这个cms 系统,功能比较强大,有比较完善的内容发布,还有内容静态化系统,还有就是它有自己独特的标签系统和模板系统.而模板系统也是其他 ...

  8. dedecms代码详解 很全面

    dedecms代码研究(1)开篇dedecms 相信大家一定都知道这个cms 系统,功能比较强大,有比较完善的内容发布,还有内容静态化系统,还有就是它有自己独特的标签系统和模板系统.而模板系统也是其他 ...

  9. Fiddler实战深入研究(二)

    Fiddler实战深入研究(二) 阅读目录 Fiddler不能捕获chrome的session的设置 理解数据包统计 请求重定向(AutoResponder) Composer选项卡 Filters选 ...

随机推荐

  1. Python SocketServer源码分析

    1      XXXServer 1.1      BaseSever 提供基础的循环等待请求的处理框架.使用serve_forever启动服务,使用shutdown停止.同时提供了一些可自行扩展的方 ...

  2. 超级链接a中javascript:void(0)弹出另外一个框问题

    转字:http://my.oschina.net/castusz/blog/68186 结果在IE.Firefox.Chrome都是先执行的onclick事件,在项目中我们尽量不要同时使用这两种方式. ...

  3. 实现Android4.4系统设置分页滑动浏览功能

    需求描述: 由于手机功能越来越完善,相应的偏好设置也就越来越多:从用户体验的角度考虑,为了让用户能够在短时间内对常用的偏好设置进行操作,如WIFI,蜂窝数据等.单独将一些常用的设置功能单独展示出来,已 ...

  4. OD调试篇12

    Delphi的逆向 先看看今天需要破解的程序. 打开程序先出现了一个nag窗口,然后是unregistered未注册的提示,以及关于里的需要注册. 拖进die看了看      就是delphi写的.那 ...

  5. javascript之小积累-.-添加form表单查询的enter键支持

    /*  * 列表查询的enter键支持  * author by 清风  */ function enterEvent() {   document.onkeydown = function(even ...

  6. Java初学者入门应该掌握的30个概念

    1.OOP中唯一关系的是对象的接口是什么,就像计算机的销售商她不管电源内部结构 是怎样的,他只关系能否给你提供电就行了,也就是只要知道can or not而不是how and why.所有的程序是由一 ...

  7. 给table行换色

    <script language="javascript"> //假设Table的ID为angel $("#angel tr").click(fun ...

  8. springMVC 拦截器简单配置

    在spring 3.0甚础上,起来越多的用到了注解,从前的拦截器在配置文件中需要这样配置 <beans...> ... <bean id="measurementInter ...

  9. UIControlEventTouch

    在控件事件中,简单解释下下面几个事件. 说明:由于是在“iOS 模拟器”中测试的,所以不能用手指,只能用鼠标. 1)UIControlEventTouchDown 指鼠标左键按下(注:只是“按下”)的 ...

  10. Java的委托

    http://www.cnblogs.com/soojoe/archive/2012/04/12/2532304.html 委托模式是软件设计模式中的一项基本技巧.在委托模式中,有两个对象参与处理同一 ...