织梦文档类构造函数__construct($aid)源码详解教程

admin2023-01-191069

一个构造函数一般是一个类必不可少的一个函数,当然,并不是说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/
)

代码如下所示:

135936ubsbawbsvss6vwsx.jpg

若值为-1,那么,就单表独立模型,那么就初始化这个数组$this->Fields,代码如下所示。

135953do0kkv5xhwv9kwd8.jpg

上面就是实例化频道模型单元的主要作用。

接下来实例化一个栏目链接类:

$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() 不再查询,代码如下:

140139v7t3i73tmx8m6sw8.jpg

下面具体的处理附加表数据:

若附加表不空且不为单表模型,则判断一下附加表是不是一个数组,若是,则把附加表中的字段放入数组$this->fields里面;若附加表为空,则把当前数组里面的对应字段赋给数组里面的对应的字段。代码如下所示。

140149oxsbpu8l1sbwbc6g.jpg

否则,若是单表模型,则把数组里面这二个单元赋值为空:

$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时就是这样用的。

网友评论