织梦CMS如何调用同级栏目?

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

在当前栏目页,获取并显示所有同级栏目

这是最常见的需求,比如在文章列表页,你想显示当前栏目同级的所有栏目。

织梦cms调用同级栏目
(图片来源网络,侵删)

方法1:使用 getsonclass() 函数 (推荐)

这是最直接、最简单的方法,专门用于获取指定栏目的所有子栏目(也就是同级栏目)。

代码示例:

{dede:field name='typeid' function='getsonclass(@me)'/}

代码解析:

  1. {dede:field name='typeid'}: 这句是用来获取当前栏目的ID。
  2. function='getsonclass(@me)': 这句是关键。
    • function= 表示对前面获取的值进行一个函数处理。
    • @me 是一个变量,代表 {dede:field name='typeid'} 的值,也就是当前栏目的ID。
    • getsonclass() 是织梦内置的函数,它的作用是根据传入的栏目ID,获取其所有子栏目的ID,并以逗号分隔的字符串形式返回

如何使用这个ID字符串?

通常我们会把这个ID字符串用在 IN 查询里,来获取这些同级栏目的详细信息。

完整示例:显示当前栏目及其同级栏目的链接列表

<ul class="sibling-nav">
  {dede:channel type='son' currentstyle='<li class="active"><a href~field typeid~">~typename~</a></li>'}
    <li><a href="[field:typelink/]">[field:typename/]</a></li>
  {/dede:channel}
</ul>

上面的代码有一个问题{dede:channel type='son'} 只会显示当前栏目的直接子栏目,而不是同级栏目,我们需要结合 getsonclass 来修正。

修正后的完整代码(这才是正确的调用同级栏目的方法):

<ul class="sibling-nav">
  {dede:sql sql='SELECT id, typename, typelink FROM dede_arctype WHERE reid = ~getsonclass(@me)~ AND ishidden <> 1 ORDER BY sortrank'}
    <li><a href="[field:typelink/]">[field:typename/]</a></li>
  {/dede:sql}
</ul>

代码解析:

  1. {dede:sql ...}: 这是一个自定义SQL查询标签,非常强大。
  2. sql='SELECT id, typename, typelink FROM dede_arctype WHERE ...': 这是我们编写的SQL语句。
    • dede_arctype: 这是织梦存放栏目的数据表,根据你的前缀可能不同(如#@__arctype)。
    • id, typename, typelink: 我们想获取的字段,分别是栏目ID、栏目名称和栏目链接。
  3. WHERE reid = ~getsonclass(@me)~: 这是查询的核心条件。
    • reiddede_arctype 表中的一个字段,它代表“父栏目ID”。
    • ~getsonclass(@me)~: 这里使用了 包裹,这是织梦在SQL标签中调用函数的语法,它会先执行 getsonclass(@me) 函数,获取当前栏目ID,然后执行 SELECT reid FROM dede_arctype WHERE id = [当前栏目ID],得到当前栏目的父栏目ID。
    • WHERE reid = [当前栏目的父ID] 的意思就是:查询所有父ID等于当前栏目父ID的栏目,这正是同级栏面的定义。
  4. AND ishidden <> 1: 排除隐藏的栏目。
  5. ORDER BY sortrank: 按照后台设置的排序进行排序。
  6. [field:typelink/][field:typename/]: 在循环中输出每个栏目的链接和名称。

方法2:使用 topid 变量 (适用于特定场景)

如果你的网站结构是二级栏目(一级栏目 -> 二级栏目 -> 文章),并且你只想获取当前二级栏面的同级栏目,这个方法会更简单。

代码示例:

<ul class="sibling-nav">
  {dede:channel type='son' typeid='~topid~' currentstyle='<li class="active"><a href~field typeid~">~typename~</a></li>'}
    <li><a href="[field:typelink/]">[field:typename/]</a></li>
  {dede:channel}
</ul>

代码解析:

  • {dede:channel} 标签有一个 typeid 属性,可以指定从哪个栏目开始获取子栏目。
  • typeid='~topid~': topid 是织梦的一个内置变量,它代表“顶级栏目ID”,在二级栏目页面,topid 的值就是它父一级栏目的ID。
  • typeid='~topid~' 就等同于告诉 {dede:channel}:“请从我的父栏目开始,获取它的子栏目”,也就是获取所有同级栏目。

注意: 这个方法只适用于固定的二级栏目结构,如果你的栏目层级很深(例如三级、四级),它获取的就不是直接同级,而是“父级栏目的子栏目”,逻辑上可能会有偏差。方法1(getsonclass + dede:sql)是更通用、更推荐的方案。


在任意页面(如首页、文章内容页)调用指定栏目的同级栏目

你可能想在首页上显示某个特定栏目(关于我们”)的同级栏目列表。

思路:

  1. 你需要知道目标栏目(“关于我们”)的ID。
  2. 使用这个ID找到它的父栏目ID。
  3. 用父栏目ID去查询所有同级栏目。

代码示例(假设“关于我们”的栏目ID是 5):

<ul class="about-sibling-nav">
  {dede:sql sql='SELECT id, typename, typelink FROM dede_arctype WHERE reid = (SELECT reid FROM dede_arctype WHERE id = 5) AND ishidden <> 1 ORDER BY sortrank'}
    <li><a href="[field:typelink/]">[field:typename/]</a></li>
  {/dede:sql}
</ul>

代码解析:

这里的SQL语句使用了子查询:

  1. (SELECT reid FROM dede_arctype WHERE id = 5): 先执行内层查询,找到ID为5的栏目的父栏目ID(reid)。
  2. WHERE reid = [上一步查询出的结果]: 再用这个父ID去查询所有同级栏目。

如果你想在模板里动态获取某个栏目的ID,而不是写死,可以先通过 {dede:field} 获取,再嵌入SQL,但这会变得复杂,对于在首页调用固定栏目的同级栏目,直接写死ID是最简单的方式。


总结与对比

方法 适用场景 优点 缺点
getsonclass() + dede:sql 通用,推荐,适用于在栏目页调用同级栏目。 逻辑清晰,准确,不受栏目层级限制,非常灵活。 需要编写SQL语句,对新手有一定门槛。
topid + {dede:channel} 特定场景,适用于二级栏目结构,调用直接上级的同级栏目。 代码简洁,无需SQL,易于理解。 不适用于深层级栏目结构,通用性差。

最终建议:

  • 如果你在栏目页需要调用同级栏目,请优先使用 方法1 (getsonclass + dede:sql),它是最标准、最可靠的解决方案。
  • 如果你的栏目结构非常简单且固定,只是想快速实现,可以考虑 方法2 (topid + {dede:channel})

希望这些详细的解释和示例能帮助你完全掌握在织梦CMS中调用同级栏目的技巧!

-- 展开阅读全文 --
头像
织梦列表调用tag标签
« 上一篇 今天
c语言程序设计 谭浩强怎么样
下一篇 » 今天

相关文章

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

目录[+]