最近,辞职了,可能当个讲师,给老师的培训机构分享一些东西,此篇是dedecms,好久以前搞的,今天花时间又看了看:
dedecms首页文件,以及所有相关文件引入的分析,核心是:dedecms的模板解析,解析简单写了下:
dedecms开发手册:
http://help.dedecms.com - 里面各种教程很丰富http://help.dedecms.com/v53/ - 可能官方手册
dedecms数据字典:
http://help.dedecms.com/develop/2011/0714/166.htmldedecms目录结构
有点多,另外一个文章: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.进行标签替换了,得到最终的结果!
*/