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选 ...
随机推荐
- js传url中文参数乱码问题
$("#btnKeyWord").click(function () { window.open("/Atraction/Atraction.aspx?keyword=& ...
- Day3 summary
今天主要学习了K-means算法,又过了遍Andrew教授的coursera视频,弄明白了Action书上的算法.困难出现在实例练习,申请Yahoo place finder API获得了appid, ...
- Windows和Unix下的编码问题
今天测试shell脚本时,执行报错: ./report.sh: /tmp/tmp.E8ekx6r5Qq/report.sh: /bin/bash^M: bad interpreter: No such ...
- 黑马程序员:Java编程_动态代理
=========== ASP.Net+Android+IOS开发..Net培训.期待与您交流!=========== 长沙人从长沙的代理商手中买宏基电脑和直接跑到宏基总部买电脑,最终的主体业务目标有 ...
- fastcoloredtextbox控件 看下是否解决了中文
该控件解决中文网址 未测试是否解决 想保存 http://www.dullong.com/share-a-code-can-be-highlighted-components-fastco ...
- IOS ASIFormDataRequest使用简介(2/25)
ASIHTTPRequest类库中的ASIFormDataRequest是实现HTTP协议中的处理POST表单的很好的类库.使用起来非常简单.下面特酷吧简要总结其用法. 在说明之前先需要了解HTTP请 ...
- Sed是个好东西
今天遇到的源码使用了变态的宏,直接对参数进行宏处理,使得我的vim插件几乎全废,只能想办法将宏给替换进去. #!/bin/bash find . -type f -name '*.c' | xargs ...
- R读取数据的错误
使用R读取数据的时候遇到这种错误: invalid multibyte string at '<fd>' 解决方法就是: tbl <- read.delim("dir/fi ...
- UVA 10474 大理石在哪 lower_bound
题意:找输入的数在排完序之后的位置. 主要是lower_bound 函数的使用.它的作用是查找大于或者等于x的第一个位置. #include<cstdio> #include<alg ...
- Python的regex模块——更强大的正则表达式引擎
Python自带了正则表达式引擎(内置的re模块),但是不支持一些高级特性,比如下面这几个: 固化分组 Atomic grouping 占有优先量词 Possessive quantifi ...