·您现在的位置: 云翼网络 >> 文章中心 >> 网站建设 >> 网站建设开发 >> php网站开发 >> dedecms代码详解 很全面

dedecms代码详解 很全面

作者:佚名      php网站开发编辑:admin      更新时间:2022-07-23
dedecms代码详解 很全面

dedecms代码研究(1)开篇dedecms 相信大家一定都知道这个cms 系统,功能比较强大,有比较完善的内容发布,还有内容静态化系统,还有就是它有自己独特的标签系统和模板系统。而模板系统也是其他cms系统比较难模仿的的东西,这个东西还是需要一点开发功力和技巧的。本系列文章就研究一下dedecms的这套系统,挖掘一下看看里面有什么好东西。建议大家先了解一下dedecms的功能。自己先动手用一下,对系统功能有个大概了解。本文先带领大家了解一下dedecms的代码和功能架构。其实,dedecms在架构上没什么应用架构模式可言,就是最简单的php 应用而已。访问不同的PHP 文件,管理不同的系统功能。看目录大家都能猜出来各个目录干什么用的。include目录放系统的一些公用函数和类,plus目录放插件,templates目录放模板,dede 目录是管理后台目录。我们打开include 目录,看看里面都有什么好东西。calendar 一个选时间的jscaptcha 一个验证码,还是开源组件code 没啥意思,翻页的文字data 里面是一些系统用到的资源,比如声音,分词库,字体,图片等dialog 里面估计是一些Ajax弹出窗口的内容部分。以后碰到了再说inc 里面一些单独的功能类函数,以后研究一下为什么要单独放payment 支付接口taglib 好东西,是dedecms的标签存放的地方,打开看看,里面一堆文件,貌似就是dedecms的模板标签啦tpllib 模板库?暂时搞不明白,希望随着研究深入,能弄明白其他 include 目录下的文件估计都是一些最基本的功能文件啦,比如常用函数,模板系统之类的东西了。用到再说吧打开dede目录(就是dedecms的管理目录)看看,哟嗬,里面的东西还挺多,看名字就知道了,都是各种功能管理文件,一个功能一个文件。最原始的网站开发模式做出来的。我们姑且称之为高效吧。毕竟PHPwind和discuz之类也是用类似的方法开发的。整个程序大体就这些东西啦。功能就不讲了,建议不熟悉dedecms的朋友自己看一下dedecms的后台管理功能,这样能有助于我们更好理解和分析它。另外提一点,我们的这次代码分析,主要分析的是其页面生成、显示、模板处理、标签处理部分,这套系统也是dedecms比较引以为傲的东西,之后呢,还会分析一些笔者觉得比较酷的功能代码。最后,希望这次代码分析旅程能让大家有所收获。sourcejoy 之dedecms代码研究(2)从index开始现在继续,今天讲的主要是dedecms的入口代码。2先打开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_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']);$pv->SaveToHtml(dirname(__FILE__).'/index.html');include(dirname(__FILE__).'/index.html');exit();先是加载/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表,晕,就一条记录,俩字段,基本猜到了,一个是首页模板名称,一个是生成的静态文件的位置。回来继续分析前面的代码$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']);3$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类的相关方法都有什么秘密?带着这几个疑问,我们将结束本文,后面的文章将将这些谜题一一揭开。sourcejoy 之dedecms代码研究(3)partview的迷惑上次,我们从dedecms的index.php文件中了解到了很多信息,也提出了一些问题,本文开始就带着前面的问题,继续我们的dedecms之旅吧。先回顾一下之前我们在index.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.php4嗯,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是重点,下次得重点分析了。今天就到这吧,鸟儿的~太乱了,一点章法都没有~sourcejoy 之dedecms代码研究(4)继续徘徊partview之前,我们像掉进沼泽一样,看到无尽的变量,数组元素,莫名其面的东西摆在我们面前。今天,我们继续艰难前行,想办法走出partview类的泥潭。上一篇,我们胡乱分析了partview类,完全搞不懂干什么的,里面弄了一堆变量,最清晰的我们只是知道几个生成首页的关键地方调用了DedeTagParse 类的LoadTemplet 方法和SaveTo 方法。而在partview 类定义的文件头部,包含了几个文件,我们就避开partview,先来看看这几个包含的文件吧。require_once(DEDEINC.'/channelunit.class.php');require_once(DEDEINC.'/typelink.class.php');require_once(DEDEINC.'/ftp.class.php');5ftp.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");require_once(DEDEINC."/channelunit.func.php");dedetag.class.php,打开看看,嗯,很复杂,但我们发现用于解析模板和生成文件的DedeTagParse 类在里面,呵呵,先记住,以后慢慢研究。channelunit.func.php 里面都什么函数呢?打开一看,嗯,一堆变量,几个获取这种信息的函数,在我们浏览过程中,发现了两个函数:MfTemplet 和MakeOneTag我们知道,在index.php 中就用了MfTemplet 函数,回头打开index.php 看看怎么调用的:$row['templet'] = MfTemplet($row['templet']);我们之前了解过,$row['templet']保存的是default/index.htm 这个值,就是模板文件路径。接下来我们看看MfTemplet 函数都做了什么吧。//模板目录规则function MfTemplet($tmpdir){$tmpdir = str_replace("{style}",$GLOBALS['cfg_df_style'],$tmpdir);$tmpdir = ereg_replace("/{1,}","/",$tmpdir);return $tmpdir;}注释里面写的是“模板目录规则”,再看看代码,哦,仿佛明白了一点儿了,就是替换模板路径里面的{style}为全局变量$GLOBALS['cfg_df_style']中的值。应该跟使用不同模板套系有关吧。意义不是很大就不再继续研究了。我们看另一个函数MakeOneTag,这个在partview类的ParseTemplet 方法中,此方法看名字就是解析模板,而方法的大部分代码都是在处理变量,看不大懂干什么的,最后一句调用了MakeOneTag 函数。貌似主要解析模板就是靠这个函数了。使用如下:MakeOneTag($this->dtp,$this);第一个参数是DedeTagParse类的实力,第二个参数就是partview类实例的句柄啦。我们看看channelunit.func.php 中这个函数是干什么的吧。嗯,只能大概看,因为好多东西,我们都不清楚啊,郁闷了。这里面遍历了/include/taglib/下所有有lib 后缀的文件,并把文件路径加入数组,然后对DedeTagParse 类的CTag 进行了遍历,6由于我们没有研究DedeTagParse 类,所以这块暂时不懂呢,不过也算小有进展了。看来还得回到partview里面去重新看看了。构造函数没什么特别的,就是创建了DedeTagParse 类实例,进行了一些设置而已。我们知道index.php 创建partview实例后执行了SetTemplet 方法,我们再看看SetTemplet 方法吧。这里面调用了DedeTagParse类实例的LoadTemplet 方法,看来我们就得从这里入手,去抽丝剥茧啦。分析不下去了~留几个疑问下次再说。1)DedeTagParse 类LoadTemplet 方法说开去。2)MakeOneTag 到底在搞什么。看来只有彻底先把DedeTagParse 类LoadTemplet 方法搞懂才能进一步啊,目前还是一头雾水。sourcejoy 之dedecms代码研究(5)从DedeTagParse开始前面,我们一直在dedecms 的外围,被各种全局变量和各种调用所迷惑,我们抓住了一个关键的线索DedeTagParse 类,研究明白它,就可以弄清楚很多东西了。看看这个 NB 的DedeTagParse 类吧。嗯,先看构造函数,没什么特别的,就是设置了一堆初始化参数。接下来就找LoadTemplet 方法吧。找到后,我们发现LoadTemplet 方法其实是指向LoadTemplate 方法的,无语啊,难道作者英文就差到此等地步?看看那个LoadTemplate 方法吧。里面先用 SetDefault 方法设置了几个初始变量:$this->SourceString = '';$this->CTags = '';$this->Count=-1;然后判断模板文件是否存在。然后针对不同情况对$this->SourceString 赋值,并调用$this->ParseTemplet();方法。这块的代码看出来,作者开发功力有待改进啊,都5.6 了,代码重构还如此糟糕,唉~为什么不能把$this->ParseTemplet();这句放在if 外面呢?文件不存在时候,很简单,就是把“文件不存在”这句话放到$this->SourceString 中,然后调用$this->ParseTemplet();。文件存在的时候,也很简单,fgets 读取文件内容(麻烦,为啥不用file_get_contents 呢),然后,又是一个if,通过$this->LoadCache($filename)返回值判断是否有缓存,如果返回true 说明读取到缓存的模板了,就返回空字符串(怎么可以这样呢?返回值也太不负责了吧),如果返回false 就调用$this->ParseTemplet();重新解析模板。LoadTemplate 大致就是这些,无非是读取模板文件内容,然后看是否有缓存,有就不解析模板,没有就解析模板,仅此而已。我们接下来看看$this->LoadCache 方法吧,找到方法定义的部分,呀喝,代码还不少。7先是通过$this->IsCache 判断是否允许缓存(这个属性是在DedeTagParse 类实例化的时候设定的,跟dede