dede专题节点分页如何实现?

99ANYc3cd6
预计阅读时长 22 分钟
位置: 首页 DEDE建站 正文

核心概念

  1. 专题: 一个独立的、由多个文章聚合而成的页面,它有自己的模板(special_arclist.htm)。
  2. 专题节点: 在专题内部,你可以创建不同的“栏目”或“分类”,这些就是节点,每个节点可以关联不同的文章列表。
  3. 节点分页: 当一个节点下的文章数量很多,需要分页显示时,就涉及到节点分页的实现,DedeCMS 通过 {dede:arclist} 标签的 pagesizelistitem 属性来控制分页。

推荐方法(使用 GetArcList 标签,更灵活)

这是目前最推荐、最稳定的方法,它不依赖于系统自带的分页标签,而是直接调用底层函数,能更好地获取当前节点的 ID 和分页信息。

dede专题节点分页
(图片来源网络,侵删)

步骤 1:修改专题节点列表模板文件

  1. 找到你的专题模板文件,通常位于 /templets/default/special_arclist.htm,如果你使用了自定义模板,请找到对应的文件。

  2. 在需要显示文章列表的地方,删除或注释掉默认的 {dede:arclist} 标签,它看起来可能像这样:

    {dede:arclist titlelen='42' row='10'}
    <li><a href="[field:arcurl/]">[field:title/]</a></li>
    {/dede:arclist}
  3. 用下面的代码替换它:

    <!-- 专题节点文章列表开始 -->
    {dede:field name='node' runphp='yes'}
        // 获取当前节点的ID
        $nodeid = @me;
        if(empty($nodeid)) {
            // 如果没有指定节点ID,则获取专题ID,并作为节点ID使用
            $nodeid = $_GET['id'];
        }
        // 调用GetArcList函数,参数分别为: channelid, nodeid, row, orderby
        // channelid 通常为8,代表专题模型,但最好通过配置获取
        // row 每页显示条数
        // orderby 排序方式
        @me = GetArcList(8, $nodeid, 10, 'pubdate');
    {/dede:field}
    <!-- 循环输出文章 -->
    {dede:arclist row='10' titlelen='42'}
    <li><a href="[field:arcurl/]">[field:title/]</a></li>
    {/dede:arclist}
    <!-- 分页链接 -->
    <div class="page">
        {dede:pagelist listsize='5' listitem='index,pre,next,end,pageno'}
        {/dede:pagelist}
    </div>
    <!-- 专题节点文章列表结束 -->

代码解释:

  1. {dede:field name='node' runphp='yes'}...{/dede:field}:

    dede专题节点分页
    (图片来源网络,侵删)
    • name='node': 获取当前专题节点的 ID。
    • runphp='yes': 允许在标签内执行 PHP 代码。
    • GetArcList(8, $nodeid, 10, 'pubdate'): 这是核心函数。
      • 8: 专题模型的 ID,如果你的专题模型不是 8,请登录后台 -> 核心 -> 频道管理 -> 找到你的专题模型,查看其 ID 并替换。
      • $nodeid: 当前节点的 ID。
      • 10: 每页显示 10 篇文章。
      • 'pubdate': 按发布时间降序排列,你也可以使用 'click' (点击量) 或其他排序字段。
  2. {dede:arclist row='10' titlelen='42'}:

    • 这个标签现在被 GetArcList 函数“喂饱”了数据,它会直接输出当前节点、当前页的文章列表。row 属性在这里会被 GetArcList 的参数覆盖,所以可以写也可以不写。
  3. {dede:pagelist ...}:

    • 这个标签负责生成分页链接,它会自动读取 GetArcList 生成的分页信息,并正确显示上一页、下一页、页码等。

步骤 2:确保专题链接正确

在专题首页或栏目页,访问节点时,URL 必须包含 nodeid 参数。 /special/index.php?id=123&node=456

  • id=123: 专题 ID
  • node=456: 节点 ID

如果你的专题链接没有 node 参数,分页将无法工作,因为系统不知道你要对哪个节点进行分页。

dede专题节点分页
(图片来源网络,侵删)

