分析织梦栏目列表 arc.listview.class.php
织梦已经过时。还是想了解一下,继续看一下它的模板引擎,花了两天时间。
织梦的栏目列表模板是如何解析的?
“栏目”就是一个分类,“栏目列表模板”就是用列表的样子显示这个分类下的文章,
当然还有可能是其他形式,可以在后台栏目设置使用的列表模板的具体文件名。
栏目列表要用到的标签
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方法。
模板引擎的工作流程另外单独记录。
广告内容为平台自动生成