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 /* 用户文件存放,例如头像   */

时间: 2024-10-14 17:28:49

dedecms代码研究七的相关文章

dedecms代码研究二

dedecms代码研究(2)从index开始 现在继续,今天讲的主要是dedecms的入口代码. 先打开index.PHP看看里面是什么吧.打开根目录下的index.php嗯 映入眼帘的是一个if语句.检查/data/common.inc.php是否存在.如果不存在就跳转到安装界面. if(!file_exists(dirname(__FILE__).'/data/common.inc.php')) { header('Location:install/index.php'); exit();

dedecms代码研究一

dedecms相信大家一定都知道这个cms系统,功能比较强大,有比较完善的内容发布,还有内容静态化系统,还有就是它有自己独特的标签系统和模板系统.而模板系统也是其他cms系统比较难模仿的的东西,这个东西还是需要一点开发功力和技巧的. 本系列文章就研究一下dedecms的这套系统,挖掘一下看看里面有什么好东西. 建议大家先了解一下dedecms的功能.自己先动手用一下,对系统功能有个大概了解. 本文先带领大家了解一下dedecms的代码和功能架构. 其实,dedecms在架构上没什么应用架构模式可

dedecms代码研究五

上一次留几个疑问: 1)DedeTagParse类LoadTemplet方法. 2)MakeOneTag到底在搞什么. 从DedeTagParse开始前面,我们一直在dedecms的外围,被各种全局变量和各种调用所迷惑,我们抓住了一个关键的线索DedeTagParse类,研究明白它,就可以弄清楚很多东西了. 看看这个NB的DedeTagParse类吧. 嗯,先看构造函数,没什么特别的,就是设置了一堆初始化参数. 接下来就找LoadTemplet方法吧. 找到后,我们发现LoadTemplet方法

(转)dedecms代码详解 很全面

dedecms代码研究(1)开篇dedecms 相信大家一定都知道这个cms 系统,功能比较强大,有比较完善的内容发布,还有内容静态化系统,还有就是它有自己独特的标签系统和模板系统.而模板系统也是其他cms系统比较难模仿的的东西,这个东西还是需要一点开发功力和技巧的.本系列文章就研究一下dedecms的这套系统,挖掘一下看看里面有什么好东西.建议大家先了解一下dedecms的功能.自己先动手用一下,对系统功能有个大概了解.本文先带领大家了解一下dedecms的代码和功能架构.其实,dedecms

神经网络caffe框架源码解析--softmax_layer.cpp类代码研究

// Copyright 2013 Yangqing Jia // #include <algorithm> #include <vector> #include "caffe/layer.hpp" #include "caffe/vision_layers.hpp" #include "caffe/util/math_functions.hpp" using std::max; namespace caffe { /**

神经网络caffe框架源码解析--data_layer.cpp类代码研究

dataLayer作为整个网络的输入层, 数据从leveldb中取.leveldb的数据是通过图片转换过来的. 网络建立的时候, datalayer主要是负责设置一些参数,比如batchsize,channels,height,width等. 这次会通过读leveldb一个数据块来获取这些信息. 然后启动一个线程来预先从leveldb拉取一批数据,这些数据是图像数据和图像标签. 正向传播的时候, datalayer就把预先拉取好数据拷贝到指定的cpu或者gpu的内存. 然后启动新线程再预先拉取数

Spring代码研究-前言

好久没有写过博客了 看看上篇,也是唯一的博客是3年前刚工作写的,似乎过去了很久 一次面试,面试官突然问我,为什么要用Spring,我一时语塞,不知道从何说起 呜呜弄弄,Spring提供的DI/IOC,AOP,MVC以及对与Hibernate,JDBC的支持,很方便使用,可以使我们非常方便的编程,把更多的经历放在业务逻辑的设计上 并不自信,因为我觉得我说的不好 当然,这也是这篇博客,以及后续Spring代码分析研究博客产生的原因 工作三年,工作做过ExtJS,Flex,Twaver Flex,An

分享非常有用的Java程序(关键代码)(七)---抓屏程序

原文:分享非常有用的Java程序(关键代码)(七)---抓屏程序 import java.awt.Dimension; import java.awt.Rectangle; import java.awt.Robot; import java.awt.Toolkit; import java.awt.image.BufferedImage; import javax.imageio.ImageIO; import java.io.File; ... public void captureScre

django-cms 代码研究(七)杂七杂八

实体关系图 核心对象: cms_page/cms_placeholder/cms_cmsplugin. page模型类继承关系图 CMSPlugin&Placeholder模型类继承关系图