在织梦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则表示当前栏目是顶级栏目,否则值为其所属顶级栏目的IDtypename:栏目名称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:指定顶级栏目IDishidden=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'/}