dede如何调用当前顶级栏目链接?

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

场景分析

我们需要明确“当前”指的是什么:

dede 调用当前顶级栏目链接
(图片来源网络,侵删)
  • 页 (article_article.htm) 这是最常见的需求,你正在浏览一篇文章,想知道这篇文章所属的大类(顶级栏目)的链接。
  • 在列表页或栏目页 (article_list.htm, index.htm 等) 你在一个列表页(公司新闻”列表页),想知道这个列表页本身所属的顶级栏目(关于我们”)的链接。

下面我将针对这两种场景,提供具体的代码。


使用 {dede:field} 标签(推荐,最简洁)

这种方法利用了 DedeCMS 的内置变量,代码最简洁,性能也最好。

适用于:文章内容页 (article_article.htm)

页模板中,可以直接使用 {dede:field.typeid} 获取当前栏目的ID,然后通过 GetTopTypelink 函数获取顶级栏目链接。

代码示例:

dede 调用当前顶级栏目链接
(图片来源网络,侵删)
<a href="{dede:field name='typeid' function='GetTopTypelink(@me)'/}" title="{dede:field.seotitle/}">
    {dede:field name='typeid' function='GetTopTypelink(@me)'/}
</a>

代码解析:

  1. {dede:field.name='typeid'}: 获取当前文章所在栏目的 ID (如果文章在“公司新闻”栏目下,这个值可能是 5)。
  2. function='GetTopTypelink(@me)': 这是关键。
    • @me:代表 {dede:field.name='typeid'} 的值,也就是栏目ID 5。
    • GetTopTypelink():这是一个 DedeCMS 的自定义PHP函数,它会接收一个栏目ID作为参数,然后返回这个栏目所属的 顶级栏目 的完整链接(<a href="...">栏目名</a> 格式)。"{dede:field.seotitle/}"`: 为链接添加 SEO 标题,这是一个好习惯。

使用 {dede:global}

这种方法适用于列表页、首页等,可以获取当前栏目的顶级栏目信息。

适用于:列表页/栏目页 (article_list.htm)

在列表页模板中,当前栏目的ID可以通过 {dede:global.itemid/} 获取。

代码示例:

dede 调用当前顶级栏目链接
(图片来源网络,侵删)
<a href="{dede:global name='typeid' function='GetTopTypelink(@me)'/}" title="{dede:global.name='topid' function='GetTopInfos(@me, 'type', 'seotitle')'}">
    {dede:global.name='typeid' function='GetTopTypelink(@me)'/}
</a>

代码解析:

  1. {dede:global.name='typeid'}: 获取当前列表页所在栏目的ID。
  2. function='GetTopTypelink(@me)': 同上,获取顶级栏目的链接。"..." 这里我们用了另一个函数GetTopInfos` 来动态获取顶级栏目的SEO标题,使代码更健壮。

使用 {dede:channel} 标签(适用于栏目列表)

如果你想在页面上显示一个包含所有顶级栏目的导航,并且希望当前顶级栏目高亮,可以使用 {dede:channel} 标签配合 currentstyle 属性。

这种方法虽然不是直接“调用当前顶级栏目链接”,但在实际应用中非常常见,能实现类似的效果。

代码示例:

{dede:channel type='top' currentstyle="<li class='thisclass'><a href='~typelink~'>~typename~</a></li>"}
    <li><a href="[field:typelink/]">[field:typename/]</a></li>
{/dede:channel}

代码解析:

  1. {dede:channel type='top' ...}: type='top' 表示只调用顶级栏目。
  2. currentstyle="...": 这是一个强大的属性,如果当前页面所在的栏目是这个顶级栏目下的子栏目,那么这个顶级栏目的链接就会被 currentstyle 中的代码替换掉。
    • ~typelink~: 会被替换为顶级栏目的链接。
    • ~typename~: 会被替换为顶级栏目的名称。
  3. 默认情况下,如果不是当前顶级栏目,则显示 <li><a href="[field:typelink/]">[field:typename/]</a></li>

