页如何调用顶级栏目?

99ANYc3cd6
预计阅读时长 16 分钟
位置: 首页 织梦建站 正文

使用SQL直接查询(最推荐、最灵活)

这是最直接、最可靠的方法,因为它不受栏目缓存或嵌套层级复杂性的影响,我们可以在内容页模板文件(通常是 article_article.htm)中直接执行SQL查询。

织梦内容页调用顶级栏目
(图片来源网络,侵删)

操作步骤:

  1. 打开你的内容页模板文件,路径通常是:/templets/default/article_article.htm
  2. 在你需要调用顶级栏目信息的地方(在 {dede:field name='title'/} 标题下方),插入以下PHP代码块。

代码示例:

{dede:sql sql='SELECT * FROM `dede_arctype` WHERE id=(SELECT topid FROM `dede_arctype` WHERE id=~id~)'}
    <a href="[field:typelink/]">[field:typename/]</a>
{/dede:sql}

代码解析:

  • {dede:sql sql=''}: 这是织梦的SQL标签,用于执行自定义的SQL查询。
  • SELECT * FROM dede_arctype: 我们要从数据表 dede_arctype(栏目表)中查询所有字段。 表示所有字段,你也可以只查询你需要的字段,如 id, typename, typelink
  • WHERE id=(...): 这是查询条件,我们要找的顶级栏目的 id 等于括号内查询结果。
  • SELECT topid FROM dede_arctype WHERE id=~id~: 这是一个子查询。
    • ~id~: 这是织梦内容页模板中的一个特殊变量,它会被自动替换为当前文章所在栏目的 ID,这是实现动态关联的关键。
    • 这行子查询的意思是:“找到当前文章所在栏目的 id,然后去 dede_arctype 表里查询这个 id 对应栏目的 topid(顶级栏目ID)”
  • [field:typelink/]: 在 {dede:sql} 标签内部,可以使用 [field:字段名/] 来输出查询结果。
    • typename: 栏目名称。
    • typelink: 栏目链接(织梦会自动处理)。
    • id: 栏目ID。
    • description: 栏目描述。
    • 等等...

进阶用法:如果你想把顶级栏目信息存入变量以便多次使用

织梦内容页调用顶级栏目
(图片来源网络,侵删)
{dede:sql sql='SELECT typename, typelink, id FROM `dede_arctype` WHERE id=(SELECT topid FROM `dede_arctype` WHERE id=~id~)'}
    {dede:getsql sql='SELECT typename, typelink, id FROM `dede_arctype` WHERE id=(SELECT topid FROM `dede_arctype` WHERE id=~id~)' assign='topCate'}
{/dede:sql}
<!-- 现在你可以通过 $topCate 变量来调用顶级栏目的信息了 -->
<p>顶级栏目名称:{$topCate.typename}</p>
<a href="{$topCate.typelink}">返回顶级栏目</a>

注意:{dede:getsql} 标签可以将查询结果赋值给一个PHP变量,assign='topCate' 就是定义变量名为 $topCate


修改 include/common.func.php 文件(最规范、可复用)

如果你在网站的很多地方都需要调用顶级栏目,那么创建一个自定义函数是最好的选择,这符合“代码复用”的原则。

操作步骤:

  1. 打开织梦核心函数文件:/include/common.func.php
  2. 在文件末尾 ?> 之前,添加以下PHP函数:
/**
 * 获取指定栏目的顶级栏目信息
 * @param int $typeid 栏目ID
 * @return array 顶级栏目信息数组
 */
function GetTopType($typeid)
{
    global $dsql;
    if (empty($typeid)) {
        return false;
    }
    // 先获取当前栏目的顶级栏目ID
    $row = $dsql->GetOne("SELECT topid FROM `#@__arctype` WHERE id = $typeid");
    $topid = $row['topid'];
    // 如果当前栏目就是顶级栏目,则topid为0,此时typeid就是顶级栏目ID
    if ($topid == 0) {
        $topid = $typeid;
    }
    // 获取顶级栏目的完整信息
    $topType = $dsql->GetOne("SELECT id, typename, typelink FROM `#@__arctype` WHERE id = $topid");
    return $topType;
}

