dedecms代码研究二
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代码研究二的更多相关文章
- dedecms代码研究七
简单回顾一下,前面我们首页动态文件index.PHP调用arc.partview.class.php来初始化首页模板 arc.partview.class.php通过SetTemplet调用DedeT ...
- dedecms代码研究五
上一次留几个疑问: 1)DedeTagParse类LoadTemplet方法. 2)MakeOneTag到底在搞什么. 从DedeTagParse开始前面,我们一直在dedecms的外围,被各种全局变 ...
- dedecms代码研究四
partview php文件之前,我们像掉进沼泽一样,看到无尽的变量,数组元素,莫名其面的东西摆在我们面前.今天,我们继续艰难前行,想办法走出partview类的泥潭.上一篇,我们胡乱分析了partv ...
- dedecms代码研究三
上次,我们从dedecms的index.PHP文件中了解到了很多信息,也提出了一些问题: 1)加载了/include/common.inc.php,里面做了哪些工作? 2)/include/arc.p ...
- dedecms代码研究一
dedecms相信大家一定都知道这个cms系统,功能比较强大,有比较完善的内容发布,还有内容静态化系统,还有就是它有自己独特的标签系统和模板系统.而模板系统也是其他cms系统比较难模仿的的东西,这个东 ...
- dedecms代码研究六
今天讲的是dedecms最关键的东西,模板分析啦.也就是dedetag.class.php 里面的ParseTemplet方法 模板解析方法 先看看一个dedecms标签,大家心里有个数: {dede ...
- (转)dedecms代码详解 很全面
dedecms代码研究(1)开篇dedecms 相信大家一定都知道这个cms 系统,功能比较强大,有比较完善的内容发布,还有内容静态化系统,还有就是它有自己独特的标签系统和模板系统.而模板系统也是其他 ...
- dedecms代码详解 很全面
dedecms代码研究(1)开篇dedecms 相信大家一定都知道这个cms 系统,功能比较强大,有比较完善的内容发布,还有内容静态化系统,还有就是它有自己独特的标签系统和模板系统.而模板系统也是其他 ...
- Fiddler实战深入研究(二)
Fiddler实战深入研究(二) 阅读目录 Fiddler不能捕获chrome的session的设置 理解数据包统计 请求重定向(AutoResponder) Composer选项卡 Filters选 ...
随机推荐
- UISegmentedControl的详细使用
当用户输入不仅仅是布尔值时,可使用分段控件(UISegmentedControl).分段控件提供一栏按钮(有时称为按钮栏),但只能激活其中一个按钮.分段控件会导致用户在屏幕上看到的内容发生变化.它们常 ...
- javascript笔记6-DOM
DOM(文档对象模型)是针对HTML和XML文档的一个API.DOM描绘了一个层次化的节点树,允许程序员添加.修改页面的一部分. 节点层次:DOM可以将任何HTML或XML文档描绘成一个由多层次节点构 ...
- Asp.net useful tools
fuslogvw trace the assembly binding when app start up. ILdasm to inspect the manifest of the assembl ...
- Flume 实战(1) -- 初体验
前言: Flume-ng是数据收集/聚合/传输的组件, Flume-ng抛弃了Flume OG原本繁重的zookeeper和Master, Collector, 其整体的架构更加的简洁和明了. 其基础 ...
- ueditor在使用requirejs时,报ZeroClipboard undefined错误
再网上找到了 http://blog.csdn.net/xundh/article/details/44536665 这样一篇文章, 其中原因说的很明白了 是因为在有requirejs时, ...
- Oracle 10g提权测试
一直想摸索一下orcl提权的方式,今天测试了一下10g,可以成功提权. C:\wmpub>sqlplus scott/tiger@orcl SQL*Plus: Release 10.2.0.1. ...
- Faster-RCNN 训练自己的数据
在前一篇随笔中,数据制作成了VOC2007格式,可以用于Faster-RCNN的训练. 1.针对数据的修改 修改datasets\VOCdevkit2007\VOCcode\VOCinit.m,我只做 ...
- Python chr() ord() unichr()
chr()函数用一个范围在range(256)内的(就是0-255)整数作参数,返回一个对应的字符. unichr()跟它一样,只不过返回的是Unicode字符,这个从Python 2.0才加入的un ...
- 利用pt-deadlock-logger监控死锁
Percona提供的percona-toolkit提供很多实用功能,这里着重介绍如何监控死锁. pt-deadlock-logger基本用法 Usage: pt-deadlock-logger [OP ...
- [zz] 英文大写缩写前要加THE吗
http://zhidao.baidu.com/link?url=BvXRdoE0OjGh46rlodbyM3wirORSGGcnYGq0xYEtcoIMTkLnXd4Hl3iMLbKNb2npRdI ...