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

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

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

“栏目”就是一个分类,“栏目列表模板”就是用列表的样子显示这个分类下的文章,

当然还有可能是其他形式,可以在后台栏目设置使用的列表模板的具体文件名。

栏目列表要用到的标签

list 和 pagelist,类似如下:// 以下被解释成五篇文章的列表

[title]

// 以下部分解释成页码链接

实际可能用到的文件,我们把默认的list_article.htm简化,然后研究,简化如下:{dede:list pagesize='5'}

[field:array runphp='yes']@me = (empty(@me['litpic']) ? "" : " %7B@me%5B"); [/field:array]

[[field:typelink/]] [field:title/] 日期:[field:pubdate function="GetDateTimeMK(@me)"/] 点击:[field:click/] 好评:[field:scores/]

[field:description/]...

{/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

// {

while($row){

if($col>1)

{

$artlist .= "

\r\n";

}

for($j=0;$j

{

if($row = $this->dsql->GetArray("al"))

{

$GLOBALS['autoindex']++;

$ids[$row['id']] = $row['id'];

最后显示

使用模板引擎的display方法。

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值