简单回顾一下,前面我们首页动态文件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 /* 用户文件存放,例如头像   */

dedecms代码研究七的更多相关文章

  1. dedecms代码研究二

    dedecms代码研究(2)从index开始现在继续,今天讲的主要是dedecms的入口代码.先打开index.PHP看看里面是什么吧.打开根目录下的index.php嗯映入眼帘的是一个if语句.检查 ...

  2. dedecms代码研究五

    上一次留几个疑问: 1)DedeTagParse类LoadTemplet方法. 2)MakeOneTag到底在搞什么. 从DedeTagParse开始前面,我们一直在dedecms的外围,被各种全局变 ...

  3. dedecms代码研究四

    partview php文件之前,我们像掉进沼泽一样,看到无尽的变量,数组元素,莫名其面的东西摆在我们面前.今天,我们继续艰难前行,想办法走出partview类的泥潭.上一篇,我们胡乱分析了partv ...

  4. dedecms代码研究一

    dedecms相信大家一定都知道这个cms系统,功能比较强大,有比较完善的内容发布,还有内容静态化系统,还有就是它有自己独特的标签系统和模板系统.而模板系统也是其他cms系统比较难模仿的的东西,这个东 ...

  5. dedecms代码研究六

    今天讲的是dedecms最关键的东西,模板分析啦.也就是dedetag.class.php 里面的ParseTemplet方法 模板解析方法 先看看一个dedecms标签,大家心里有个数: {dede ...

  6. dedecms代码研究三

    上次,我们从dedecms的index.PHP文件中了解到了很多信息,也提出了一些问题: 1)加载了/include/common.inc.php,里面做了哪些工作? 2)/include/arc.p ...

  7. (转)dedecms代码详解 很全面

    dedecms代码研究(1)开篇dedecms 相信大家一定都知道这个cms 系统,功能比较强大,有比较完善的内容发布,还有内容静态化系统,还有就是它有自己独特的标签系统和模板系统.而模板系统也是其他 ...

  8. dedecms代码详解 很全面

    dedecms代码研究(1)开篇dedecms 相信大家一定都知道这个cms 系统,功能比较强大,有比较完善的内容发布,还有内容静态化系统,还有就是它有自己独特的标签系统和模板系统.而模板系统也是其他 ...

  9. CWMP开源代码研究——git代码工程

    原创作品,转载请注明出处,严禁非法转载.如有错误,请留言! email:40879506@qq.com 声明:本系列涉及的开源程序代码学习和研究,严禁用于商业目的. 如有任何问题,欢迎和我交流.(企鹅 ...

随机推荐

  1. MySQL高可用之MHA搭建

    测试环境 节点1 172.16.200.231 6666               master         节点2 172.16.200.27 6666 slave1              ...

  2. Javascript中封装window.open的例子

    对window.open进行封装, 使其更好用, 且更兼容, 很多人说window.open不兼容,其实不是, 因为不能直接执行, 必须通过用户手动触发才行;看代码: 代码如下 复制代码 var op ...

  3. VC中预处理指令与宏定义详解

    刚接触到MFC编程的人往往会被MFC 向导生成的各种宏定义和预处理指令所吓倒,但是预处理和宏定义又是C语言的一个强大工具.使用它们可以进行简单的源代码控制,版本控制,预警或者完成一些特殊的功能. 一个 ...

  4. javascript之小积累-.-添加form表单查询的enter键支持

    /*  * 列表查询的enter键支持  * author by 清风  */ function enterEvent() {   document.onkeydown = function(even ...

  5. hashmap的hash算法( 转)

    HashMap 中hash table 定位算法: int hash = hash(key.hashCode()); int i = indexFor(hash, table.length); 其中i ...

  6. jq 一些小方法

    js 控制a标签的onclick方法 document.getElementById("a3").onclick = ""; window.document.g ...

  7. XListView刷新

    package com.example.da; import java.util.ArrayList;import java.util.List; import com.badu.net.Networ ...

  8. UrlRewrite伪静态

    1.首先添加URLRewriter.dll.ActionlessForm.dll加到bin文件夹中,添加引用 注:URLRewriter.dll实现伪静态  ActionlessForm.dll是分页 ...

  9. Oracle创建、删除表空间、用户

    1.创建临时表空间 create temporary tablespace linshi tempfile 'e:\linshi.dbf' size 50m autoextend on next 50 ...

  10. Anchor 对象

    更改一个链接的文本.URL 以及target<html><head><script type="text/javascript"> functi ...