简单回顾一下,前面我们首页动态文件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. 几款值得推荐的android(安卓)开源框架简介

    技术不再多,知道一些常用的.不错的就够了. 该文章自有需要的时候,mark一下. 顺序不代表排名,根据自己需求进行选择即可. 1.volley 项目地址 https://github.com/sman ...

  2. 《Java中的单例模式--两种》

    //单例模式:饿汉式和懒汉式 //单例模式 /* 设计模式:解决某一类问题行之有效的解决办法(思想). 单例(Singleton):设计模式: 学习设计模式必须先弄清楚它是解决什么问题的. 单例模式是 ...

  3. 2016 - 1 - 23 json转模型 常用的第三方框架

    一: 三个常用的框架 1. Mantle - 所有模型必须继承MTModel 2. JSONModel - 所有模型必须继承JSONModel 3.MJExtension - 不需要继承任何东西. - ...

  4. 【转】精心推荐几款超实用的 CSS 开发工具

    原文转自:http://www.html5cn.org/article-5741-1.html 摘要: 当你开发一个网站或 Web 应用程序的时候,有合适的工具,绝对可以帮助您节省大量的时间.在这篇文 ...

  5. js动态添加onload、onresize、onscroll事件(另类方法)

    js动态添加onload.onresize.onscroll事件(另类方法)   window 的 onload.onresize.onscroll 事件,跟其他的事件不一样,它不能用 attachE ...

  6. 如何在 Linux 终端中知道你的公有 IP

    导读 在本文中我将会介绍在几种在 Linux 终端中查看你的公有 IP 地址的方法.这对普通用户来说并无意义,但 Linux 服务器(无GUI或者作为只能使用基本工具的用户登录时)会很有用.无论如何, ...

  7. LA 3027 合作网络 并查集

    题目链接: https://icpcarchive.ecs.baylor.edu/index.php?option=com_onlinejudge&Itemid=8&page=show ...

  8. JS和JQuery总结

    目录目录    2js部分一.词法结构    1.区分大小写    2.注意   // 单行      /*  多行注释  */    3.字面量(直接量  literal)        12  / ...

  9. Python error: ascii’/'utf-8′ codec can’t decode byte 0xb8 in position 50: ord

    字符串使用了费ascii编码的字符,也就是它代表的16进制的编码超过127. 解决这个问题可以使用下面的方法解决,其实就是设置默认的编码.python 2.x的默认编码是ascii,如果改为utf-8 ...

  10. 在package.json里面的script设置环境变量,区分开发及生产环境。注意mac与windows的设置方式不一样

    在package.json里面的script设置环境变量,区分开发及生产环境. 注意mac与windows的设置方式不一样. "scripts": { "publish- ...