织梦cms 如何调用顶级栏目下的二级栏目

admin 104 0
在织梦CMS中,调用顶级栏目下的二级栏目可通过{dede:channel}标签实现,核心方法是指定顶级栏目的typeid(顶级栏目ID)并设置type='son',{dede:channel type='son' typeid='顶级栏目ID' row='10'},typeid需替换为实际顶级栏目ID,row控制显示数量,若需获取顶级栏目自身及二级栏目,可省略type或设为top;若仅显示二级栏目,type='son'为关键,可通过col参数分栏显示,noself='1'排除顶级栏目自身,灵活调整即可实现层级调用。

织梦CMS调用顶级栏目下二级栏目的详细方法与代码示例

在织梦CMS(DedeCMS)建站过程中,栏目结构是网站内容的骨架,合理地展示栏目层次能够极大地提升用户体验,很多时候我们需要在页面中展示顶级栏目下的二级栏目,比如网站主导航栏下的子菜单、侧边栏的分类列表等,本文将详细介绍两种常用的调用方法:基于Dede标签的简洁调用和基于SQL查询的灵活调用,帮助开发者快速实现这一需求。

核心原理:理解织梦栏目表结构

在调用二级栏目前,我们需要先了解织梦CMS的栏目表(dede_arctype)的核心字段:

  • id:栏目ID,唯一标识一个栏目
  • topid:顶级栏目ID,若为0则表示当前栏目是顶级栏目,否则值为其所属顶级栏目的ID
  • typename:栏目名称
  • typedir:栏目目录(链接地址)
  • sortrank:栏目排序(数字越小,排序越靠前)
  • isdefault:是否为默认栏目
  • moresite:是否支持多站点
  • description:栏目描述

核心逻辑:要调用顶级栏目下的二级栏目,只需筛选出topid等于该顶级栏目ID的记录即可,这一原理是所有调用方法的基础。

使用Dede标签组合调用(推荐)

织梦CMS内置的{dede:channel}标签支持直接调用子栏目,无需编写复杂的SQL语句,适合大多数常规场景,这种方法代码简洁且易于维护,是开发者的首选方案。

调用指定顶级栏目下的二级栏目

假设已知顶级栏目的ID(例如ID为1的"产品中心"),使用{dede:channel}标签的type='son'属性调用其子栏目:

{dede:channel type='son' typeid='1' orderby='sortrank'}
    <a href="[field:typedir/]" title="[field:typename/]">[field:typename/]</a>
{/dede:channel}

参数说明

  • typeid='1':指定顶级栏目的ID(需替换为实际ID)
  • type='son':调用指定栏目的直接子栏目(二级栏目)
  • orderby='sortrank':按栏目排序字段升序排列(可省略,默认按ID排序)
  • row='10':限制显示数量(可选参数)

在顶级栏目页调用其下的所有二级栏目

如果当前页面就是顶级栏目(如"产品中心"栏目页),可通过{dede:field name='id'}获取当前顶级栏目的ID,再调用子栏目:

{dede:channel type='son' typeid='{dede:field name='id'/}' orderby='sortrank'}
    <li>
        <a href="[field:typedir/]" title="[field:typename/]">[field:typename/]</a>
    </li>
{/dede:channel}

场景示例:在顶级栏目的列表页(list_article.htm页(article_article.htm)中,可直接使用上述代码调用其子栏目,实现面包屑导航或侧边栏分类展示。

调用所有顶级栏目及其二级栏目(导航栏常见场景)

若需要在首页展示所有顶级栏目,并每个顶级栏目下展开其二级栏目(如主导航下拉菜单),可采用嵌套标签实现:

<ul class="nav">
    {dede:channel type='top' orderby='sortrank'}
        <li class="nav-item">
            <a href="[field:typedir/]" title="[field:typename/]">[field:typename/]</a>
            <ul class="sub-nav">
                {dede:channel type='son' typeid='[field:id/]' row='8'}
                    <li>
                        <a href="[field:typedir/]" title="[field:typename/]">[field:typename/]</a>
                    </li>
                {/dede:channel}
            </ul>
        </li>
    {/dede:channel}
</ul>

说明

  • 外层{dede:channel type='top'}调用所有顶级栏目
  • 内层{dede:channel type='son' typeid='[field:id/]'}调用当前顶级栏目的子栏目,通过[field:id/]`动态获取顶级栏目ID
  • 添加了row='8'参数限制每个顶级栏目下最多显示8个子栏目

高级技巧:条件判断与样式控制

在实际应用中,我们可能需要根据栏目是否有内容或特定条件来显示不同的样式:

{dede:channel type='son' typeid='{dede:field name='id'/}'}
    <li class="menu-item [field:isdefault runphp='yes']@me=(@me=='1')?'active':'';[/field:isdefault]">
        <a href="[field:typedir/]" title="[field:typename/]">
            [field:typename/]
            <span class="badge">[field:id function="GetTotalArc(@me)"/]</span>
        </a>
    </li>
{/dede:channel}

这段代码实现了:

  • 判断是否为默认栏目并添加active类
  • 显示每个二级栏目下的文章数量
  • 使用badge样式突出显示数量

使用SQL查询调用(灵活场景)

当需要更复杂的筛选条件(如仅显示有内容的二级栏目、按特定字段排序)时,可直接通过SQL查询数据库,结合{dede:sql}标签实现灵活调用,这种方法虽然需要一定的SQL基础,但提供了更高的灵活性。

基础SQL调用:指定顶级栏目下的二级栏目

{dede:sql sql='SELECT id,typename,typedir,description 
    FROM dede_arctype 
    WHERE topid=1 AND ishidden=0 
    ORDER BY sortrank ASC'}
    <a href="[field:typedir/]" title="[field:description/]">[field:typename/]</a>
{/dede:sql}

参数说明

  • topid=1:指定顶级栏目ID
  • ishidden=0:仅显示未隐藏的栏目
  • ORDER BY sortrank ASC:按排序升序排列

高级SQL调用:带条件的二级栏目查询

{dede:sql sql='SELECT a.id,a.typename,a.typedir,b.count 
    FROM dede_arctype a 
    LEFT JOIN (
        SELECT typeid,COUNT(*) as count 
        FROM dede_archives 
        GROUP BY typeid
    ) b ON a.id=b.typeid 
    WHERE a.topid=1 AND a.ishidden=0 
    ORDER BY a.sortrank ASC'}
    <li>
        <a href="[field:typedir/]" title="[field:typename/]">[field:typename/]</a>
        <span class="count">([field:count/])</span>
    </li>
{/dede:sql}

这段代码实现了:

  • 查询二级栏目及其对应的文章数量
  • 使用LEFT JOIN确保即使没有文章的栏目也会显示
  • 在结果中显示每个栏目的文章数量

分页调用二级栏目

当二级栏目数量较多时,可以添加分页功能:

{dede:sql sql='SELECT id,typename,typedir 
    FROM dede_arctype 
    WHERE topid=1 
    ORDER BY sortrank ASC 
    LIMIT 0,10'}
    <a href="[field:typedir/]" title="[field:typename/]">[field:typename/]</a>
{/dede:sql}
<!-- 分页代码 -->
<div class="page-nav">
    {dede:pagelist listsize='3' listitem='pre,next,end,option'/}

标签: #调用顶级 #二级栏目