兼容旧版/简化方法(直接使用 arclist

如果你的系统比较简单,或者不想修改 PHP 代码,可以尝试这个方法,它依赖于 {dede:arclist} 标签自身的分页能力。

步骤 1:修改专题节点列表模板

同样,找到并编辑 special_arclist.htm 文件,使用以下代码:

<!-- 专题节点文章列表开始 -->
{dede:arclist nodeid='[field:nodeid/]' row='10' titlelen='42' pagesize='10' orderby='pubdate'}
<li><a href="[field:arcurl/]">[field:title/]</a></li>
{/dede:arclist}
<!-- 分页链接 -->
<div class="page">
    {dede:pagelist listsize='5' listitem='index,pre,next,end,pageno'}
    {/dede:pagelist}
</div>
<!-- 专题节点文章列表结束 -->

代码解释:

  1. {dede:arclist ...}:

    • nodeid='[field:nodeid/]': 关键! 这个属性告诉 arclist 标签只获取当前节点的文章。[field:nodeid/] 会自动解析为当前节点的 ID。
    • row='10': 每页显示 10 条记录。
    • pagesize='10': 关键! 设置分页每页的大小,这个参数和 row 配合使用,确保分页逻辑正确。
    • orderby='pubdate': 排序方式。
  2. {dede:pagelist ...}:

    与方法一中的用法相同,用于生成分页导航。

注意事项:

  • 此方法在某些 DedeCMS 版本中可能存在兼容性问题,特别是当专题结构比较复杂时。
  • 确保 nodeid 参数在 URL 中存在(?node=xxx)。

手动实现分页(终极方案,100%可控)

如果以上方法都无效,或者你需要完全自定义分页的样式和逻辑,可以手动实现。

步骤 1:修改专题节点列表模板

<!-- 专题节点文章列表开始 -->
{dede:sql sql="SELECT arc.id, arc.title, arc.pubdate FROM dede_archives arc LEFT JOIN dede_special_archives sa ON arc.id = aid WHERE sa.specialid = ~id~ AND sa.nodeid = ~nodeid~ ORDER BY arc.pubdate DESC LIMIT ~start~, ~pagesize~"}
    <li><a href="[field:arcurl function='MakeArcUrl(@me)'/]">[field:title/]</a></li>
{/dede:sql}
<!-- 手动生成分页链接 -->
<div class="page">
    <!-- 上一页 -->
    <a href='special.php?id=[field:id/]&node=[field:nodeid/]&page=[field:prepage/]'>上一页</a>
    <!-- 页码循环 -->
    {dede:pagelist listsize='5' listitem='pageno'}
    {/dede:pagelist}
    <!-- 下一页 -->
    <a href='special.php?id=[field:id/]&node=[field:nodeid/]&page=[field:nextpage/]'>下一页</a>
</div>
<!-- 专题节点文章列表结束 -->

步骤 2:在 special_arclist.php 中处理分页逻辑

这个方法最复杂,需要修改 PHP 文件。

  1. 打开 /special/special_arclist.php 文件。

  2. 找到处理列表数据的部分,通常是一个 while 循环。

  3. 在循环之前,添加分页参数的计算逻辑:

    // ... 在 special_arclist.php 中 ...
    // 获取当前页码
    $page = isset($_GET['page']) && is_numeric($_GET['page']) ? intval($_GET['page']) : 1;
    // 每页显示条数
    $pagesize = 10;
    // 计算总记录数
    $count_query = "SELECT COUNT(*) as c FROM dede_archives arc LEFT JOIN dede_special_archives sa ON arc.id = aid WHERE sa.specialid = $id AND sa.nodeid = $nodeid";
    $count_arr = $dsql->GetOne($count_query);
    $totalcount = $count_arr['c'];
    // 计算总页数
    $totalpage = ceil($totalcount / $pagesize);
    // 计算偏移量
    $start = ($page - 1) * $pagesize;
    // 修改原来的 SQL 查询,添加 LIMIT 子句
    // 假设原来的查询是 $query
    $query = "SELECT arc.id, arc.title, arc.pubdate FROM dede_archives arc LEFT JOIN dede_special_archives sa ON arc.id = aid WHERE sa.specialid = $id AND sa.nodeid = $nodeid ORDER BY arc.pubdate DESC LIMIT $start, $pagesize";
    // ... 然后执行这个查询并循环输出 ...
  4. 将计算出的 $page, $pagesize, $totalpage, $start 等变量传递给模板。


总结与建议

方法 优点 缺点 推荐度
方法一 (GetArcList) 最规范、最稳定,官方推荐方式,代码清晰,不易出错。 需要少量 PHP 代码。 ⭐⭐⭐⭐⭐ (强烈推荐)
方法二 (arclist) 简单,纯模板实现,无需 PHP 代码。 可能在某些版本有兼容性问题,依赖性强。 ⭐⭐⭐
方法三 (手动分页) 100% 自定义,分页逻辑和样式完全可控。 最复杂,需要修改 PHP 文件,容易出错。 ⭐⭐ (仅当有特殊需求时使用)

对于绝大多数用户,我强烈建议你使用方法一,它解决了 DedeCMS 专题分页的核心问题,并且是社区公认的、最可靠的解决方案。

如果你在使用方法一时遇到问题,请检查:

  1. 你的专题模型 ID 是否正确。
  2. 你的专题链接是否包含了 node 参数。
  3. 你的模板文件路径是否正确。
-- 展开阅读全文 --
头像
dede点击图片分页如何实现?
« 上一篇 昨天
dede博客文章源码是什么?
下一篇 » 昨天

相关文章

取消
微信二维码
支付宝二维码

目录[+]