【按權重排序】
dede:list 的方法
1、找到"根目錄\include\arc.listview.class.php"文件。
2、修改代碼:在文件第727行處添加按weight排序判斷代碼(紅色部分為新添加代碼)。
//排序方式
$ordersql = '';
if($orderby=="senddate" || $orderby=="id") {
$ordersql=" ORDER BY arc.id $orderWay";
}
else if($orderby=="hot" || $orderby=="click") {
$ordersql = " ORDER BY arc.click $orderWay";
}
else if($orderby=="lastpost") {
$ordersql = " ORDER BY arc.lastpost $orderWay";
}
else if($orderby=="weight") {
$ordersql = " ORDER BY arc.weight $orderWay";
}
else {
$ordersql=" ORDER BY arc.sortrank $orderWay";
}
3、再在第778行處找到此段代碼
//如果不用默認的sortrank或id排序,使用聯合查詢(數據量大時非常緩慢)
if(preg_match('/hot|click|lastpost|weight/', $orderby))
並添加紅色部分內容。
4、標簽調用:
{dede:list orderby='weight' orderway='asc'}
這樣{dede:list}標簽就支持了按權重排序的調用,並且動靜態狀態下測試均成功!
下面是dede:arclist的修改方法
1、在織夢系統中找到以下目錄\include\taglib中的arclist.lib.php文件並打開
大約在74 、75行找到:
// arclist是否需要weight排序,默認為"N",如果需要排序則設置為"Y"
$isweight = $ctag->GetAtt('isweight');
把這行修改為:
$weight = $ctag->GetAtt('weight');
大約在327行找到,並修改
//文檔排序的方式
$ordersql = '';
if($orderby=='hot' || $orderby=='click') $ordersql = " ORDER BY arc.click $orderWay";
else if($orderby == 'sortrank' || $orderby=='pubdate') $ordersql = " ORDER BY arc.sortrank $orderWay";
else if($orderby == 'id') $ordersql = " ORDER BY arc.id $orderWay";
else if($orderby == 'near') $ordersql = " ORDER BY ABS(arc.id - ".$arcid.")";
else if($orderby == 'lastpost') $ordersql = " ORDER BY arc.lastpost $orderWay";
else if($orderby == 'scores') $ordersql = " ORDER BY arc.scores $orderWay";
else if($orderby == 'rand') $ordersql = " ORDER BY rand()";
else if($orderby == 'weight') $ordersql = " order by arc.weight asc";//插入這句 從小到大
else $ordersql = " ORDER BY arc.sortrank $orderWay";
然后用orderby='weight'
【自定義排序】
標簽dede:arclist的排序是通過orderby來指定的,如下:
{dede:arclist orderby=’排序字段’ }
{/dede:arclist}
orderby=’sortrank’ 文檔排序方式
§ orderby=’hot’ 或 orderby=’click’ 表示按點擊數排列
§ orderby=’sortrank’ 或 orderby=’pubdate’ 按出版時間排列
§ orderby=’near’
§ orderby==’lastpost’ 按最后評論時間
§ orderby==’scores’ 按得分排序
§ orderby=’id’ 按文章ID排序
§ orderby=’rand’ 隨機獲得指定條件的文檔列表
而能給orderby賦值的只能是上面列出的值,也就是說dede:arclist 標簽只能按照上面列出的字段排序。
那怎樣才能按照自定義的字段排序呢?假如我現在在dede_archives表里面添加了一個字段orderid,
我想按照這個字段排序。直接這樣寫:{dede:arclist orderby=’orderid’ }是不行的。那應該怎樣修改?
一、數據庫操作:
用MYSQL的管理工具或者其他,修改dede_archives表結構,添加一列orderid字段
DeDeCMS文檔默認按最后時間排序的,如果某一文章需要置頂,那么只要重新編輯提交該文章就頂上去了,可是導致的問題也是很多,如果你希望你最近更新的文章在第十條插入的話,那么你需要把這十一條內容重新提交一次,按照順序!
所以,這么復雜,這么不科學的方法顯然不適合我們。
二次開發版
新建一個表,讓這個表控制每個文章的數值,我們依靠這個數值來排列,類似添加文章里TAG旁的那個權重一樣,我們也給他添加一個權重,只不過這個權重是用來控制文章的排序順序。
OK,想法有了,那么就開始實現吧,百度了一圈,發現之前也有站長和我相同想法的,不過他們提供的方法是對照舊版DEDE而言,新版不適合他們的代碼,不過依葫蘆畫瓢咱還是可以的。

廢話不多說,教程開始
步驟比較多,但是都很簡單,無腦操作的,有需要的朋友請認真一步步看下去。
數據庫操作
1:首先得給數據庫添加一個表,讓它來記錄這個權重。所以我們進入PHPMYADMIN,找到dede_archives選擇結構一欄進入,然后添加表orderid

