dedecms讲解

来源:互联网 发布:aso优化 app排名 编辑:程序博客网 时间:2024/06/05 23:52

最近,辞职了,可能当个讲师,给老师的培训机构分享一些东西,此篇是dedecms,好久以前搞的,今天花时间又看了看:

dedecms首页文件,以及所有相关文件引入的分析,核心是:dedecms的模板解析,解析简单写了下:

dedecms开发手册:

    http://help.dedecms.com - 里面各种教程很丰富
    http://help.dedecms.com/v53/ - 可能官方手册

dedecms数据字典:

    http://help.dedecms.com/develop/2011/0714/166.html

dedecms目录结构

    有点多,另外一个文章:

dedecms目录结构

------------------

开始文件分析:

index.php入口文件

1)data/common.inc.php - 数据库配置文件,安装后,会生成,未生成表示安装失败

2)include/common.inc.php - 核心初始化文件

    1.错误级别,debug模式,版本兼容,php.ini配置项设置及检测,get,post,request安全性过滤,已经类似extract解析为独自的变量
    2.session兼容性处理,5.4之后移除的几个函数重定义。session存储路径的设置
    3.定义各种常量
    4.引入系统配置变量,后台可配置项,data/config.cache.inc.php
    5.检测到$_FILES,文件上传,引入include/uploadsafe.inc.php - 上传文件的安全检测
    6.系统安全配置文件存在,则引入:data/safe/inc_safe_config.php(验证码和验证问题配置)
    7.得到程序中会使用到的各种变量,各目录路径,网站根路径,网站系统路径,模板路径,memcache配置,smtp配置
    8.定义一个__autoload()自动加载类方法,首先尝试在 include/类名.class.php查找,找不到再到 include/model/类名.php(这个models目录不存在,我们可自己创建。定义常量时,dedecms给我们定义了现在的几个mvc经常用的model/view/controller的目录,分别是:include/model|include/templates|include/control)
    9.引入数据库处理类,优先尝试 'mysqli',其次 'mysql'(mysql尽量少用,php5.6之后已经移除) //-这里得注意下:该文件中实例化了数据库类,$dsql = $dsqli = $db = new Dedesqli(false),在之后的所有调用中,都会调用,不需要再次实例化
    10.引入include/common.func.php全局函数文件
    11.引入include/control.class.php 和 include/model.class.php
        -------
        include/control.class.php 引入了:include/dedetemplate.class.php - 模板解析类(至此,model/view/control3个都有了)
            Tag - 标记的数据结构描述
            DedeTemplate - 模板解析类
            TagAttribute - tag属性集合
            TagAttributeParse - 属性解析器
        -------
    12.如果 data/helper.inc.php 存在,引入该文件,就调用helper()-小助手函数,会引入 'include/helpers/xxx.helper.php' 小助手文件
    13.载入UCenter配置

3)include/arc.partview.class.php - 视图类

    1.include/channelunit.class.php - 频道模型单元类(查询 'channeltype-频道表' 频道数据,并处理频道的一些展示)
        -------
        include/dedetag.class.php - 织梦模版解析类
            Dedetag - 标记的数据结构描述
            DedeTagParse - 模板解析类
            DedeAttribute - 属性描述操作类
            DedeAttributeParse - 属性解析类
        include/channelunit.func.php - 频道相关的变量获取,以及引入 'include/helper/channelunit.helper.php' 助手
        -------
    2.include/typelink.class.php - 栏目链接,简单看了看,所有与栏目相关的处理。'arctype - 栏目表',栏目面包屑导航,栏目的递归等
        -------
        include/channelunit.func.php
        -------
    3.include/ftp.cass.php - ftp操作类,不支持 SFTP 和 SSL FTP 协议, 仅支持标准 FTP 协议(不清楚...)

4)该处理的逻辑,引入的文件已经完毕,从 'homepageset-首页设置' 得到首页模板,开始对模板进行处理

$pv = new PartView();$pv->SetTemplet($cfg_basedir . $cfg_templets_dir . "/" . $row['templet']);    /**     *  简述下dedetag加载模板文件的流程:     *      note:     *          class DedeTag{}  只会解析模板文件,将所有的标签和属性给赋值给$this->CTags数组中     *      1.如果$temp文件不存在,$this->dtp->SourceString = "$temp not found";  $this->dtp->ParseTemplet();      *      2.如果$temp文件存在,读取文件内容。$this->dtp->SourceString = '该文件的内容';     *          查看$temp的有无模板缓存文件 $this->dtp->LoadCache($temp); 返回true|false     *              1)模板缓存文件存在,loadcache后,返回 ''     *                  解析下loadcache()都做了什么:     *                      1.查看系统有无开启模板缓存,关闭了返回false     *                      2.根据传入的模板文件名,查询该文件名对应的'1.缓存文件名;2.缓存文件生成的时间文件',有一个不存在,返回false     *                      3.对比缓存生成时间和模板最后的修改时间,如果不相等,返回false     *                      4.引入cachefile,并将其中的解析数组,赋值给$this->dtp->CTags[$this->Count] = $CDTag数组,用于最终的加载模板     *              2)缓存文件不存在,$this->dtp->ParseTemplet();     *     sumary:     *          1.$this->dtp->SourceString 已经存储了要解析的模板文件的内容字符串     *          2.$this->dtp->ParseTemplet() 就是对 $this->dtp->SourceString 进行解析。也是赋值给$this->dtp->CTags[$this->Count] = $CDTag;     *          3.如果系统开启了模板缓存,调用$this->dtp->SaveCache(),保存解析后的模板文件数组     *     waning:     *          $this->dtp->CTags数组,是分离出的各个标签及标签的属性     */    /*        $this->dtp->CTags数组的元素,每个都是一个dedetag对象        Array(                    [0] => DedeTag Object                (                    [IsReplace] =>                     [TagName] => global                    [InnerText] =>                     [StartPos] => 236                    [EndPos] => 264                    [CAttribute] => DedeAttribute Object                        (                            [Count] => 0    //从0开始的,一般我们计数都是从1开始                            [Items] => Array                                (                                    [name] => cfg_soft_lang                                )                        )                    [TagValue] =>                     [TagID] => 0                )            )    */    /*        模板标签匹配出来,需要对解析出来的标签执行,返回结果,并替换!        arc.partview.class.php中            1.调用 'parseTemplet()',里面核心调用的是:include/channelunit.func.php中的MakeOneTag()这个函数                对 field、include/taglib/*.lib.php的标签,进行赋值操作!注意,赋值是将值,保存到了 $this->dtp->CTags->TagValue中            2.调用 'SaveToHtml()' | 'Display()',保存并输出或直接输出最终的结果,核心调用的是:include/dedetag.class.php中的GetResult()方法,它里面还有一个重要的方法,我们得需要知道:AssignSysTag()-解析其他的特殊标记                例如:global,include,foreach,var等,以及这些所有标签里包含 'runphp' 属性的,都会调用RunPHP()方法来处理标签            3.进行标签替换了,得到最终的结果!     */
















0 0
原创粉丝点击