注意:代码中的 #@__ 是织梦表前缀的占位符,系统会自动替换为你数据库中配置的前缀(如 dede_)。

织梦内容页调用顶级栏目
(图片来源网络,侵删)
  1. 在模板中调用这个函数

你可以在任何模板文件(包括内容页)中使用这个函数了。

{dede:getsql sql='GetTopType(~id~)' assign='topCate'/}
<!-- 使用变量输出 -->
当前文章的顶级栏目是:<a href="{$topCate.typelink}">{$topCate.typename}</a>
<!-- 或者直接调用,输出名称 -->
顶级栏目名:{dede:function name='GetTopType' row=~id~ field='typename'/}
  • GetTopType(~id~): 调用我们刚刚创建的函数,并将当前文章的栏目ID ~id~ 传进去。
    • row=~id~: row 参数用于向函数传递参数。
    • field='typename': field 参数用于指定只返回函数结果中的 typename 字段。

优点:

  • 代码复用:一次定义,处处可用。
  • 逻辑清晰:将数据库查询逻辑与模板分离,更易于维护。
  • 性能较好:函数经过优化,效率很高。

利用 channel 标签(适用于特定层级)

如果你的栏目结构不复杂(比如最多三级),并且顶级栏目就是当前栏目的父栏目的父栏目,你可以尝试使用 {dede:channel}

操作步骤: 页模板中,使用 {dede:field name='typeid' function="GetTopType(@me)"/} 这样的方式来获取顶级栏目ID。 2. 然后用这个ID去查询栏目信息。

这种方法本质上和方法二类似,但不如方法二灵活和强大,不推荐作为首选,但可以了解一下。

{dede:channel type='top' row='1' currentstyle=''}
    <!-- 这个标签通常用于调用顶级栏目列表,而不是单个 -->
{/dede:channel}
<!-- 更实际的用法是结合PHP -->
<?php
$topid = (int)GetTopType($arcID)['id']; // 假设你已经在common.func.php里定义了GetTopType函数
?>
{dede:channel typeid='$topid' row='1'}
    <a href="[field:typelink/]">[field:typename/]</a>
{/dede:channel}

这种方法需要依赖自定义函数,所以最终还是回到了方法二。


总结与对比

方法 优点 缺点 推荐度
SQL直接查询 - 简单直接,无需修改核心文件。
- 灵活,可随时修改SQL获取不同字段。
- 不受栏目层级限制。
- 如果在多处使用,代码会重复。
- SQL语句直接写在模板中,对初学者可能不够直观。
⭐⭐⭐⭐⭐ (最常用,快速实现)
自定义函数 - 最规范、最专业的做法。
- 高度复用,一劳永逸。
- 逻辑与视图分离,易于维护和扩展。
- 性能优秀。
- 需要修改核心函数文件 common.func.php,对新手有门槛。 ⭐⭐⭐⭐⭐ (最推荐,长期项目首选)
Channel标签 - 标签化,感觉“原生”。 - 不够灵活,实现复杂逻辑困难。
- 通常需要结合自定义函数,显得冗余。
⭐⭐ (不推荐,了解即可)

最终建议:

  • 对于一次性少量页面的需求,直接使用方法一(SQL查询)最快最方便。
  • 对于网站长期维护,或者这个功能会在多个地方被频繁使用,强烈建议你花几分钟时间使用方法二(自定义函数),这会让你的代码更健壮、更易于管理。
-- 展开阅读全文 --
头像
dede wap模板哪里下载?好用吗?
« 上一篇 01-29
织梦CMS能做淘宝客吗?
下一篇 » 01-29

相关文章

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