织梦会员列表视图类和动态分页类对比分析

admin2020-01-10960

这二个类文件分别是:

会员列表视图类:/include/arc.memberlistview.class.php

动态分页类:/include/datalistcp.class.php

为什么要对这二个类进行对比分析,而不是其它的二个类进行对比分析呢?原因是首先他们有有相同点是它们都是类,而且,都是应用的是动态模板引擎,都是调用数据库表数据库,都可以实现动态分页,这二个类里面的代码也几乎完全一样这是它们的共同点。

不同点是动态分页类里面多了过滤函数XSSClean($val)和RemoveXss($val),并且获取当前页数据列表函数比较简单,而会员列表视图类则没有过滤函数,并且,获取当前数据列表函数,有一个处理从数据库表取出来的字段的一大段代码,这是它们二个区别,但是,无论怎么区别和联系,它们的功能是一样的,都是调取数据,并分页。

最重要的是它们用的都是动态模板引擎,在后台里面几乎所有动态页,只要是分页的用的就是动态分类页,而会员列表视图类,只在会员里面使用。

若是对比我们发现二个文件的内容几乎没有差别,所以,我们只需要把其中一个研究透彻了,那么,另一个一看就明白了。

因为我们对动态分页类每个函数或方法都已经解读了,所以,这里就不多介绍了,本教程主要介绍会员列表视图类的使用方法。

其实,使用这个会员列表视图类的在织梦里面只有一个地方“空间操作”,如下图所示。

对应的文件为:member/inc/space_action.php

我查了一下,好像只有这一个地方用到arc.memberlistview.class.php类文件。

我就拿出其中一个来讲解一下,使用这个类的流程,当织梦基地分析完你会发现,原来它的使用方法跟动态分页类,完全一样,因为,它的编译方式跟动态分页类也是一样的。

我们以上图中文章栏目为例子,对应的连接类似:http://www.dedebase.com/member/index.php?uid=admin&action=article

这个“文章”栏目对应的代码在文件:space_action.php里面的下面这段代码。

引入文件:include_once(DEDEINC.'/arc.memberlistview.class.php');

设置sql查询语句,这里用了三个表分别为文章模型附加表# __addonarticle,栏目表# __arctype和会员分类表# __mtypes

实例化类MemberListview,引入模板,设置sql语句,并显示。

$dlist = new MemberListview();

      $dlist->pageSize = $_vars['pagesize'];
      $dlist->SetParameter("mtype",$mtype);
      $dlist->SetParameter("uid",$_vars['userid']);
      $dlist->SetParameter("action",$action);

$dlist->SetTemplate(DEDEMEMBER."/space/{$_vars['spacestyle']}/listarticle.htm");

$dlist->SetSource($query);

$dlist->Display();

exit();

织梦基地现在就对这四个过程进行分析,只要把这四个过程分析完了,这个类也就弄明白是做什么的了。

首先,实例化类MemberListview,当我们一实例化后,里面的构造函数就马上实例化动态模板引擎了,这是非常重要的,如果没有这个,那么,这个类文件什么也做不了,后面的空间内容也不也不会显示。然后,载入模板。因为,上面这段代码在实例化会员列表分页类时,并没有载入模板,所以,此时,虽然构造函数里面有载入模板函数,其实,并没有去载入,因为,里面有一个判断,只有实例化时,载入模板了,才能执行在这个构造函数载入模板。

然后,通过函数SetParameter()设置一些参数,这些参数都可以动态的调用。

接下来就是载入模板,此时,调用的是会员列表类里面的SetTemplate()函数,我们看一下这个函数的代码:

function SetTemplet($tplfile)
    {
        $this->tpl->LoadTemplate($tplfile);
    }

从这段代码我们可以看出,原来这个是间接的调用模板引擎里面的载入模板,当载入模板后,动态模板引擎就会解析模板:首先把模板处理成字符串并保存到$this->sourceString里面,然后,再对这个字符串进行解析里面的标记极其属性放入到一个数组里面,然后,再把这些标签进行一个一个的解析,替换并对应的替换原来的标签,此时,得到的模板是一个已经替换好的,里面的标签都已经替换成了php代码,但是,此时,并没有生成缓存文件。
接着程序会执行第三步:$dlist->SetSource($query);把sql语句设置好,也就是把这个语句放到了$this->sourceSql里面,以供下面使用,在这里还看不出这个有什么作用,这个会在后面就发现他做什么了。
紧接着程序会执行下面的代码:$dlist->Display();这个代码虽然,一行,但是,做的事却非常多,明显的是老黄牛一级的,出大力从不埋怨,这行代码在类arc.memberlistview.class.php中对应的代码是:

function Display()
    {
        
        if($this->sourceSql != '') $this->PreLoad();

        //在PHP4中,对象引用必须放在display之前,放在其它位置中无效
        $this->tpl->SetObject($this);
        $this->tpl->Display();
    }

这个里面又调用PreLoad()这个函数,这个函数就用到了上面提到的$this->sourceSql,也就是我们在space_action.php文件里面的sql语句,即如下图所示:

正是这个PreLoad()函数,使得“文章”分页才有了可能。
然后,调用模板引擎里面的Display(),这时,解析好的模板才写入缓存data/tplcache/里面,然后,再把这个解析好的模板文件,引入到space_action.php里面,此时,编译好的模板就成了这个文件中的一部分,我们先看一下这个模板文件:listarticle.htm
这个模板文件用到了标签{dede:datalist}以及分页标签{dede:pagelist/}。
它们编译后的php代码分析为:
标签{dede:datalist}编译后的php代码:

<?php
$atts = array();
$atts['tagname'] = 'datalist';
$blockValue = $this->refObj->GetArcList($atts,$this->refObj,$fields);
if(is_array($blockValue)){
foreach( $blockValue as $key=>$fields )
{
?>

标签{dede:pagelist/}编译后的php代码:

$atts = array();
$atts['tagname'] = 'pagelist';
 echo $this->refObj->GetPageList($atts,$this->refObj,$fields);
?>

此时,程序会调用函数GetArcList($atts,$this->refObj,$fields),这个函数在类arc.memberlistview.class.php里面,是获取数据列表,这样通过上面的遍历就把数据一条一条遍历出来了,然后,在“文章”栏目里面显示出来,也就是我们在用户空间看到的文章列表。
然后,程序再执行调用函数GetPageList($atts,$this->refObj,$fields)当然,这个跟上面的函数是在同一个类里面,这个就用到了PreLoad()处理后的数据,例如$totalresault等,分页要用到的数据,这样分页又实现了,所以,我们在文章页才能看到文件和分页列表。
如果你看过织梦基地对content_list.php分析的话,你会发现,这二个流程完全一样,解析的代码也完全一样,唯一不一样的地方就是调取数据和分类不一样,其它完全相同。
织梦空间这个分页可能有问题。没有分页,等有空我改进一下,可能是bug 。

网友评论