当我们在织梦dedecms后台添加文章或其它文档时,点击“保存”后,根据前台模板(在templets/default里面的模板)生成了静态网页。今天就简述一下织梦dedecms,实现这一过程一的大体步骤,因为,牵涉的文件太多,先概述一下,以后,会对每个功能进行分析学习。
本教程以文章模型为例子,以下是文章型的相关信息:
模型id 是 1;
模型对应的模板:封面模板index_arcticle.htm,列表页模板list_arcticle.htm,内容页模板arcticle_arcticle.htm
使用的模板引擎是:dedetag.class.php
后台添加文章的模板文件是:article_add.htm,对应的处理文件是article_add.php。
分析开始。
当在后台添加数据,点击“保存”后,程序会把我们填写的,例如标题,标签,作者,来源,文章内容等数据一同传给article_add.php文件,这个文件除了接收这些数据,还接收到了这篇即将要生成的静态网页的栏目id和模型id。其它的数据我们就不多说,这二个id,最重要的,这二项是从哪里来的,实际是当我们打开后台对应的栏目,这二个id就已经从对应的数据库表中查询出来了。
然后,通过这二个id,生成这篇文章的id,即织梦的叫法是文档id。
生成文档id函数:$arcID = GetIndexKey($arcrank,$typeid,$sortrank,$channelid,$senddate,$adminid);从这个函数的参数我们就看出,包括了上面提到的栏目id和频道模型id。生成的这个文档id,非常重要,因为下面用于生成html网页的函数,就以这个文档id为参数。
这个函数在文件include/helpers/archive.helper.php里面大约150行。
生成html函数:$artUrl = MakeArt($arcID,true,true,$isremote);请看里面的参数$arcID正是上面生成的文档id,这一点要清楚。
这个函数在文件dede/inc/inc_archives_functions.php里面大约394行。
函数MakeArt()是我们今天分析的对象,找到这个文件,我们发现它引入了文档类arc.archives.class.php,然后,实例化一个对象,并把$aid作为参数,注意,这个参数就是上面提到的生成的$arcID,代码如下:$arc = newArchives($aid);虽然,就这么一句话,但是对象$arc确做了很多事,这全是因为构造函数的原因,当实例时,启动了这个构造函数。
打开文件arc.archives.class.php文件,我们看到构造函数首页根据传过来的id,从数据库微表中查询出模型id和栏目id,这个栏目id和模型id跟上面提到的栏目id和模型id是一样的,为什么呢?因为,这个文档id正是根据这个二个id生成的,只不过存储在了这个微表#@_arctiny里面吧了。
接下来,在这个构造函数里面又实例化了一个对象$this->ChannelUnit,代码是$this->ChannelUnit = new ChannelUnit($arr['channel'], $aid);在实例化时,这二个参数一个是是刚才从微表查询出来的模型id,一个是文档id,我们再打开频道模型单元类文件channelunit.class.php,里面又一个构造函数,我们再在这个函数里分析,请注意,现在我们已经到了channelunit.class.php这里面了。
这里面的构造函数通过模型id,查询数据库表#@_channeltype里面的所有字段,然后,又实例化了一个对象,代码是$dtp = new DedeTagParse();我们再打开这个类对应的静态模板引擎文件dedetag.class.php文件。这里面又一个构造函数,幸运的是这个构造函数里面没有再引入其它类文件了。
返回channelunit.class.php里面接着看代码,实例化对象$dtp后,设置了名子空间,把刚才从数据库表#@_channeltype查出来的字段fieldset值,作为参数,载入模板中,然后,对这个标签进行分析,请注意fieldset的值,正是我们后台在添加字段,在字段配置里面看到的值,类似的如下图所示。
通过这个构造函数,程序就把附加表字段的值,装进二维数组$this->ChannelFields里面了,以备后面使用。到此,这个构造函数结束。
再加到上一层调用实例化,即回到文件arc.archives.class.php里面,接着下面的代码,又把类TypeLink进行实例化,这个类文件在文件include/typelink.class.php里面,当实例化$this->TypeLink = new TypeLink($arr['typeid']);时,参数是通过生成的文档id查询出来的栏目id。这个构造函数是通过这个栏目id,把我们网站后台对应的模板提取出来,放入$this->TypeInfos数组里面,此构造函数到此结果,从上面可以看见,构造函数在初始化时很有用处。
再回到arc.archives.php里面,接着看下面的代码,判断当前模型是不是单表模型,若不是则通过一个联合查询,把字段信息查询出来放到$this->Fields,若是单表模型则全部置初始化,代码如下:
再向下的代码,就是对特殊的字段数据处理了。这个构造函数到此结束,再加到上一个实例化处,即文件inc_archives_function.php里。
然后,调用函数MakeHtml($isremote),我们再回到文件arc.archives.class.php里面,找到这个函数,大约在351行,上面的初始化,全为这个生成静态函数服务的。
在这个函数中先载入模板,这里的模板是后台栏目对应的模板,然后,通过函数ParAddTable()解析附加表的内容,在这个函数里面,有一个字段值处理函数MakeField($k, $row[$k], $ctag),这个是处理include/taglib/channel/里
面的标签源码的,例如图片集里面的imgurls字段值,软件模型里面的softlinks,这个函数是专门处理字段值有多个标签的这些,还有其它的特殊的字段值的,也是加载channel文件夹里面的标签的一个函数。
要注意的是:软件模型时面的有一个特殊的类型是softlinks,这是织梦系统固有的,用户加不上的。大家可以看一下软件模型添加字段配置里面的这个介绍。
处理标签源码include/taglib里面的标签用的函数是:MakeOneTag($this->dtp, $this, 'N'),通过这个函数,就可以把标签源码全部加载进来,对模板进行解析。
接下来就是通过ParseTempletsFirst()对模板进行解析,生成静态网页,因为是,概述,所以,下面的代码,不用多分析,请自己研究一下。
织梦dedecms生成html的过程大同小异,其它模板用到的函数等全跟这个一样,只不过里面的一些具体内容,处理稍微不大一样,但用到的功能其它一样,只要精通一个,其它,自然就会了,这个教程是比较浅的作了一个分析,如果要分析每个代码,那得用好长时间,后面的教程,将对这每个功能,进行具体分析。
(责任编辑:好模板) |