DEDECMS给list标签加上多字段排序功能

dedecms的list标签orderby属性只支持按一个字段排序,假如想多个字段排序的话,就需要对PHP举办修改,使其可以支持多字段排序,修改如下:
 打开include/arc.listview.class.php,找到:
  1. //假如不消默认的sortrank或id排序,利用连系查询(数据量大时很是迟钝) 
  2.        if(preg_match('/hot|click|lastpost|title/'$orderby)) 
  3.        { 
  4.            $query = "SELECT arc.*,tp.typedir,tp.typename,tp.isdefault,tp.defaultname, 
  5.           tp.namerule,tp.namerule2,tp.ispart,tp.moresite,tp.siteurl,tp.sitepath 
  6.           $addField 
  7.           FROM `js_archives` arc 
  8.           LEFT JOIN `js_arctype` tp ON arc.typeid=tp.id 
  9.           $addJoin 
  10.           WHERE {$this->addSql} $ordersql LIMIT $limitstart,$row"; 
  11.        } 
  12.        //普通环境先从arctiny表查出ID,然后按ID查询(速度很是快) 
  13.        else 
  14.        { 
  15.            $t1 = ExecTime(); 
  16.            $ids = array(); 
  17.            $query = "SELECT id FROM `js_arctiny` arc WHERE {$this->addSql} $ordersql LIMIT $limitstart,$row "
  18.            $this->dsql->SetQuery($query); 
  19.            $this->dsql->Execute(); 
  20.            while($arr=$this->dsql->GetArray()) 
  21.            { 
  22.                $ids[] = $arr['id']; 
  23.            } 
  24.            $idstr = join(',',$ids); 
  25.            if($idstr==''
  26.            { 
  27.                return ''
  28.            } 
  29.            else 
  30.            { 
  31.                $query = "SELECT arc.*,tp.typedir,tp.typename,tp.corank,tp.isdefault,tp.defaultname, 
  32.                       tp.namerule,tp.namerule2,tp.ispart,tp.moresite,tp.siteurl,tp.sitepath 
  33.                       $addField 
  34.                       FROM `js_archives` arc LEFT JOIN `js_arctype` tp ON arc.typeid=tp.id 
  35.                       $addJoin 
  36.                       WHERE arc.id in($idstr$ordersql "; 
  37.            } 
  38.            $t2 = ExecTime(); 
  39.            //echo $t2-$t1; 
  40.  
  41.        } 
 替换为:
  1. if($orderby=="default"
  2.        { 
  3.            $t1 = ExecTime(); 
  4.            $ids = array(); 
  5.            $query = "SELECT id FROM `js_arctiny` arc WHERE {$this->addSql} $ordersql LIMIT $limitstart,$row "
  6.            $this->dsql->SetQuery($query); 
  7.            $this->dsql->Execute(); 
  8.            while($arr=$this->dsql->GetArray()) 
  9.            { 
  10.                $ids[] = $arr['id']; 
  11.            } 
  12.            $idstr = join(',',$ids); 
  13.            if($idstr==''
  14.            { 
  15.                return ''
  16.            } 
  17.            else 
  18.            { 
  19.                $query = "SELECT arc.*,tp.typedir,tp.typename,tp.corank,tp.isdefault,tp.defaultname, 
  20.                       tp.namerule,tp.namerule2,tp.ispart,tp.moresite,tp.siteurl,tp.sitepath 
  21.                       $addField 
  22.                       FROM `js_archives` arc LEFT JOIN `js_arctype` tp ON arc.typeid=tp.id 
  23.                       $addJoin 
  24.                       WHERE arc.id in($idstr$ordersql "; 
  25.            } 
  26.            $t2 = ExecTime(); 
  27.            //echo $t2-$t1; 
  28.  
  29.        } 
  30.         else 
  31.        { 
  32.            $query = "SELECT arc.*,tp.typedir,tp.typename,tp.isdefault,tp.defaultname, 
  33.           tp.namerule,tp.namerule2,tp.ispart,tp.moresite,tp.siteurl,tp.sitepath 
  34.           $addField 
  35.           FROM `js_archives` arc 
  36.           LEFT JOIN `js_arctype` tp ON arc.typeid=tp.id 
  37.           $addJoin 
  38.           WHERE {$this->addSql} $ordersql LIMIT $limitstart,$row"; 
  39.        } 
找到:
  1. else { 
  2.             $ordersql=" ORDER BY arc.sortrank $orderWay"
  3.       } 
替换为:
  1. else if($orderby=="default"){ 
  2.             $ordersql=" ORDER BY arc.sortrank $orderWay"
  3.         } 
  4.         else
  5.            $ordersql=" ORDER BY ".$orderby.",arc.sortrank $orderWay"
  6.         } 
 此刻在模板中就可以应用了多字段排序了,模板应用如下:
{dede:list pagesize='17' orderby='arc.title desc,arc.id'} 
 

转载请注明:代码家园 » DEDECMS给list标签加上多字段排序功能

评论列表(网友评论仅供网友表达个人看法,并不表明本站同意其观点或证实其描述)