dedecms代码详解Word格式文档下载.docx
- 文档编号:17577784
- 上传时间:2022-12-07
- 格式:DOCX
- 页数:22
- 大小:32.29KB
dedecms代码详解Word格式文档下载.docx
《dedecms代码详解Word格式文档下载.docx》由会员分享,可在线阅读,更多相关《dedecms代码详解Word格式文档下载.docx(22页珍藏版)》请在冰豆网上搜索。
毕竟PHPwind和discuz之类也是用类似的方法开发的。
整个程序大体就这些东西啦。
功能就不讲了,建议不熟悉dedecms的朋友自己看一下dedecms的后台管理功能,这样能有助于我们更好理解和分析它。
另外提一点,我们的这次代码分析,主要分析的是其页面生成、显示、模板处理、标签处理部分,这套系统也是dedecms比较引以为傲的东西,之后呢,还会分析一些笔者觉得比较酷的功能代码。
最后,希望这次代码分析旅程能让大家有所收获。
dedecms代码研究
(2)从index开始
分析开始:
现在继续,今天讲的主要是dedecms的入口代码。
先打开index.php看看里面是什么吧。
打开根目录下的index.php,映入眼帘的是一个if语句。
检查/data/common.inc.php是否存在。
如果不存在就跳转到安装界面。
我们来到/data/看看这个目录和common.inc.php。
打开/data/,里面很多目录和文件,有上传的临时目录,模板缓存,压缩的临时目录,各种数据库里保存的系统配置信息的缓存文件以及其他的一些东西,就一个字乱~
好吧,我们打开common.inc.php。
原来就是保存了数据库连接的相关变量而已。
说白了,就是dedecms的数据库连接配置文件,这是安装完系统生成的。
所以/index.php会检查它是否存在。
我们回到/index.php中继续往下看,第二个if语句,判断GET请求“upcache”是否存在,存在就更新首页缓存,不存在就直接301跳转到index.html,也就是dedecms的静态首页(记住,dedecms的前台页面都是系统生成的静态页面)。
想想接下来我们要研究什么?
对,就是GET请求“upcache”存在的时候,更新首页缓存这小段代码啦。
代码如下:
require_once(dirname(__FILE__)."
/include/common.inc.php"
);
require_onceDEDEINC."
/arc.partview.class.php"
;
$GLOBALS['
_arclistEnv'
]='
index'
$row=$dsql->
GetOne("
Select*From`#@__homepageset`"
$row['
templet'
]=MfTemplet($row['
]);
$pv=newPartView();
$pv->
SetTemplet($cfg_basedir.$cfg_templets_dir."
/"
.$row['
SaveToHtml(dirname(__FILE__).'
/index.html'
include(dirname(__FILE__).'
exit();
第一行,加载/include/common.inc.php,估计是一些常用函数和加载其他系统函数和类的文件。
第二行,又加载了DEDEINC."
,注意DEDEINC这个常量,我们知道经过前期对dedecms目录结构观察,arc.partview.class.php是在/include目录下的,而加载/include/common.inc.php却没有用DEDEINC这个常量,这说明,common.inc.php里面定义了DEDEINC这个常量,所以后面得以使用,也印证了common.inc.php大体作用就是系统运行基本部分,都在这里面啦。
我们不急着进common.inc.php,继续把index.php的更新缓存代码看完。
第三行,设置了一个全局变量:
第四行,获取一个表'
#@__homepageset'
的所有记录,当然如果你看下数据库,里面没有“#@__homepageset”这个表,我们判断,是数据库操作相关函数把表名用表名前缀替换了一下前半部分,这个都不重要了,重要的是,通过这句,获取了首页的相关配置信息,我们打开数据库里面的dede_homepageset表,晕,就一条记录,俩字段,基本猜到了,一个是首页模板名称,一个是生成的静态文件的位置。
回来继续分析前面的代码
通过MfTemplet函数好像把$row['
]进行了某些转换。
我们记下MfTemplet函数,以待后面挖掘。
接下来,就是new了一个PartView类,看这个名字,我们就知道了前面加载arc.partview.class.php的作用啦。
至于这个PartView类有什么作用,我们继续看代码。
看了下面两行,我想大家应该都明白啦
创建个视图对象(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类的相关方法都有什么秘密?
带着这几个疑问,我们将结束本文,后面的文章将将这些谜题一一揭开。
dedecms代码研究(3)partview的迷惑
上次,我们从dedecms的index.php文件中了解到了很多信息,也提出了一些问题,本文开始就带着前面的问题,继续我们的dedecms之旅吧。
先回顾一下之前我们在index.php文件研究中总结的东西。
首先加载common.inc.php,接下来组织模板,生成静态页面并跳到静态页面。
common.inc.php入口配置文件:
接下来,我们就先来看看common.inc.php里面都有什么吧。
打开/include/common.inc.php里面的注释已经说地比较清楚了。
我们大概说说结构。
先是定义一堆常量。
然后是做一些安全措施,对PHP的系统环境进行一些设置,代码里面的注释已经写地很清楚了。
接下来是把dedecms的系统配置参数文件包含进来:
require_once(DEDEDATA."
/config.cache.inc.php"
看文件名字,我们猜测这个配置文件可能是数据库里面的配置信息的缓存。
接下来加载了数据库配置信息文件:
require_once(DEDEDATA.'
/common.inc.php'
这个文件,不是根据数据库中信息生成的缓存,而是dedecms安装的时候生成的。
前一篇文章我们说过index.php文件开始,检测dedecms是否安装,就是看这个文件是否存在的。
再接下来,整理了很多目录,比如:
站点根目录、模板目录,插件目录、数据目录等,还整理了很多变量。
最后加载了数据库操作类dedesql.class.php和常用函数文件common.func.php
嗯,common.inc.php的谜底揭开,里面没什么好玩的东西啦,都是最基本的东西。
接下来我们就得看看arc.partview.class.php吧,这里面可是dedecms关键呢
加载了channelunit.class.php,typelink.class.php,ftp.class.php
下面就是partview类的定义:
因为index.php中使用partview类的SetTemplet方法和SaveToHtml方法,所以,我们为了能更简单地深入,就从这两个方法着手。
第一、我们先看看partview的构造函数。
创建了一个DedeTagParse类的实例,看名字是标签解析类哦。
然后设置了几个参数。
接下来,new了一个TypeLink类,设置了一堆参数。
搞的很云里雾里的。
第二、看看SetTemplet吧。
啊,这个还算简单。
先,使用DedeTagParse类的LoadTemplet方法载入模板。
再,设置一些Fields数组的元素
最后,调用ParseTemplet方法。
ParseTemplet方法里面弄了一堆$GLOBALS数组的元素,然后调用了MakeOneTag函数。
费解啊
再看看SaveToHtml方法吧,前面就是建目录,最后用DedeTagParse的SaveTo方法保存到文件。
呃~不给力啊。
只能回头想想,都看到了什么~
嗯,为了能生成首页,搞了个很搞不懂的partview类,然后里面调用了貌似万能的DedeTagParse方法,解析模板,生成静态文件。
仅此而已。
遗留问题:
里面还夹杂了其他函数和类,但不管怎么样这个DedeTagParse是重点,下次得重点分析了。
今天就到这吧,鸟儿的~太乱了,一点章法都没有~
dedecms代码研究(4)继续徘徊partview
之前,我们像掉进沼泽一样,看到无尽的变量,数组元素,莫名其面的东西摆在我们面前。
今天,我们继续艰难前行,想办法走出partview类的泥潭。
上一篇,我们胡乱分析了partview类,完全搞不懂干什么的,里面弄了一堆变量,最清晰的我们只是知道几个生成首页的关键地方调用了DedeTagParse类的LoadTemplet方法和SaveTo方法。
而在partview类定义的文件头部,包含了几个文件,我们就避开partview,先来看看这几个包含的文件吧。
require_once(DEDEINC.'
/channelunit.class.php'
/typelink.class.php'
/ftp.class.php'
ftp.class.php,不用说,就是ftp相关操作类吧,我们之前看partview代码的时候,了解到,在生成静态文件的时候,使用了ftp相关方法,貌似就是可以远程写文件滴。
至于怎么操作FTP的,其实就是封装了php函数库中ftp开头的相关函数而已,代码很简单,不说了。
typelink.class.php,我们也在partview代码里面见过的,打开看看吧。
大概看了一下代码,里面是type的链接相关的东西,每个方法都声称一个指定type的链接html字符串。
其实,我有点隐约感觉到在dedecms中,type就是指栏目,不知道是不是这样。
再来看看channelunit.class.php吧。
里面是ChannelUnit类的定义,而且我们发现,这个ChannelUnit类没有被使用过。
所以先不去看他。
我们注意到,这里面还加载了两个文件:
require_once(DEDEINC."
/dedetag.class.php"
/channelunit.func.php"
dedetag.class.php,打开看看,嗯,很复杂,但我们发现用于解析模板和生成文件的,之前看到的DedeTagParse类也在里面,呵呵,先记住,以后慢慢研究。
channelunit.func.php里面都什么函数呢?
打开一看,嗯,一堆变量,几个获取这种信息的函数,在我们浏览过程中,发现了两个函数:
MfTemplet和MakeOneTag(这里需要记住之前看到的函数)
我们知道,在index.php中就用了MfTemplet函数,回头打开index.php看看怎么调用的:
我们之前了解过,$row['
]保存的是default/index.htm这个值,就是模板文件路径。
接下来我们看看MfTemplet函数都做了什么吧。
//模板目录规则
functionMfTemplet($tmpdir)
{
$tmpdir=str_replace("
{style}"
$GLOBALS['
cfg_df_style'
],$tmpdir);
$tmpdir=ereg_replace("
/{1,}"
"
$tmpdir);
return$tmpdir;
}
注释里面写的是“模板目录规则”,再看看代码,哦,仿佛明白了一点儿了,就是替换模板路径里面的{style}为全局变量$GLOBALS['
]中的值。
应该跟使用不同模板套系有关吧。
意义不是很大就不再继续研究了。
我们看另一个函数MakeOneTag,这个在partview类的ParseTemplet方法中,此方法看名字就是解析模板,而方法的大部分代码都是在处理变量,看不大懂干什么的,最后一句调用了MakeOneTag函数。
貌似主要解析模板就是靠这个函数了。
使用如下:
MakeOneTag($this->
dtp,$this);
第一个参数是DedeTagParse类的实力,第二个参数就是partview类实例的句柄啦。
我们看看channelunit.func.php中这个函数是干什么的吧。
嗯,只能大概看,因为好多东西,我们都不清楚啊,郁闷了。
这里面遍历了/include/taglib/下所有有lib后缀的文件,并把文件路径加入数组,然后对DedeTagParse类的CTag进行了遍历,由于我们没有研究DedeTagParse类,所以这块暂时不懂呢,不过也算小有进展了。
看来还得回到partview里面去重新看看了。
构造函数没什么特别的,就是创建了DedeTagParse类实例,进行了一些设置而已。
我们知道index.php创建partview实例后执行了SetTemplet方法,我们再看看SetTemplet方法吧。
这里面调用了DedeTagParse类实例的LoadTemplet方法,看来我们就得从这里入手,去抽丝剥茧啦。
分析不下去了~
留几个疑问下次再说。
1)DedeTagParse类LoadTemplet方法说开去。
2)MakeOneTag到底在搞什么。
看来只有彻底先把DedeTagParse类LoadTemplet方法搞懂才能进一步啊,目前还是一头雾水。
dedecms代码研究(5)从DedeTagParse开始
前面,我们一直在dedecms的外围,被各种全局变量和各种调用所迷惑,我们抓住了一个关键的线索DedeTagParse类,研究明白它,就可以弄清楚很多东西了。
看看这个NB的DedeTagParse类吧。
嗯,先看构造函数,没什么特别的,就是设置了一堆初始化参数。
接下来就找LoadTemplet方法吧。
找到后,我们发现LoadTemplet方法其实是指向LoadTemplate方法的,无语啊,难道作者英文就差到此等地步?
看看那个LoadTemplate方法吧。
里面先用SetDefault方法设置了几个初始变量:
$this->
SourceString='
'
CTags='
Count=-1;
然后判断模板文件是否存在。
然后针对不同情况对$this->
SourceString赋值,并调用$this->
ParseTemplet();
方法。
这块的代码看出来,作者开发功力有待改进啊,都5.6了,代码重构还如此糟糕,唉~为什么不能把$this->
这句放在if外面呢?
文件不存在时候,很简单,就是把“文件不存在”这句话放到$this->
SourceString中,然后调用$this->
。
文件存在的时候,也很简单,fgets读取文件内容(麻烦,为啥不用file_get_contents呢),然后,又是一个if,通过$this->
LoadCache($filename)返回值判断是否有缓存,如果返回true说明读取到缓存的模板了,就返回空字符串(怎么可以这样呢?
返回值也太不负责了吧),如果返回false就调用$this->
重新解析模板。
LoadTemplate大致就是这些,无非是读取模板文件内容,然后看是否有缓存,有就不解析模板,没有就解析模板,仅此而已。
我们接下来看看$this->
LoadCache方法吧,找到方法定义的部分,呀喝,代码还不少。
先是通过$this->
IsCache判断是否允许缓存(这个属性是在DedeTagParse类实例化的时候设定的,跟dedecms的系统配置中是否加模板缓存的参数$cfg_tplcache有关,这个在DedeTagParse类的构造函数中有所体现,由于安装dedecms后,默认系统配置为true,所以这里默认就为true啦),如果为false的话,$this->
LoadCache就返回false而不继续向下走了,在LoadTemplate方法中就会根据这个返回值来决定解析模板。
过了$this->
IsCache这关,程序继续。
下面就是找当前模板文件对应的缓存了。
dedecms的文件缓存有点特别,我们找到模板缓存目录(data/tplcache),观察一下就会发现,很多名字有点相同的文件,仔细看看还能找出点规律来。
我们从代码来印证一下吧。
上面说到LoadCache方法中,我们过了$this->
IsCache这关,后面就是找模板文件了,我们看看后面的代码:
$cdir=dirname($filename);
$cachedir=DEDEROOT.$cfg_tplcache_dir;
$ckfile=str_replace($cdir,'
$filename).substr(md5($filename),0,16).'
.inc'
$ckfullfile=$cachedir.'
/'
.$ckfile;
$ckfullfile_t=$cachedir.'
.$ckfile.'
.txt'
前3句是拼缓存文件名字的,方法是取不带目录的模板文件名然后md5进行hash,然后把hash出来的字符串取前16个字符,后面加上“inc”后缀就成了。
第4句是取得完整的缓存文件名。
第5距好像是另一个文件名字,就是在缓存文件名字后面再加个后缀“.txt”
上面就得到了两个文件名字,但是我们不知道第二个文件名字干什么用的,再继续往下看咯啊的代码吧。
CacheFile=$ckfullfile;
TempMkTime=filemtime($filename);
if(!
file_exists($ckfullfile)||!
file_exists($ckfullfile_t))
returnfalse;
第1句就指定了当前模板的缓存文件
第2句读取了文件的最后修改时间,设置了一个什么时间的属性,现在还不大明白。
接下来的if语句就是如果找不到模板的两个缓存文件(就是上面组合出来的两个文件),就返回false让LoadTemplate方法解析模板去。
我们假设模板的缓存文件都有,继续看代码。
下面代码段写了注释,就是检测模板最后更新时间,代码很简单,就是打开我们前面说的那个$ckfullfile_t变量指定的txt文件,读内容,然后把内容和缓存修改时间比较,原来.txt文件是用来保存缓存文件的保存时间的。
如果时间不一致则就返回false让LoadTemplate方法解析模板去。
我们假定缓存有效,那么就可以继续了。
缓存有效就会把缓存文件包含进来。
这块就要根据缓存文件来具体分析了,所以,我们这里假定载入的是index.htm模板吧,在tplcache里面找到index.htm开头,后缀为inc的文件,打开。
我们这里节选一部分:
$z[0]=Array("
global"
"
236,264);
$z[0][4]['
name'
]="
cfg_soft_lang"
$z[1]=Array("
277,303);
$z[1][4]['
cfg_webname"
$z[2]=Array("
347,377);
$z[2][4]['
cfg_description"
$z[3]=Array("
414,441);
$z[3][4]['
cfg_keywords"
……
再回到我们的LoadC
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- dedecms 代码 详解
![提示](https://static.bdocx.com/images/bang_tan.gif)