使dedecms的list标签支持多字段排序

织梦list标签的orderby属性只支持按一个字段排序,如果想多字段排序的话,我对后台的PHP进行了修改,使其可以支持多字段排序,修改如下:

 

先找到文件arc.listview.class.php 在主目录include文件夹下,找到

 

 //如果不用默认的sortrank或id排序,使用联合查询(数据量大时非常缓慢)
        if(preg_match('/hot|click|lastpost|title/', $orderby))
        {
            
$query = "SELECT arc.*,tp.typedir,tp.typename,tp.isdefault,tp.defaultname,
           tp.namerule,tp.namerule2,tp.ispart,tp.moresite,tp.siteurl,tp.sitepath
           
$addField
           FROM `#@__archives` arc
           LEFT JOIN `#@__arctype` tp ON arc.typeid=tp.id
           
$addJoin
           WHERE {
$this->addSql} $ordersql LIMIT $limitstart,$row";
        }
        
//普通情况先从arctiny表查出ID,然后按ID查询(速度非常快)
        else
        {
            
$t1 = ExecTime();
            
$ids = array();
            
$query = "SELECT id FROM `#@__arctiny` arc WHERE {$this->addSql} $ordersql LIMIT $limitstart,$row ";
            
$this->dsql->SetQuery($query);
            
$this->dsql->Execute();
            
while($arr=$this->dsql->GetArray())
            {
                
$ids[] = $arr['id'];
            }
            
$idstr = join(',',$ids);
            
if($idstr=='')
            {
                
return '';
            }
            
else
            {
                
$query = "SELECT arc.*,tp.typedir,tp.typename,tp.corank,tp.isdefault,tp.defaultname,
                       tp.namerule,tp.namerule2,tp.ispart,tp.moresite,tp.siteurl,tp.sitepath
                       
$addField
                       FROM `#@__archives` arc LEFT JOIN `#@__arctype` tp ON arc.typeid=tp.id
                       
$addJoin
                       WHERE arc.id in(
$idstr$ordersql ";
            }
            
$t2 = ExecTime();
            
//echo $t2-$t1;

        }

 替换为

 if($orderby=="default")
        {
            
$t1 = ExecTime();
            
$ids = array();
            
$query = "SELECT id FROM `#@__arctiny` arc WHERE {$this->addSql} $ordersql LIMIT $limitstart,$row ";
            
$this->dsql->SetQuery($query);
            
$this->dsql->Execute();
            
while($arr=$this->dsql->GetArray())
            {
                
$ids[] = $arr['id'];
            }
            
$idstr = join(',',$ids);
            
if($idstr=='')
            {
                
return '';
            }
            
else
            {
                
$query = "SELECT arc.*,tp.typedir,tp.typename,tp.corank,tp.isdefault,tp.defaultname,
                       tp.namerule,tp.namerule2,tp.ispart,tp.moresite,tp.siteurl,tp.sitepath
                       
$addField
                       FROM `#@__archives` arc LEFT JOIN `#@__arctype` tp ON arc.typeid=tp.id
                       
$addJoin
                       WHERE arc.id in(
$idstr$ordersql ";
            }
            
$t2 = ExecTime();
            
//echo $t2-$t1;

        }
         
else
        {
            
$query = "SELECT arc.*,tp.typedir,tp.typename,tp.isdefault,tp.defaultname,
           tp.namerule,tp.namerule2,tp.ispart,tp.moresite,tp.siteurl,tp.sitepath
           
$addField
           FROM `#@__archives` arc
           LEFT JOIN `#@__arctype` tp ON arc.typeid=tp.id
           
$addJoin
           WHERE {
$this->addSql} $ordersql LIMIT $limitstart,$row";
        }

 找到

else {
            
$ordersql=" ORDER BY arc.sortrank $orderWay";
        }

 替换为

else if($orderby=="default"){
            
$ordersql=" ORDER BY arc.sortrank $orderWay";
        }
        
else{
           
$ordersql=" ORDER BY ".$orderby.",arc.sortrank $orderWay";
        }

 现在在模板中就可以应用了多字段排序了,

模板应用如下:

{dede:list pagesize='17' orderby='arc.title desc,arc.id'} 

 

posted @ 2011-09-16 10:21  Byrd  阅读(847)  评论(0编辑  收藏  举报