dede如何获取当前栏目的顶级栏目?

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

使用顶级栏目ID标签 {dede:field.typeid/} (最推荐)

这是最简单、最直接,也是官方推荐的方法,DedeCMS 的一个巧妙设计是,顶级栏目和其所有子栏目都共享同一个顶级栏目ID,直接调用当前栏目的 typeid 标签,获取的就是顶级栏目的ID。

获取当前栏目顶级栏目 dede
(图片来源网络,侵删)

适用场景:在任何需要获取顶级栏目ID的地方,尤其是在列表页和内容页。

示例代码:

假设你想在列表页 (list_article.htm) 的某个位置显示顶级栏目的ID,可以这样写:

<p>当前顶级栏目的ID是:{dede:field.typeid/}</p>

如果你想获取顶级栏目的名称,可以这样写:

获取当前栏目顶级栏目 dede
(图片来源网络,侵删)
<p>当前顶级栏目的名称是:{dede:typename function='GetTopTypename(@me)'/}</p>

说明:这里用到了一个自定义函数 GetTopTypename,你需要确保你的系统支持这个函数,这个函数的作用是传入一个ID,返回该ID对应的顶级栏目名称,大部分模板都内置了这个函数。


使用SQL查询获取顶级栏目信息 (最灵活)

如果你需要获取顶级栏目的更多信息,比如栏目名称、栏目链接、栏目描述等,使用SQL查询是最灵活的方法。

适用场景:当你不仅需要ID,还需要其他栏目属性时。

示例代码:

在列表页 (list_article.htm) 或内容页 (article_article.htm) 中,你可以通过SQL标签来查询。

在列表页 (list_article.htm) 中:

当前栏目的ID可以通过 {dede:fieldtypeid/} 获取。

{dede:sql sql="SELECT * FROM `dede_arctype` WHERE id = ~typeid~"}
    <h2>顶级栏目名称:[typename]</h2>
    <p>顶级栏目链接:[field:typelink function='str_replace("~aid~", "", "@me")'/]</p>
    <p>顶级栏目描述:[description]</p>
{/dede:sql}

注意:在列表页的SQL中,typeid 需要加上 符号,如 ~typeid~,DedeCMS会自动将其替换为当前栏目的ID。

页 (article_article.htm) 中: 页没有直接的 typeid 变量,需要先获取当前文章的栏目ID,再通过这个ID查询顶级栏目。

{dede:sql sql="SELECT 
    t1.id AS top_id, 
    t1.typename AS top_name, 
    t1.typelink AS top_link 
    FROM 
    `dede_arctype` t1 
    JOIN 
    `dede_arctype` t2 ON t1.id = t2.topid 
    WHERE 
    t2.id = ~typename~"}
    <h2>顶级栏目ID:[field:top_id/]</h2>
    <h2>顶级栏目名称:[field:top_name/]</h2>
    <p>顶级栏目链接:[field:top_link/]</p>
{/dede:sql}

说明:这个SQL查询的逻辑是:

  1. dede_arctype 表中自连接查询 (t1 JOIN t2)。
  2. 连接条件是 t1.id = t2.topid,即找到 t2 的父栏目 t1
  3. WHERE t2.id = ~typename~ 筛选出当前文章所在栏目 (t2) 的记录。
  4. 这样查询出来的 t1 就是顶级栏目。~typename~ 在内容页中代表当前文章的栏目ID。

使用PHP代码获取 (适用于PHP文件)

如果你在PHP文件(如 index.php 或自定义的PHP页面)中操作,可以直接使用PHP代码来获取。

适用场景:在PHP程序逻辑中获取顶级栏目信息。

示例代码:

假设你已经获取了当前栏目的ID $currentTypeID

<?php
// 假设这是当前栏目的ID,可能是从URL参数或其他地方获取的
$currentTypeID = 15; // 示例ID
// 引入数据库配置文件
require_once (dirname(__FILE__) . "/include/common.inc.php");
// 方法1:循环向上查找顶级栏目
function getTopChannel($typeid, $dsql) {
    $query = "SELECT topid FROM `dede_arctype` WHERE id = '$typeid'";
    $row = $dsql->GetOne($query);
    // 如果topid为0,说明它本身就是顶级栏目
    if ($row['topid'] == 0) {
        return $typeid;
    } else {
        // 否则,递归调用自身,继续查找其父级
        return getTopChannel($row['topid'], $dsql);
    }
}
$topTypeID = getTopChannel($currentTypeID, $dsql);
// 现在你可以用 $topTypeID 去查询顶级栏目的完整信息
$topChannelQuery = "SELECT * FROM `dede_arctype` WHERE id = '$topTypeID'";
$topChannel = $dsql->GetOne($topChannelQuery);
if (is_array($topChannel)) {
    echo "顶级栏目ID: " . $topChannel['id'] . "<br>";
    echo "顶级栏目名称: " . $topChannel['typename'] . "<br>";
    echo "顶级栏目链接: " . GetOneTypeUrlA($topChannel) . "<br>";
}
?>

说明

  • topid 字段在 dede_arctype 表中记录了栏目的直接父级ID,顶级栏目的 topid 为 0。
  • GetOneTypeUrlA() 是DedeCMS内置的函数,用于根据栏目信息生成完整的栏目链接。

总结与推荐

方法 优点 缺点 推荐场景
{dede:field.typeid/} 最简单、最直接、性能最好 只能获取ID,需要结合函数获取名称 绝大多数情况,尤其是只需要ID时
SQL查询 非常灵活,可获取任意栏目属性 代码稍复杂,需要了解SQL和表结构 需要获取栏目名称、链接、描述等多信息时
PHP代码 功能最强大,可集成复杂逻辑 需要PHP编程能力,不适合在模板中直接使用 在PHP程序文件中进行后台逻辑处理时

对于日常的模板修改工作,强烈推荐使用方法一,因为它最简单且足够稳定,只有在需要获取栏目ID以外的其他信息时,才考虑使用方法二。

-- 展开阅读全文 --
头像
dede如何调用当前栏目的子栏目?
« 上一篇 01-09
纺砍柴网博客文章类织梦是什么?
下一篇 » 01-09

相关文章

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

目录[+]