文件修改
1、打開 根目錄/dede/article_add.php //修改代碼文件
搜索找到
|
1
2
3
4
5
|
$query
= "INSERT INTO `dede_archives`(id,typeid,typeid2,sortrank,flag,ismake,channel,arcrank,click,money,title,shorttitle,
color,writer,source,litpic,pubdate,senddate,mid,voteid,notpost,description,keywords,filename,dutyadmin,weight)
VALUES (
'$arcID'
,
'$typeid'
,
'$typeid2'
,
'$sortrank'
,
'$flag'
,
'$ismake'
,
'$channelid'
,
'$arcrank'
,
'$click'
,
'$money'
,
'$title'
,
'$shorttitle'
,
'$color'
,
'$writer'
,
'$source'
,
'$litpic'
,
'$pubdate'
,
'$senddate'
,
'$adminid'
,
'$voteid'
,
'$notpost'
,
'$description'
,
'$keywords'
,
'$filename'
,
'$adminid'
,
'$weight'
);";
|
修改為
|
1
2
3
4
5
|
$query
= "INSERT INTO `dede_archives`(id,typeid,typeid2,sortrank,flag,ismake,channel,arcrank,click,money,title,shorttitle,
color,writer,source,litpic,pubdate,senddate,mid,voteid,notpost,description,keywords,filename,dutyadmin,weight,orderid)
VALUES (
'$arcID'
,
'$typeid'
,
'$typeid2'
,
'$sortrank'
,
'$flag'
,
'$ismake'
,
'$channelid'
,
'$arcrank'
,
'$click'
,
'$money'
,
'$title'
,
'$shorttitle'
,
'$color'
,
'$writer'
,
'$source'
,
'$litpic'
,
'$pubdate'
,
'$senddate'
,
'$adminid'
,
'$voteid'
,
'$notpost'
,
'$description'
,
'$keywords'
,
'$filename'
,
'$adminid'
,
'$weight'
,
'$orderid'
);";
|
2、打開dede/article_edit.php //修改代碼文件
搜索weight='$weight'在它之后加逗號並回車換行加入以下代碼orderid='$orderid'
3、打開dede/templets/article_add.htm //修改模板文件
在適合位置添加以下代碼,我是在內容摘要之后添加的。
|
1
2
3
4
5
6
7
8
|
<table width=
"100%"
border=
"0"
cellspacing=
"0"
cellpadding=
"0"
style=
"margin-bottom:3px;"
>
<tbody>
<tr>
<td width=
"90"
class
=
"bline"
height=
"24"
> 排序權重:</td>
<td
class
=
"bline"
><input type=
'text'
name=
'orderid'
value=
'0'
style=
'width:100px;'
/>(請填寫數字,越大越靠前)</td>
</tr>
</tbody>
</table>
|
4、打開dede/include/arc.listview.class.php //修改模版文件
搜索
|
1
|
if
(preg_match(
'/hot|click|lastpost/'
,
$orderby
))
|
修改為
|
1
|
if
(preg_match(
'/hot|click|orderid|lastpost/'
,
$orderby
))
|
5、打開dede/templets/article_edit.html //修改模板文件
在適合位置添加以下代碼,我是在文章副欄目之后添加的
|
1
2
3
4
5
6
7
8
|
<table width=
"100%"
border=
"0"
cellspacing=
"0"
cellpadding=
"0"
style=
"margin-bottom:3px;"
>
<tbody>
<tr>
<td width=
"90"
class
=
"bline"
height=
"24"
> 排序權重:</td>
<td
class
=
"bline"
><input type=
'text'
name=
'orderid'
value=
'<?php echo $arcRow["orderid"]?>'
style=
'width:100px;'
/>(請填寫數字,越大越靠前)</td>
<td></td>
</tr>
</tbody></table>
|
6、打開include/arc.listview.class.php //修改代碼文件
搜索
|
1
2
3
|
else
if
(
$orderby
==
"hot"
||
$orderby
==
"click"
) {
$ordersql
=
" ORDER BY arc.click $orderWay"
;
}
|
在其后添加
|
1
2
3
|
else
if
(
$orderby
==
"orderid"
) {
$ordersql
=
" order by arc.orderid $orderWay"
;
//orderid為dede_archives表里面自己添加的字段
}
|
7、打開include/taglib/arclist.lib.php //修改代碼文件
搜索
|
1
|
else
if
(
$orderby
==
'id'
)
$ordersql
=
" ORDER BY arc.id $orderWay"
;
|
在它之后回車增加一行,加入以下代碼
|
1
|
else
if
(
$orderby
== ’orderid’)
$ordersql
= ” order by arc.orderid
$orderWay
,arc.id
$orderWay
”;
|
8、最后在HTML模板調用如下:
|
1
2
3
4
5
|
{dede:arclist typeid=’1′ row=’10′ titlelen=’60′ orderby=′orderid′}
《你的模版文件代碼》
{/dede:arclist}
|
至此,我們就完成我們需要的功能了。在后台排序權重文字,填寫任意數字(數值越大,排序越靠前)
【重點】
其實自定義排序是一種很靈活的形式
也根本不需要再添加什么字段
因為dede5.7版本后數據表中是有weight這個字段的,如果我們想要自定義根據這個字段排就可以了
上面那種方法是改的地方比較多,但是很死板,將操作集中到了編輯區,只是為編輯區增加了一個插件的功能而已
靈活的來講,上述方法不適用於采集的文章
就比如我的站點,是有采集的
對於采集的許多數據,排序不准,該怎么辦?
這里我的方法就是在sql軟件中,更新某種特定格式的數據的權重
例如2017開頭的權重我都設置為了70,2016開頭的為60,2015的為50
所以只用到了第一種方法,讓織夢支持權重即可
然后是arclist不能在視圖中指定orderway='asc|desc'
所以這里只能在arclist標簽的源文件中,設置符合自己需求的順序或逆序方式即可

