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

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

使用内置的 {dede:field} 标签(最推荐、最简单)

这是 DedeCMS 官方提供的、最标准也是最简单的方法,它利用了系统在解析模板时已经准备好的变量。

dede上级栏目名称
(图片来源网络,侵删)

在列表页(list_article.htm)中使用

在列表页模板中,直接使用以下标签即可获取当前栏目的上级栏目名称:

上级栏目名称:{dede:field.typename function='GetTopTypename(@me)'/}

代码解释:

  • {dede:field.typename}:这个标签本身是用来获取当前栏目的名称的。
  • function='GetTopTypename(@me)':这是一个功能强大的修饰符(函数)。
    • @me:代表 {dede:field.typename} 标签本身的值,也就是当前栏目的名称。
    • GetTopTypename():这是一个 DedeCMS 的自定义函数,它的作用是接收一个栏目ID作为参数,然后返回该栏目顶级栏目的名称。
    • 工作原理:虽然 @me 传进去的是名称,但在这个上下文中,DedeCMS 的解析系统会巧妙地利用这个函数去获取当前栏目的顶级栏目信息,你只需要知道这个组合能实现“获取顶级栏目名称”即可。

页(article_article.htm)中使用

页(文章页)中,获取上级栏目名称的方法与列表页完全相同。

上级栏目名称:{dede:field.typename function='GetTopTypename(@me)'/}

页也能用?**页模板在解析时,系统已经加载了该文章所属栏目的所有信息,field.typename 和相关的函数调用同样是有效的。

dede上级栏目名称
(图片来源网络,侵删)

使用 {dede:channel} 标签(适用于特定场景)

如果你不仅想获取上级栏目的名称,还想获取它的链接等其他信息,可以使用 {dede:channel}

这个标签主要用于循环输出栏目列表,但通过设置 typeid 属性,可以指定只输出一个特定的栏目信息。

获取上级栏目的ID

我们需要知道上级栏目的ID,DedeCMS 提供了一个变量来存储当前栏目的ID:{dede:field.id/}

上级栏目的ID可以通过一个简单的函数计算出来(假设栏目层级不超过2层,或者你知道上级栏目的ID是固定的)。

一个更通用的方法是,在PHP代码中获取,但为了保持模板的简洁,我们通常不直接在模板里写PHP。

dede上级栏目名称
(图片来源网络,侵删)

更简单的方法是直接使用顶级栏目ID,因为很多网站的栏目结构不会太深。

上级栏目名称:
{dede:channel typeid='1'}
    <a href="[field:typelink/]">[field:typename/]</a>
{/dede:channel}
  • typeid='1':这里的 1 是你上级栏目的ID,你需要手动去后台查看并填入。

动态获取上级栏目ID(需要一点PHP知识)

如果你想在模板里动态获取上级栏目ID,可以这样做:

上级栏目名称:
{dede:php}
    // 获取当前栏目的ID
    $currentTypeId = $GLOBALS['typeid'];
    // 获取当前栏目的信息
    $currentType = $dsql->GetOne("SELECT * FROM `dede_arctype` WHERE id = $currentTypeId");
    // 获取上级栏目的ID
    $topTypeId = $currentType['topid'];
    // 获取上级栏目的信息
    $topType = $dsql->GetOne("SELECT * FROM `dede_arctype` WHERE id = $topTypeId");
    // 输出上级栏目名称
    echo $topType['typename'];
{/dede:php}

这种方法非常灵活,但会破坏模板的简洁性,并且如果网站流量很大,频繁查询数据库可能会影响性能。不推荐在普通模板中大量使用


使用自定义函数(最灵活,但需要修改文件)

如果你的网站结构非常复杂,或者有特殊的需求,可以创建一个自定义函数。

步骤:

  1. 创建自定义函数文件/include/extend.func.php 文件中(如果这个文件不存在,就自己创建一个)添加以下函数:

    /**
     * 获取指定栏目的顶级栏目名称
     * @param int $typeid 当前栏目ID
     * @return string 顶级栏目名称
     */
    function getTopTypeName($typeid) {
        global $dsql;
        if (empty($typeid)) {
            return '';
        }
        // 查询当前栏目信息
        $row = $dsql->GetOne("SELECT topid FROM `dede_arctype` WHERE id = $typeid");
        // topid 为 0,说明它本身就是顶级栏目
        if ($row['topid'] == 0) {
            $currentName = $dsql->GetOne("SELECT typename FROM `dede_arctype` WHERE id = $typeid");
            return $currentName['typename'];
        } else {
            // 否则,查询其顶级栏目名称
            $topRow = $dsql->GetOne("SELECT typename FROM `dede_arctype` WHERE id = {$row['topid']}");
            return $topRow['typename'];
        }
    }
  2. 在模板中调用 现在你可以在任何模板中调用这个新函数了。

    上级栏目名称:{dede:field.id function='getTopTypeName(@me)'/}
    • @me 在这里会被解析为 {dede:field.id/} 的值,也就是当前栏目的ID,然后传递给你的 getTopTypeName 函数。

总结与推荐

方法 优点 缺点 适用场景
{dede:field} + function 最简单、最官方、性能最好 功能相对固定,只能获取名称 绝大多数情况下的首选,尤其是在列表页和内容页中。
{dede:channel} 可同时获取名称、链接等信息 需要手动知道上级栏目的ID 当上级栏目是固定的,并且你还需要它的链接时。
自定义函数 最灵活,可以处理复杂逻辑 需要修改PHP文件,有一定门槛,可能影响性能 当网站栏目结构非常特殊,官方函数无法满足需求时。

给你的最终建议:

直接使用 方法一,即 {dede:field.typename function='GetTopTypename(@me)'/},这是 DedeCMS 设计之初就考虑好的标准用法,简单、高效且可靠。

-- 展开阅读全文 --
头像
C语言format函数如何正确使用?
« 上一篇 今天
dede首页推荐标签怎么用?
下一篇 » 今天

相关文章

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