织梦cms栏目排序拖动

栏目排序概述

织梦CMS的栏目排序功能允许管理员自定义栏目在导航、列表和模板中的显示顺序。通过设置 sortrank 字段的值(数字越小越靠前),可以灵活控制各级别栏目的显示顺序。较早版本的织梦CMS不原生支持拖拽排序,需要通过插件或手动方式实现。

一、后台手动设置排序

在栏目管理中调整排序值:

  1. 进入 核心 > 栏目管理
  2. 每个栏目显示有"排序"字段(sortrank值)
  3. 点击栏目右侧的"更改"
  4. 在栏目属性中修改"排列顺序""sortrank"
  5. 数字越小越靠前显示(例如:1排第一,10排第十)
排序技巧:建议使用间隔数值(如10、20、30...),方便以后在中间插入新栏目而无需调整所有栏目的排序值。

二、通过 SQL 批量调整排序

-- 将所有顶级栏目按ID重新排序
SET @rownum=0;
UPDATE dede_arctype 
SET sortrank=(@rownum :=@rownum + 1) * 10 
WHERE reid=0 
ORDER BY id ASC;

-- 将指定栏目移到最前面
UPDATE dede_arctype SET sortrank=0 
WHERE id=目标栏目ID;

-- 将某个子栏目的排序与父栏目对齐
UPDATE dede_arctype 
SET sortrank=(SELECT sortrank FROM dede_arctype AS p WHERE p.id=dede_arctype.reid) + 10 
WHERE reid > 0;

三、添加拖拽排序插件

如果后台不支持拖拽排序,可以通过安装插件或修改后台文件来实现。以下是通过修改 dede/catalog_main.php 添加拖拽功能的思路:

<!-- 引入jQuery UI Sortable插件 -->
<script src="jquery.min.js"></script>
<script src="jquery-ui.min.js"></script>
<script>
$(function(){
    // 使栏目列表支持拖拽排序
    $("#catalog-list tbody").sortable({
        handle: ".drag-handle",
        update: function(event, ui){
            var order=$(this).sortable("toArray");
            // 通过AJAX将新顺序发送到服务器
            $.post("catalog_sort.php", {order: order}, function(res){
                if(res.success) alert("排序已保存");
            }, "json");
        }
    });
});
</script>

处理排序请求的PHP文件(catalog_sort.php):

<?php
require_once(dirname(__FILE__)."/config.php");

$order=$_POST['order']; // 栏目ID数组,按新顺序排列

foreach($order as $index=> $typeid){
    $rank=($index + 1) * 10; // 新的排序值
    $dsql->ExecuteNoneQuery(
        "UPDATE dede_arctype SET sortrank={$rank} WHERE id=" . intval($typeid)
    );
}

echo json_encode(['success'=> true]);
?>

四、模板中按 sortrank 排序显示

确保模板标签使用 sortrank 排序:

<!-- arclist 按sortrank排序 -->
{dede:arclist typeid='3' row='10' orderby='sortrank'}

<!-- channel 标签默认按sortrank排序,也可显式指定 -->
{dede:channel type='top' row='10' orderby='sortrank'}
<li><a href="[field:typelink/]">[field:typename/]</a></li>
{/dede:channel}

<!-- SQL标签明确按sortrank排序 -->
{dede:sql sql="SELECT * FROM dede_arctype 
WHERE reid=0 AND ishidden=0 
ORDER BY sortrank ASC, id ASC"}
<a href="[field:typedir/]">[field:typename/]</a>
{/dede:sql}

五、栏目排序的注意事项

六、排序示例

假设有以下栏目需要按指定顺序排列:

排序前(默认按创建顺序):
经典文学 (sortrank=50)
现代小说 (sortrank=10)
诗歌散文 (sortrank=30)

排序后(手动调整):
现代小说 (sortrank=10)
诗歌散文 (sortrank=30)
经典文学 (sortrank=50)

<!-- SQL实现一键重排序 -->
UPDATE dede_arctype SET sortrank=10 WHERE typename='现代小说';
UPDATE dede_arctype SET sortrank=30 WHERE typename='诗歌散文';
UPDATE dede_arctype SET sortrank=50 WHERE typename='经典文学';
实用建议:建议在网站规划阶段就确定栏目的排序方案,并为每个栏目预留sortrank数值间隔(建议10-20的间隔)。这样后续添加新栏目时,只需调整少量栏目的排序值即可。