dede如何调用父栏目名称与链接?

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

使用顶级栏目标签(最推荐、最简洁)

如果你的栏目结构是“顶级栏目 -> 二级栏目 -> 文章”,而你只想获取文章所属的“顶级栏目”信息,这是最简单、最稳定的方法。

dede调用父栏目名称和链接
(图片来源网络,侵删)

适用场景: 调用当前文章或内容所在栏目的顶级栏目名称和链接。

调用父栏目名称

使用 {dede:field name='typename'/}

<a href="{dede:field name='typeurl'/}">{dede:field name='typename'/}</a>

解释:

  • {dede:field name='typeurl'/}:会自动获取当前栏目所属的顶级栏目的链接地址。
  • {dede:field name='typename'/}:会自动获取当前栏目所属的顶级栏目的名称。

示例(在文章页 article_article.htm 中): 假设文章位于“新闻”下的“国内新闻”栏目,使用上面的代码,它会直接链接到“新闻”栏目并显示“新闻”。

您当前所在的位置:<a href="{dede:field name='typeurl'/}">{dede:field name='typename'/}</a>

输出结果: 您当前所在的位置:<a href="/news/">新闻</a>

dede调用父栏目名称和链接
(图片来源网络,侵删)

使用SQL查询标签(最灵活、功能最强大)

如果你需要获取“直接父级”栏目(不一定是顶级),或者需要更复杂的判断,那么使用 dede:sql 标签是最佳选择。

适用场景: 获取当前栏目的直接上级栏目的名称和链接。

调用父栏目名称和链接

这个方法需要在列表页或内容页中获取当前栏目的ID,然后通过SQL查询其父级栏目的信息。

在列表页 list_*.htm 或内容页 article_*.htm 中使用:

dede调用父栏目名称和链接
(图片来源网络,侵删)
{dede:sql sql="SELECT * FROM `dede_arctype` WHERE id = ~typeid~"}
    <a href="[field:typedir function='str_replace("{cmspath}", "", "@me")'/]">[field:typename/]</a>
{/dede:sql}

代码解释:

  1. {dede:sql sql="..."}:执行自定义SQL查询。
  2. SELECT * FROMdede_arctypeWHERE id = ~typeid~
    • dede_arctype 是DedeCMS中存储所有栏目的数据表(你的表前缀可能不是dede_,请根据实际情况修改)。
    • ~typeid~ 是DedeCMS的一个内置变量,代表当前栏目的ID,SQL标签会自动将其替换为实际的数字ID。
  3. [field:typedir function='str_replace("{cmspath}", "", "@me")'/]
    • [field:typedir/] 获取从数据库中读取到的栏目完整链接,这个链接通常包含 {cmspath} 这个占位符。
    • function='str_replace("{cmspath}", "", "@me")' 是一个函数处理,它会将 {cmspath} 从链接中移除,得到一个可以直接使用的URL,如果你的后台设置了“不使用目录默认页”,可能需要调整这个函数。
  4. [field:typename/]:直接输出查询到的栏目的名称。

更健壮的URL处理方式(推荐): 为了避免{cmspath}的问题,可以使用更强大的GetTopType函数。

{dede:sql sql="SELECT * FROM `dede_arctype` WHERE id = ~typeid~"}
    <a href="[field:id runphp='yes'] $id = @me; $arr = GetOneTypeUrlA($id); @me = $arr['typeurl']; [/field:id]">[field:typename/]</a>
{/dede:sql}

这段代码通过 GetOneTypeUrlA 函数来获取绝对正确的栏目链接,兼容性更好。


使用PHP代码(在特定文件中修改)

如果你想在模板文件之外的地方(比如一个自定义的PHP插件)获取父栏目信息,可以直接使用PHP代码。

适用场景: 开发者二次开发,在PHP文件中动态获取。

<?php
// 1. 引入DedeCMS的公共文件
require_once(dirname(__FILE__) . "/include/common.inc.php");
// 2. 假设你有一个栏目ID
$currentTypeId = 5; // 当前栏目ID是5
// 3. 获取当前栏目的信息
$currentType = $dsql->GetOne("SELECT * FROM `#@__arctype` WHERE id = $currentTypeId");
// 4. 从当前栏目信息中获取父级ID
$parentId = $currentType['reid']; // 'reid' 字段存储的是父级栏目的ID
// 5. 如果存在父级栏目 (reid不为0)
if ($parentId > 0) {
    // 6. 查询父级栏目的信息
    $parentType = $dsql->GetOne("SELECT * FROM `#@__arctype` WHERE id = $parentId");
    // 7. 输出父栏目的名称和链接
    $parentName = $parentType['typename'];
    $parentLink = $parentType['typedir'];
    // 处理链接中的{cmspath}
    $parentLink = str_replace('{cmspath}', $cfg_cmspath, $parentLink);
    echo "父栏目名称: " . $parentName . "<br>";
    echo "父栏目链接: " . $parentLink . "<br>";
} else {
    echo "该栏目没有父栏目。";
}
?>

解释:

  • require_once(...):引入DedeCMS的核心文件,以使用其数据库连接和全局变量。
  • $dsql->GetOne(...):执行一条SQL查询并返回第一条结果(关联数组)。
  • #@__:这是DedeCMS的数据表前缀占位符,会自动替换为你在后台配置的表前缀(如 dede_)。
  • $currentType['reid']reid 字段存储的就是当前栏目的直接父级栏目的ID。

总结与对比

方法 优点 缺点 适用场景
顶级栏目标签 代码极简,性能最好,官方推荐 只能获取顶级栏目,无法获取直接父级 调用顶级栏目,导航栏,面包屑的基础部分
SQL查询标签 非常灵活,可获取任意父级,功能强大 代码稍复杂,需要了解SQL和表结构 获取直接父级,或需要进行复杂条件判断时
PHP代码 完全可控,适合复杂逻辑 需要修改PHP文件,不适合模板使用者 二次开发,在PHP脚本中动态获取数据

对于大多数用户来说,强烈推荐使用【方法一】,因为它最简单、最稳定,只有当你明确需要获取“直接父级”而非“顶级”时,才考虑使用【方法二】。

-- 展开阅读全文 --
头像
C语言s=1 1 1 1 2
« 上一篇 01-19
数据结构算法与应用C语言描述有何核心要点?
下一篇 » 01-19
取消
微信二维码
支付宝二维码