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 /* 用户文件存放,例如头像 */
dedecms代码研究七的更多相关文章
- dedecms代码研究二
dedecms代码研究(2)从index开始现在继续,今天讲的主要是dedecms的入口代码.先打开index.PHP看看里面是什么吧.打开根目录下的index.php嗯映入眼帘的是一个if语句.检查 ...
- dedecms代码研究五
上一次留几个疑问: 1)DedeTagParse类LoadTemplet方法. 2)MakeOneTag到底在搞什么. 从DedeTagParse开始前面,我们一直在dedecms的外围,被各种全局变 ...
- dedecms代码研究四
partview php文件之前,我们像掉进沼泽一样,看到无尽的变量,数组元素,莫名其面的东西摆在我们面前.今天,我们继续艰难前行,想办法走出partview类的泥潭.上一篇,我们胡乱分析了partv ...
- dedecms代码研究一
dedecms相信大家一定都知道这个cms系统,功能比较强大,有比较完善的内容发布,还有内容静态化系统,还有就是它有自己独特的标签系统和模板系统.而模板系统也是其他cms系统比较难模仿的的东西,这个东 ...
- dedecms代码研究六
今天讲的是dedecms最关键的东西,模板分析啦.也就是dedetag.class.php 里面的ParseTemplet方法 模板解析方法 先看看一个dedecms标签,大家心里有个数: {dede ...
- dedecms代码研究三
上次,我们从dedecms的index.PHP文件中了解到了很多信息,也提出了一些问题: 1)加载了/include/common.inc.php,里面做了哪些工作? 2)/include/arc.p ...
- (转)dedecms代码详解 很全面
dedecms代码研究(1)开篇dedecms 相信大家一定都知道这个cms 系统,功能比较强大,有比较完善的内容发布,还有内容静态化系统,还有就是它有自己独特的标签系统和模板系统.而模板系统也是其他 ...
- dedecms代码详解 很全面
dedecms代码研究(1)开篇dedecms 相信大家一定都知道这个cms 系统,功能比较强大,有比较完善的内容发布,还有内容静态化系统,还有就是它有自己独特的标签系统和模板系统.而模板系统也是其他 ...
- CWMP开源代码研究——git代码工程
原创作品,转载请注明出处,严禁非法转载.如有错误,请留言! email:40879506@qq.com 声明:本系列涉及的开源程序代码学习和研究,严禁用于商业目的. 如有任何问题,欢迎和我交流.(企鹅 ...
随机推荐
- Steganography-图片隐写术
今天做DAM的作业,做到图片水印的时候,想起来当初小调同学把言页之庭的种子通过图片发给我.看到下面这个新闻真是觉得碉堡了!!技术宅又一次可以成功而隐晦的表白了!!哈哈哈!! http://war.16 ...
- phalcon:跟踪sql语句
在phalcon里有一个\Phalcon\Db\Profiler 类,这个类可以用来记录sql语句并计算消耗的时间.那么如何使用它呢? 手册里其实已经提供了方法,总结如下: 1.向$di里注册prof ...
- Neo4j Index Notes
Motivation GraphDatabasesBook: Robinson I., Webber J., Eifrem E. Graph Databases. 2013. 这本该是入门概念性质的书 ...
- Recyclerview使用系列教材
Recylerview越来越多的人使用,本人录制了一套课程,欢迎大家观看,录制的比较仓促,第一课讲解的课程目录有点问题,请大家谅解,目录请看视频外该课程介绍的内容即可. 该课程付费课程包含: 1-Re ...
- CI框架 CodeIgniter 伪静态 htaccess设置和Nginx伪静态方法
众所周知,LAMP代表Linux下Apache.MySQL.PHP这种网站服务器架构:而LNMP指的是Linux下Nginx.MySQL.PHP这种网站服务器架构.LNMP一键安装包可以从网上下载使用 ...
- Spring源码学习之:@async 方法上添加该注解实现异步调用的原理
在我们使用spring框架的过程中,在很多时候我们会使用@async注解来异步执行某一些方法,提高系统的执行效率.今天我们来探讨下 spring 是如何完成这个功能的. spring 在扫描be ...
- python 元组操作
关于元组的常用操作,请参考:http://www.runoob.com/python/python-tuples.html 元组的元素不可修改 ,元组的元素的元素可修改 count(self,valu ...
- C#调用C++ DLL类方法
C++的优势在于高效灵活,C#的优势在于简单易用,两者结合起来对项目开发来说是件好事,而且C++不容易反编译,也保障了代码的安全性,如果一些核心算法使用C#编写,那么保密就是一个问题. C++生成的D ...
- IDEA 中 显示 *.properties 为中文
效果:
- Java注释Override、Deprecated、SuppressWarnings详解(过时方法,即将删除的方法或成员变量)
Override 这个注释的作用是标识某一个方法是否覆盖了它的父类的方法.那么为什么要标识呢?让我们来看看如果不用Override标识会发生什么事情. Deprecated 这个注释是一个标记注释.所 ...