dede如何调用交叉栏目的内容?

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

调用当前栏目的“兄弟栏目”内容

这是最常见的需求,你在一个产品分类下,想展示同级的其他产品列表。

dede 调用交叉栏目的内容
(图片来源网络,侵删)

核心思路:

  1. 获取当前栏目的父ID (topidreid)。
  2. 使用这个父ID去查询所有具有相同父ID的栏目(即兄弟栏目)。
  3. 遍历这些兄弟栏目,并分别调用它们下面的文章列表。

方法 A:使用 dede:arclist 标签(推荐,性能好)

这是最常用且最高效的方法,直接在模板文件中通过SQL语句实现。

{dede:arclist}
    <ul>
        {dede:sql sql='
            SELECT id, typename 
            FROM `dede_arctype` 
            WHERE reid = ~typeid~ 
            AND ishidden = 0 
            ORDER BY sortrank
        '}
        <li>
            <a href="[field:typelink/]]" title="[field:typename/]">[field:typename/]</a>
            <!-- 下面再嵌套一个 arclist 来调用该兄弟栏目下的文章 -->
            {dede:arclist row='5' titlelen='30' typeid='[field:id/]'}
            <ul>
                <li><a href="[field:arcurl/]">[field:title/]</a></li>
            </ul>
            {/dede:arclist}
        </li>
        {/dede:sql}
    </ul>
{/dede:arclist}

代码解析:

  1. {dede:sql ...}:这是一个执行自定义SQL的标签。
  2. sql='...':里面的SQL语句是核心。
    • SELECT id, typename FROM dede_arctype:从栏目表 dede_arctype 中查询栏目的ID和名称。
    • WHERE reid = ~typeid~:这是关键。reid 是栏目的父级ID。~typeid~ 是DedeCMS的一个特殊变量,代表当前页面的栏目ID,这里我们用它来获取当前栏目的父ID,从而筛选出所有兄弟栏目。
    • AND ishidden = 0:排除隐藏的栏目。
    • ORDER BY sortrank:按照后台设置的排序进行排列。
  3. [field:typelink/]{dede:sql} 标签内可以使用 field: 来获取SQL查询返回的字段。typelink 是DedeCMS内置的函数,会自动生成栏目的链接(如 /a/abc/)。
  4. 嵌套 {dede:arclist}:在 {dede:sql} 循环的内部,我们再次使用 {dede:arclist},并将 typeid 设置为当前兄弟栏目的 id ([field:id/]),这样就实现了调用每个兄弟栏目下的文章列表。

方法 B:使用 {dede:channelartlist} 标签(更结构化)

如果你希望每个兄弟栏目及其文章作为一个区块来展示,channelartlist 是一个很好的选择。

dede 调用交叉栏目的内容
(图片来源网络,侵删)
{dede:channelartlist typeid='~reid~'}
    <h2><a href="{dede:field name='typeurl'/}">{dede:field name='typename'/}</a></h2>
    <ul>
        {dede:arclist row='5' titlelen='30'}
        <li><a href="[field:arcurl/]">[field:title/]</a></li>
        {/dede:arclist}
    </ul>
{/dede:channelartlist}

代码解析:

  1. {dede:channelartlist ...}:这个标签用于循环输出指定栏目及其子栏目。
  2. typeid='~reid~':这是它的灵魂所在。typeid 属性用来指定起始栏目。~reid~ 变量代表当前栏目的父级ID,typeid='~reid~' 的意思就是“以我的父栏目为起点,循环输出它下面的所有直接子栏目(也就是我的兄弟栏目)”。
  3. {dede:field name='typeurl'/}{dede:field name='typename'/}:在 channelartlist 循环内部,通过 field: 变量可以获取到当前循环到的栏目的链接和名称。
  4. 内部的 {dede:arclist}:它会默认调用当前循环栏目(即兄弟栏目)下的文章列表,无需再指定 typeid

调用当前栏目的“父栏目”内容

这个需求相对简单,因为父栏目只有一个。

方法:使用 {dede:sql}
{dede:sql sql='
    SELECT id, typename, description 
    FROM `dede_arctype` 
    WHERE id = ~reid~ 
    AND ishidden = 0
    LIMIT 1
'}
    <h1><a href="[field:typelink/]]" title="[field:typename/]">[field:typename/]</a></h1>
    <p>[field:description function='htmlspecialchars(@me)'/]</p>
{/dede:sql}

代码解析:

  • WHERE id = ~reid~:直接查询当前栏目的父级ID (reid) 对应的栏目信息。
  • LIMIT 1:确保只返回一条记录,因为父栏目是唯一的。

调用当前栏目的“子栏目”内容

这个需求也很常见,通常用于制作主导航下的子导航和文章列表。

dede 调用交叉栏目的内容
(图片来源网络,侵删)

方法:使用 {dede:channelartlist}

这和调用兄弟栏目的方法几乎一样,只是变量不同。

{dede:channelartlist typeid='~typeid~'}
    <h2><a href="{dede:field name='typeurl'/}">{dede:field name='typename'/}</a></h2>
    <ul>
        {dede:arclist row='5' titlelen='30'}
        <li><a href="[field:arcurl/]">[field:title/]</a></li>
        {/dede:arclist}
    </ul>
{/dede:channelartlist}

代码解析:

  • typeid='~typeid~':这里我们使用 ~typeid~,即当前栏目的ID。channelartlist 会以当前栏目为父级,循环输出它的所有直接子栏目。

总结与最佳实践

需求场景 推荐标签 关键参数/变量 说明
调用兄弟栏目 {dede:channelartlist} typeid='~reid~' 结构清晰,适合做区块式展示。
调用兄弟栏目 {dede:sql} + {dede:arclist} WHERE reid = ~typeid~ 灵活,可以自定义SQL,性能优异。
调用父栏目 {dede:sql} WHERE id = ~reid~ 简单直接,获取单个父栏目信息。
调用子栏目 {dede:channelartlist} typeid='~typeid~' 最标准、最常用的调用子栏目方法。

重要提示:

  1. 变量~typeid~ (当前栏目ID) 和 ~reid~ (当前栏目的父级ID) 是DedeCMS模板中的核心变量,务必理解它们的区别。
  2. 表前缀:如果你的数据表前缀不是默认的 dede_,请记得将SQL语句中的 dede_arctype 修改成你自己的表前缀。
  3. 缓存:DedeCMS有强大的缓存机制,在修改模板后,如果前台页面没有立即更新,请到后台 [系统] -> [一键更新缓存][生成] -> [更新HTML],选择“更新所有”或“更新栏目缓存”。
  4. 性能{dede:sql} 执行的是原生SQL,效率很高,尽量避免在循环中使用过多或过于复杂的查询。

希望这份详细的指南能帮助你解决在DedeCMS中调用交叉栏目内容的问题!

-- 展开阅读全文 --
头像
dede采集图集图片,发布时如何正确处理?
« 上一篇 前天
C语言与Delphi如何实现AES加密?
下一篇 » 前天

相关文章

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