自定义函数(最灵活)

如果以上方法不能满足你的复杂需求(比如你想获取顶级栏目的ID、名称、链接等多个信息),你可以自定义一个函数。

步骤 1:修改 include/helpers/extend.helper.php 文件

打开这个文件,在文件末尾 ?> 之前,添加如下自定义函数:

/**
 * 获取当前顶级栏目的详细信息
 * @param int $typeid 当前栏目ID
 * @return array 返回包含顶级栏目信息的数组,包括 id, typename, typelink 等
 */
if ( ! function_exists('GetTopTypeInfos'))
{
    function GetTopTypeInfos($typeid)
    {
        global $dsql;
        $topInfos = array();
        // 获取当前栏目的顶级栏目ID
        $query = "SELECT topid FROM `#@__arctype` WHERE id = $typeid";
        $row = $dsql->GetOne($query);
        $topid = $row['topid'];
        // 如果当前栏目就是顶级栏目,则topid为0
        if ($topid == 0) {
            $topid = $typeid;
        }
        // 获取顶级栏目的详细信息
        $query2 = "SELECT id, typename, typedir, isdefault, ispart, 
                         description, keywords, content, 
                         (`modname`='default' || ISNULL(`modname`)) AS isdefault, 
                         userip, uptime, mid, crossid, `rank`, 
                         (ispart<>2 && ishidden<>1) AS ishidden 
                  FROM `#@__arctype` WHERE id = $topid";
        $row2 = $dsql->GetOne($query2);
        if (is_array($row2)) {
            $row2['typelink'] = GetOneTypeUrlA($row2); // 获取完整链接
            return $row2;
        }
        return $topInfos;
    }
}

步骤 2:在模板中调用

现在你可以在任何模板文件中调用这个函数,获取你想要的信息。 页 (article_article.htm) 示例:**

<!-- 获取顶级栏目链接 -->
顶级栏目链接: <a href="{dede:fieldtypeid function='GetTopTypeInfos(@me)["typelink"]'/}">点击进入</a>
<!-- 获取顶级栏目名称 -->
顶级栏目名称: {dede:fieldtypeid function='GetTopTypeInfos(@me)["typename"]'/}
<!-- 获取顶级栏目ID -->
顶级栏目ID: {dede:fieldtypeid function='GetTopTypeInfos(@me)["id"]'/}

代码解析:

  • {dede:fieldtypeid}: 获取当前栏目ID。
  • function='GetTopTypeInfos(@me)': 调用我们刚刚创建的函数,传入栏目ID,函数会返回一个包含所有顶级栏目信息的数组。
  • ["typelink"], ["typename"], ["id"]: 从返回的数组中提取你需要的具体字段值。

总结与推荐

方法 适用场景 优点 缺点
{dede:field} + GetTopTypelink (最推荐) 代码最简洁,性能高,专门为此场景设计。 功能单一,只能获取链接。
{dede:global} + GetTopTypelink 列表页/首页 代码简洁,适用于非文章页。 需要理解全局变量的概念。
{dede:channel} 需要显示顶级栏目导航时 功能强大,可轻松实现高亮等样式效果。 不是直接调用“当前”顶级栏目,而是循环所有。
自定义函数 需要获取顶级栏目多个信息时 最灵活,可获取ID、名称、链接、描述等任何信息。 需要修改核心文件,对新手有一定门槛。

对于绝大多数情况,方法一 ({dede:field name='typeid' function='GetTopTypelink(@me)'}) 是在文章内容页调用当前顶级栏目链接的最佳选择。

-- 展开阅读全文 --
头像
织梦search.htm如何自定义搜索结果页?
« 上一篇 01-03
C语言中OpenFileName如何使用?
下一篇 » 01-03
取消
微信二维码
支付宝二维码