今天有空就继续完成没有完成的事业。今天就接上一篇文章继续讲dedecms的静态页面生成过程。
简单回顾一下,前面我们首页动态文件index.php调用arc.partview.class.php来初始化首页模板,arc.partview.class.php通过SetTemplet调用DedeTagParse,在设置首页模板的时候,解析了模板,并生成模板的缓存或者说序列化文件。虽然模板被解析了,但是这种解析的只是把所有标签在模板中的位置以及他们的参数记录下来,并没有填充数据,接下来估计就要干这些事情了。
我们回到partview的SetTemplet方法,从$this->dtp->LoadTemplet($temp);这句往下看吧。
下面if($this->TypeID > 0)这个if语句是设置当前页面的“面包屑导航”和标题。如果你使用过dedecms,对dedecms系统的操作比较熟悉,应该了解这个if里面的$this->Fields['title']这种数组元素,在页面模板中很多地方都是用了fields数组呢。
设置了两个变量,接下来就调用ParseTemplet解析模板啦。
这个ParseTemplet很简单,设置了一大堆全局变量,一看就知道了,页面里面用的什么channelid,topid之类的东西,有兴趣的朋友可以自己细致研究一下。我们注意到ParseTemplet方法最后一句,MakeOneTag($this->dtp,$this); 因为前面的东西都是没什么实质性的,这个应该很关键了。找到这个函数看看吧。
先看看MakeOneTag函数的参数,前两个参数都是引用传递的,第一个参数是传入DedeTagParse的实例,第二个参数是传入partview的实例。
开始用一个循环获取系统所拥有的所有标签列表
$dh = dir(DEDEINC.'/taglib');
while($filename = $dh->read()){
if(ereg("\.lib\.",$filename)){
$alltags[] = str_replace('.lib.php','',$filename);
}
}
$dh->Close();
代码很简单,就是遍历/include/taglib目录,根据文件规则取文件名,形成一个所有标签的数组。
接下来就是一个大的foreach数组了,遍历在partview类中实例化并解析了当前模板的DedeTagParse的实例的CTags属性,我们通过前面对DedeTagParse的分析知道CTags实际上是模板中所有使用的标签及其参数的集合而已,这里就开始遍历这些模板上的标签进行赋值,替换之类的啦。
我们继续看这个foreach都干了什么。
先获取循环中当前标签的名字。
接下来是针对标签名为field的标签的操作。
如果是field标签的时候,先获取标签的name属性,当名字是array的时候则通过DedeTagParse的Assign方法把partview的Fields数组赋给标签名对应的值属性(详情看Assign的代码,由于比较简单这里略过)。如果标签name属性不是array,则把partview的Fields数组中指定名字的值赋给标签对应的值。下面的else是进行一些其他判断也很简单,然后field标签就解析完了,这样我们就知道了field标签就是相当于变量,此处就是给这些变量赋值,解析完之后,就继续循环分析下个标签了。
接下来的两个if是做标签名字的兼容性了,我们看到arclist有一堆标签名字~
再接下来就是看看模板中的标签是否有对应的系统标签了,如果有,就载入对应的文件,调用对应的函数,把函数返回值赋值给模板标签对应的值。
这样,整个模板的标签就完成赋值了。
至于系统中那些标签(/include/taglib/下的那些标签解析文件)其实就是一个函数,里面读取数据库数据,组织数据,输出而已。
这节就到这里了,主要讲了分析好的模板标签如何绑定最终数据的。其实比较简单,因为模板分析的时候已经得到了当前模板所使用的全部标签,接下来只要遍历标签,调用不同的标签函数,获取函数返回数据就行了。
有些细心的朋友会发现,到这里其实还没有完,数据什么的都得到了,接下来呢?是如何生成静态文件的?
这就是下一节要讲的东西啦。
附:dedecms(v5.6)系统目录
a /* 生成HTML的目录 */
|data /* 程序生成常用数据保存目录 */
| |admin /* 保存系统后台常规配置,例如作者、快速导航、来源,以文本格式存放*/
| |backupdata /* 数据库备份存放目录,可以在系统后台设置处修改 */
| |cache /* 系统缓存 */
| |enums /* 联动类别生成的缓存和js文件 */
| |js /* 栏目js调用生成的js文件 */
| |mark /* 图片水印设置目录 */
| |module /* 系统后台那些模块安装包存放的目录,通常文件名称加密过 */
| |rss /* 生成RSSmap存放的文件目录 */
| |sessions /* 系统sessions存放目录,登陆后就会生成个session,目录需可写*/
| |textdata /* 文本数据,系统后台保存为文本数据存放目录 */
| |tplcache /* 模板缓存目录,这个缓存一般是那些动态页 */
| |ziptmp /* 压缩缓存目录 */
|dede /* 系统后台管理目录 */
| |img
| |inc
| |js
| |templets /* 系统后台的模板存放目录 */
|images
| |js
| |swfupload
| | |images
| | |plugins
|include /* 系统核心类库、函数存放目录 */
| |calendar /* 日历控件,就是日期编辑框跳出来的那个日历框 */
| |code /* datalistcp动态分页类的编码语言包 */
| |data /* 系统核心设置的数据,比如词库默认验证码 */
| |dialog /* 系统对话框存放目录,编辑器上面选择的类似于缩略图、插入图片文件*
| | |img
| |FCKeditor /* 编辑器存放目录,用的是开源编辑器FCK */
| | |editor
| | | |css
| | | | |images
| | | |dialog
| | | | |common
| | | | |fck_about
| | | | |fck_codes
| | | | |fck_flash
| | | | |fck_image
| | | | |fck_link
| | | |dtd
| | | |images
| | | | |smiley
| | | |js
| | | |lang
| | | |skins
| | | | |images
| |inc /* 这里存放一些用才引入的比较长的函数 */
| |taglib /* 就是那些用在模板中的标签存放的目录了 */
| | |channel /* 解析一些特殊字段的扩展函数库 */
| | |help /* 基本的标签说明 */
| |tpllib /* 动态模板标签,一般用在动态调用页面上面的标签 */
|install /* 安装目录 */
| |images
| |templates
|member /* 会员中心目录 */
| |images
| | |pay
| |inc /* 会员中心 */
| |js
| |paycenter /* 支付接口配置 */
| | |alipay
| | |cbpayment
| | |nps
| | |tenpay
| | |yeepay
| |space /* 会员中心的空间模板 */
| | |coffee
| | | |images
| | |company
| | | |images
| | |flower
| | | |images
| | |gray
| | | |images
| | |lxblog
| | | |images
| | |lxbrown
| | | |images
| | |lxvista
| | | |images
| | |person
| | | |blue
| | | |common
| | | | |css
| | | | |images
| | | |images
| | |pwblue
| | | |images
| | |pwglight
| | | |images
| | |pwlake
| | | |images
| | |pwpink
| | | |images
| |templets
|plus /* 系统插件存放目录 */
| |guestbook /* 留言板插件 */
| | |images
| |img
| | |face
| |paycenter
| | |alipay
| | |cbpayment
| | |nps
| | |tenpay
| | |yeepay
| |task
|special /* 专题存放目录 */
|templets /* 织梦模板存放目录 */
| |default /* 系统默认模板目录 */
| |images
| | |mood
| | |photo
| |js
| |style /* 默认模板存放的CSS样式 */
| |plus /* 插件页面的模板文件存放目录 */
| |system /* 系统核心底层模板文件夹 */
| |wap /* 那个wap模块的样式目录了 */
|uploads /* 文件上传存放目录 */
| |allimg /* 图片 */
| |flink /* 友情链接图片 */
| |litimg /* 缩略图 */
| |media /* 多媒体存放目录 */
| |soft /* 软件 */
| |userup /* 用户文件存放,例如头像 */