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

(图片来源网络,侵删)
核心原理
DedeCMS 的栏目信息是通过一个全局变量 $type 来传递的,这个变量是一个 PHP 数组,包含了当前栏目的所有信息,包括其 ID、名称、上级栏目 ID 等。
要获取上级栏目,我们需要两步:
- 获取当前栏目的父栏目 ID:从
$type['topid']或$type['reid']中获取。 - 根据父栏目 ID 查询并获取其完整信息:使用 DedeCMS 的内置函数
GetOneType()或getOneType()。
直接获取上级栏目名称(最简单)
如果你只需要在模板中显示上级栏目的名称,这是最直接的方法。
适用场景:在文章列表页、文章内容页等所有能识别 {dede:type} 标签的页面。

(图片来源网络,侵删)
代码示例:
{dede:type}
<a href="[field:typelink/]">[field:typename/]</a> <!-- 当前栏目 -->
的上级栏目是:
{dede:field name='typeid' function="GetTopTypename(@me)"/}
{/dede:type}
代码解释:
{dede:type}...{/dede:type}:这个标签对用于获取并处理当前栏目的信息。[field:typename/]:这是当前栏目的名称。[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}
代码解释:
{php}...{/php}:在模板中直接嵌入 PHP 代码,实现更灵活的逻辑。$parent_id = $type['reid'];:从全局$type数组中获取当前栏目的直接父栏目ID,这是最常用、最准确的方法。$type['reid']:直接父级栏目的 ID。$type['topid']:最顶级栏目的 ID(可能隔了多层)。
if ($parent_id > 0):判断是否存在上级栏目。reid为 0,说明当前栏目就是顶级栏目,没有上级。$ptype = getOneType($parent_id);:这是 DedeCMS 的核心函数,根据栏目 ID 查询并返回一个包含该栏目所有信息的数组。$ptype['typename']:上级栏目的名称。$ptype['typedir']:上级栏目的目录链接(推荐使用,已包含站点路径)。$ptype['id']:上级栏目的 ID。$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 核心自带的。 - 在修改模板文件前,请先备份,以防出错。
