weixin

分析织梦栏目列表 arc.listview.class.php

日期: September 19, 2019 作者:网站维护

织梦已经过时。还是想了解一下,继续看一下它的模板引擎,花了两天时间。

织梦的栏目列表模板是如何解析的?

“栏目”就是一个分类,“栏目列表模板”就是用列表的样子显示这个分类下的文章,
当然还有可能是其他形式,可以在后台栏目设置使用的列表模板的具体文件名。

栏目列表要用到的标签

list 和 pagelist,类似如下:

// 以下被解释成五篇文章的列表
<list pagesize='5'>
[title]
</list>
// 以下部分解释成页码链接
<pagelist/>

实际可能用到的文件,我们把默认的list_article.htm简化,然后研究,简化如下:

    {dede:list pagesize='5'}
    <li> [field:array runphp='yes']@me = (empty(@me['litpic']) ? "" : "<a href='{@me['arcurl']}' class='preview'><img src='{@me['litpic']}'/></a>"); [/field:array]
     [<b>[field:typelink/]</b>] <a href="[field:arcurl/]" class="title">[field:title/]</a> <span class="info"> <small>日期:</small>[field:pubdate function="GetDateTimeMK(@me)"/] <small>点击:</small>[field:click/] <small>好评:</small>[field:scores/] </span>
     <p class="intro"> [field:description/]... </p>
    </li>
    {/dede:list}
    {dede:pagelist listitem="info,index,end,pre,next,pageno,option" listsize="5"/}

解析流程

我们可以用/plus/list.php?tid=1 这个链接来观看解释后的效果。tid=后面接的是栏目的id。

打开list.php,最主要的部分:

   include(DEDEINC."/arc.listview.class.php");
   $lv = new ListView($tid);
   $lv->Display();

包含了arc.listview.class.php这个文件,然后实例化这个文件里定义的listview类,然后执行类里的display方法。

细节

listview实例化之后,最开始是执行构造函数,获得一些栏目的配置信息放入实例里,创建了两个解释器,一个用来解释
{dede:xxx} 这类标签,一个用来解释前者里面的[field:xxx]这类标签。

那就从ListView的Display函数开始看。实际上有部分代码应该是多余的,实在想不出有什么用。

function Display()
{
    if($this->TypeLink->TypeInfos['ispart']>0)
    {
        $this->DisplayPartTemplets();
        return ;
    }
    $this->CountRecord();
    // 以下注释部分不知道有什么用
    /*if((empty($this->PageNo) || $this->PageNo==1)
    && $this->TypeLink->TypeInfos['ispart']==1)
    {
        $tmpdir = $GLOBALS['cfg_basedir'].$GLOBALS['cfg_templets_dir'];
        $tempfile = str_replace("{tid}",$this->TypeID,$this->Fields['tempindex']);
        $tempfile = str_replace("{cid}",$this->ChannelUnit->ChannelInfos['nid'],$tempfile);
        $tempfile = $tmpdir."/".$tempfile;
        if ( defined('DEDEMOB') )
        {
            $tempfile =str_replace('.htm','_m.htm',$tempfile);
        }
        if(!file_exists($tempfile))
        {
            $tempfile = $tmpdir."/".$GLOBALS['cfg_df_style']."/index_default.htm";
            if ( defined('DEDEMOB') )
            {
                $tempfile =str_replace('.htm','_m.htm',$tempfile);
            }
        }
        $this->dtp->LoadTemplate($tempfile);
    }*/
    $this->ParseTempletsFirst();
    $this->ParseDMFields($this->PageNo,0);
    $this->dtp->Display();
}

注释的部分似乎是多余的。

最开始判断ispart变量,ispart是栏目用封面形式展现的情况,而我们是用列表形式展现的。

然后调用CountRecord()计算文章总数量,在这里同时解析了模板,就是获得了模板里所有的标签,放到一个数组Ctags里。

ParseTempletsFirst()解释那些非{dede:list}的标签,ParseDMFields()解释{dede:list}标签。

主要看ParseDMFields如何解释,他遍历了存放所有标签的Ctags数组,如果是list或者pagelist就解析。

list标签是如何解析的

使用 GetArcList 这个函数返回list解释后的结果。

构建一个sql语句,查询出这一页的每一篇文章。

另外用上文提到的第二个模板解释器解释list标签里的包含field标签的文本。

遍历查询到的每篇文章,用模板解释器把对应的字段赋值到对应的fields标签,然后拼接出结果。

这里的代码也有点多余的东西,但不影响结果。

//这里的一个for循环的判断条件$row被后面的语句重新赋值了,
//但刚好结果是对的,当后面$row为null的时候就终止了。
//我把它直接改成了while($row)了
 //for($i=0;$i<$row;$i++)
 //       {
        while($row){
            if($col>1)
            {
                $artlist .= "<div>\r\n";
            }
            for($j=0;$j<$col;$j++)
            {
                if($row = $this->dsql->GetArray("al"))
                {
                    $GLOBALS['autoindex']++;
                    $ids[$row['id']] = $row['id'];

最后显示

使用模板引擎的display方法。

模板引擎的工作流程另外单独记录。

广告内容为平台自动生成