dede如何获取当前栏目的上级栏目名称?

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

下面我将为你提供几种最常用和最可靠的方法,从简单到复杂,并解释其原理。

dede 当前栏目的上级栏目
(图片来源网络,侵删)

核心原理

DedeCMS 的栏目信息是通过一个全局变量 $type 来传递的,这个变量是一个 PHP 数组,包含了当前栏目的所有信息,包括其 ID、名称、上级栏目 ID 等。

要获取上级栏目,我们需要两步:

  1. 获取当前栏目的父栏目 ID:从 $type['topid']$type['reid'] 中获取。
  2. 根据父栏目 ID 查询并获取其完整信息:使用 DedeCMS 的内置函数 GetOneType()getOneType()

直接获取上级栏目名称(最简单)

如果你只需要在模板中显示上级栏目的名称,这是最直接的方法。

适用场景:在文章列表页、文章内容页等所有能识别 {dede:type} 标签的页面。

dede 当前栏目的上级栏目
(图片来源网络,侵删)

代码示例:

{dede:type}
    <a href="[field:typelink/]">[field:typename/]</a> <!-- 当前栏目 -->
    的上级栏目是:
    {dede:field name='typeid' function="GetTopTypename(@me)"/}
{/dede:type}

代码解释:

  1. {dede:type}...{/dede:type}:这个标签对用于获取并处理当前栏目的信息。
  2. [field:typename/]:这是当前栏目的名称。
  3. [field:typeid function="GetTopTypename(@me)"/]:这是核心部分。
    • [field:typeid]:获取当前栏目的 ID。
    • function="GetTopTypename(@me)":调用一个自定义函数 GetTopTypename,并将当前栏目 ID (@me) 作为参数传递进去。

你需要做的准备工作:

在你的 /include/common.func.php 文件中,添加以下 GetTopTypename 函数,如果文件不存在,可以创建它,这个函数是 DedeCMS 经典用法的一部分。

/**
 * 获取指定栏目的顶级栏目名称
 * @param int $typeid 栏目ID
 * @return string 顶级栏目名称
 */
function GetTopTypename($typeid)
{
    global $dsql;
    $row = $dsql->GetOne("SELECT typename, reid FROM `#@__arctype` WHERE id = $typeid");
    if ($row['reid'] == 0) {
        // 如果reid为0,说明它本身就是顶级栏目
        return $row['typename'];
    } else {
        // 如果不是顶级栏目,则递归查询其父级栏目,直到找到顶级栏目
        return GetTopTypename($row['reid']);
    }
}

获取上级栏目的完整信息(最推荐、最灵活)

如果你需要获取上级栏目的名称、链接、ID、描述等多个信息,或者想对上级栏目进行更复杂的判断,那么方法一就不够用了,这时,我们应该获取上级栏目的完整信息数组。

适用场景:需要上级栏目链接、描述、缩略图等复杂信息的场景。

代码示例:

{dede:type}
    {php
        // 1. 获取当前栏目的父栏目ID
        $parent_id = $type['reid']; // reid 是直接的父栏目ID
        // $top_id = $type['topid']; // topid 是最顶级的栏目ID,根据你的需求选择
        // 2. 如果父栏目ID不为0(即不是顶级栏目),则查询其信息
        if ($parent_id > 0) {
            // 调用DedeCMS内置函数获取栏目信息
            $ptype = getOneType($parent_id); // 注意:新版常用 getOneType(),旧版可能是 GetOneType()
            // 3. 输出上级栏目的各种信息
            echo "<a href='" . $ptype['typedir'] . "'>" . $ptype['typename'] . "</a>";
        }
    }
{/dede:type}

代码解释:

  1. {php}...{/php}:在模板中直接嵌入 PHP 代码,实现更灵活的逻辑。
  2. $parent_id = $type['reid'];:从全局 $type 数组中获取当前栏目的直接父栏目ID,这是最常用、最准确的方法。
    • $type['reid']:直接父级栏目的 ID。
    • $type['topid']:最顶级栏目的 ID(可能隔了多层)。
  3. if ($parent_id > 0):判断是否存在上级栏目。reid 为 0,说明当前栏目就是顶级栏目,没有上级。
  4. $ptype = getOneType($parent_id);:这是 DedeCMS 的核心函数,根据栏目 ID 查询并返回一个包含该栏目所有信息的数组。
  5. $ptype['typename']:上级栏目的名称。
  6. $ptype['typedir']:上级栏目的目录链接(推荐使用,已包含站点路径)。
  7. $ptype['id']:上级栏目的 ID。
  8. $ptype['description']:上级栏目的描述。

页(article_article.htm)中获取

页,当前栏目的信息存储在全局变量 $typename 中,获取上级栏目的逻辑与方法二类似。

代码示例 (在 article_article.htm 中):

{dede:field name='typeid' function="GetOneType(@me)"}
    {php
        // $this->Fields['typeid'] 是当前文章的栏目ID
        // $this->TypeInfos 是当前栏目信息的数组
        $parent_id = $this->TypeInfos['reid']; // 获取父栏目ID
        if ($parent_id > 0) {
            $ptype = getOneType($parent_id);
            echo "文章所属的上级栏目是:<a href='" . $ptype['typedir'] . "'>" . $ptype['typename'] . "</a>";
        }
    }
{/dede:field}

或者更简洁的写法:

{php
    $parent_id = $this->TypeInfos['reid'];
    if ($parent_id > 0) {
        $ptype = getOneType($parent_id);
        // 输出上级栏目链接和名称
        echo "<a href='{$ptype['typedir']}'>{$ptype['typename']}</a>";
    }
}

总结与对比

方法 优点 缺点 适用场景
方法一 模板标签实现,简单直观 只能获取名称,不够灵活 仅需显示上级栏目名称的简单场景
方法二 功能强大,灵活,可获取所有信息 需要嵌入 PHP 代码,对新手稍复杂 需要上级栏目链接、ID、描述等多种信息的复杂场景
方法三 页,使用 $this->TypeInfos 在文章详情页获取上级栏目信息

最佳实践建议:

对于绝大多数情况,强烈推荐使用方法二,因为它提供了最大的灵活性,即使你现在只需要名称,未来可能需要添加链接或其他属性时,代码无需大的改动,只需在 $ptype 数组中取对应的字段即可。

重要提示:

  • 确保你的 /include/common.func.php 文件中有 getOneType() 函数,或者在调用前已经加载了包含该函数的文件,大多数情况下,这个函数是 DedeCMS 核心自带的。
  • 在修改模板文件前,请先备份,以防出错。
-- 展开阅读全文 --
头像
system命令在C语言中如何正确使用?
« 上一篇 昨天
dede标签 按填写顺序排序
下一篇 » 今天

相关文章

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

目录[+]