织梦文档类构造函数__construct($aid)源码详解教程
一个构造函数一般是一个类必不可少的一个函数,当然,并不是说php类中必须使用构造函数,但是,绝大多数类都要使用构造函数,这是因为,构造函数是一个类里面做初始化用的,当一个类被实例化成一个对象时,这个构造函数也就同时被调用执行,所以,构造函数对于一个类中初始化一个信息是非常有用的。
构造函数所在文件:include/arc.carchives.class.php
功能:获得主表、附加表所有字段以及栏目表里面的上级栏目id、栏目链接和模型表里面的附加表字段值。
代码分析:
初始化当前对象的错误标志:
$this->IsError = FALSE
把实例化类时的文档id进行初始化:$this->ArcID=$aid; 这样做的目的当然,是为对象的使用服务。
初始化下一篇,上一篇连接:
$this->PreNext=array();
查询微表里面的id=$aid对应的模型id和栏目id。把查询出来的结果$arr拿来进行判断,若不是数组则说明,有错误,然后,把$this->IsError 设置为TRUE;否则执行下面的代码。从这里可以看出查询微表里面的模型id和栏目id就是为了下面的代码作准备。
若模型id为0,则把$arr['channel'] 的值设置为1,因为,模型为小就是1。当然,这种情况一般不会出现。
实例化频道模型单元类:channelunit.class.php
$this->ChannelUnit = new ChannelUnit($arr['channel'], $aid);
实例化这个类的目的是为了获得$this->channelUnit对象里面的数组ChannelInfos,这个数组里面包含了所有频道模型字段信息。
通过$this->ChannelUnit->ChannelInfos['issystem']的值,是否为-1,来判断当前文档是哪个模型,在织梦里面模型分为二类,一类是系统模板,例如,文章模型、图片集模型、软件模型等,这类模型的issystem值为1,这类模型分为主表和附加表,主表是它们共同的字段表,附加表则是它们各自独立的字段表;另一类是单表独立模型,看这名称就知道是一个表,它与系统表相比它不使用主表,但是,在我们建立分类模型时,会强制把主表中的某些字段加到单表模型里面,单表模型的issystem的值是-1,当然,在织梦系统里的专题里面它的这个字段值为0。
要注意的是这个要与模型id值区别开来,分类信息模型id的值为-8,而不是-1,专题的id是-1,而不是0,这个在刚开始的读这段代码的时候,我理解成了这个id的值了,结果怎么想也想不通,后来,多读了几次,才发现自己理解错了。
若值不等于-1,说明不是单表独立模型,那么,这时查询的文档肯定在主表#@__achives,栏目表#@__arctype和#@__channeltype 里面,所以,那就联合查询这几个表,条件是在实例化时,传过来的$aid值,这样得到的是一个一维数组$this->Fields 。这个数组类似如下所示:
Array ( [id] => 109 [typeid] => 15 [typeid2] => 0 [sortrank] => 1436751758 [flag] => [ismake] => 0 [channel] => 1 [arcrank] => -1 [click] => 0 [money] => 0 [title] => sfsfsfsf [shorttitle] => [color] => [writer] => admin [source] => [litpic] => [pubdate] => 1436751758 [senddate] => 1436751758 [mid] => 1 [keywords] => [lastpost] => 0 [scores] => 0 [goodpost] => 0 [badpost] => 0 [voteid] => 0 [notpost] => 0 [description] => 织梦基地,专门学习织梦系统dedecms的网站。 [filename] => [dutyadmin] => 0 [tackid] => 0 [mtype] => 0 [weight] => 0 [reid] => 0 [typedir] => {cmspath}/a/html [addtable] => dede_addonarticle [tags] => [aid] => 109 [position] => 主页 > html5 > [phpurl] => http://www.dedebase.com/plus [indexurl] => http://www.dedebase.com/ [templeturl] => http://www.dedebase.com/templets [memberurl] => http://www.dedebase.com/member [specurl] => http://www.dedebase.com/special [indexname] => 主页 [templetdef] => /templets/default [redirecturl] => [templet] => [userip] => http://www.dedebase.com/ )
代码如下所示:
若值为-1,那么,就单表独立模型,那么就初始化这个数组$this->Fields,代码如下所示。
上面就是实例化频道模型单元的主要作用。
接下来实例化一个栏目链接类:
$this->TypeLink = new TypeLink($arr['typeid']);
这里面的参数是上面从微表查询出来的,实例化这个的作用是什么?因为,我们建立栏目时,可以设置这个栏目是否开放浏览,若,建立栏目时,这个栏目设置为注册会员或高级会员等,才能浏览的话,就要判断一下这个栏目,若栏目里面的浏览权限大于零,也就是游客不能浏览,那么,文档内容无论设置是否可以浏览,都无法浏览,因为,这个栏目都是有权限的,而文档在这个栏目下面,所以,这样就无法浏览文档,实例化这个栏目连接类的目的就是为了判断栏目是否设置为权限。
实例化后,也得到一个数组$this->TypeLink->TypeInfos,这个里面存放的是栏目所有信息,所以,通过这个数组就可以随便调用栏目里面的字段。
这一行代码:
if($this->TypeLink->TypeInfos['corank'] > 0 && $this->Fields['arcrank']==0) { $this->Fields['arcrank'] = $this->TypeLink->TypeInfos['corank']; }
就是用来判断栏目是不是大于零且当前文档浏览权限为零,这时就把栏目权限赋给当前文档权限,这样以来栏目和文档权限就一样了,例如,栏目是高级会员才能浏览,而文档任何人都可以浏览,那么,此时,执行上面的代码后,文档就成了高级会员才能浏览了。
若文档是高级会员才能浏览,是不是栏目也要自动设置为高级会员才能浏览?这样反过来就不对了,因为,文档不能决定栏目,文档只是栏目的里面的内容之一。
获得tags :$this->Fields['tags'] = GetTags($aid);无论在主表,附加表,栏目表,模型表还是微表,都没有tag的值,tag只在标签表#@__taglist里面,所以,这里要查询一下这个表,获得id=$aid的所有tag存入数组$this-fields里面。
下面又开始实例化一个静态模板引擎了,具体代码都比较简单,就是初始化一些东西,下面的页码判断:
if(empty($GLOBALS['pageno'])) { $this->NowPage = 1; } else { $this->NowPage = $GLOBALS['pageno']; }
如果全局中的页码空的话,那么,自动给$this-NowPage赋值为1,这个就是当前的页码,否则,$this->NowPage的值就是当前页码。
特殊的字段数据处理:
$this->Fields['aid'] = $aid; $this->Fields['id'] = $aid; $this->Fields['position'] = $this->TypeLink->GetPositionLink(TRUE); $this->Fields['typeid'] = $arr['typeid'];
这段代码真是没有什么好解释的,就是向数组里面冲一些字段,但是,注意的是里面用到了一个获取当前位置函数GetPositionLink(TRUE),关于这个函数我们专门给大家出一个教程,因为,这个函数比较复杂,一个函数引用另一函数,函数中套着一个函数。
设置一些全局参数的值:
foreach($GLOBALS['PubFields'] as $k=>$v) { $this->Fields[$k] = $v; }
这些全局参数在文件include/chaanelunit.func.php里面已经定义了,这是固定写好的,也没有什么值得解释的,有兴趣的可以了解下,只需要知道这个代码是处理全局参数就行了。
附加表处理:
下面的代码就是查询id为$aid的附加表,然后,把加表查询记录放在 $this->addTableRow 中,在 ParAddTable() 不再查询,代码如下:
下面具体的处理附加表数据:
若附加表不空且不为单表模型,则判断一下附加表是不是一个数组,若是,则把附加表中的字段放入数组$this->fields里面;若附加表为空,则把当前数组里面的对应字段赋给数组里面的对应的字段。代码如下所示。
否则,若是单表模型,则把数组里面这二个单元赋值为空:
$this->Fields['templet'] = $this->Fields['redirecturl'] = '';
总结:通过上面的分析,我们可以知道,这个构造函数的功能,实际上就是在组装数组$this->fields,只不过这个数组组装起来非常麻烦,要处理的情况也非常多,查询的表更多,在这个构造函数里面还实例化了好几个对象。
$arc = new Archives($aid); $reurl = $arc->MakeHtml($isremote); $needMoney = $arc->Fields['money']; $needRank = $arc->Fields['arcrank'];
一般是在实例化类Archives时就是这样用的。