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 声明:本系列涉及的开源程序代码学习和研究,严禁用于商业目的. 如有任何问题,欢迎和我交流.(企鹅 ...
随机推荐
- Debian 8(jessie)下设置系统启动直接进入命令行,无GUI
修改grub项 sudo vi /etc/default/grub 修改其中三项 ... GRUB_CMDLINE_LINUX_DEFAULT="quiet" GRUB_CMDLI ...
- ABOUT LIFETIME
This is where we started We've come a long way since our beginning. It all started as an idea in a g ...
- HDU 1508 DP
题意:规定一个数列 = {这个数的质因子只能包括2,3,5,7},求第n个数字是多少: 思路:暴力打表,然后只粘数据,虽然过了,但是正解其实是DP,每一个数字都是由某一个该数列里的某一个数字乘以2,3 ...
- 为python-sproto添加map支持
上个月太忙了,做完这个修改还没写博客,现在补一下.. 之前使用protobuf做协议打包的时候,经常会有个痛点,没法用具体数据的值作为key来索引数据.比如现在客户端上传了造兵协议,协议大概长这样: ...
- PHP-query 的用法
Jquery Jquery实际上相当于一个升级版的JS,Jquery里面封装了很多的东西,Jquery的功能要比JS强大,用起来比JS方便.Jquery和JS都属于JS,只不过Jquery是封装了一个 ...
- Java初学者入门应该掌握的30个概念
1.OOP中唯一关系的是对象的接口是什么,就像计算机的销售商她不管电源内部结构 是怎样的,他只关系能否给你提供电就行了,也就是只要知道can or not而不是how and why.所有的程序是由一 ...
- Ubuntu中开启MySQL远程访问功能,并将另一个数据库服务器中的数据迁移到新的服务器中
一.开启MyS远程访问功能 1.进入服务器输入netstat -an | grep 3306确认3306是否对外开放,MySQL默认状态下是不对外开放访问功能的.输入以上命令之后如果端口没有被开放就会 ...
- Jquery 中的$(this) 和javascript中的this
this 是 JavaScript 中的关键字. $(this) 可以认为是用 jQuery 包装过 JavaScript 中的 this,包装后 $(this) 就会继承 jQuery 的方法. 本 ...
- lua加载动态库缺乏相应的系统库
错误信息: 使用lua测试lm2动态库时,加载时出现如下错误 jfyuan@jfy11-B85M-D2V:~/temp/service/soft/code/ginger_resty/cores/lm2 ...
- Docker registry V2
部署私有Docker Registry 搭建 Insecure Registry 修改Registry server上的Docker daemon的配置,为DOCKER_OPTS增加–insecure ...