下面我将为您详细介绍几种最常用和最实用的方法,并提供详细的代码示例和解释。
核心原理
织梦调用栏目的核心标签是 {dede:channel},要实现二级栏目的调用,我们需要使用嵌套循环(循环里面再套循环)。
- 外层循环:使用
{dede:channel}调用所有顶级栏目(一级栏目)。 - 内层循环:在一级栏目的循环体内,再次使用
{dede:channel},但这次需要通过typeid属性指定当前一级栏目的ID,从而只调用它下面的二级栏目。
最常用的方法(推荐)
这种方法最直观,代码清晰,适用于绝大多数场景,比如网站主导航下拉菜单。
代码示例
{dede:channel type='top' row='10'}
<li>
<!-- 一级栏目链接 -->
<a href="[field:typelink/]">[field:typename/]</a>
<!-- 开始二级栏目循环 -->
<div class="subnav">
{dede:channel type='son' typeid='[field:id/]'}
<a href="[field:typelink/]">[field:typename/]</a>
{/dede:channel}
</div>
<!-- 结束二级栏目循环 -->
</li>
{/dede:channel}
代码详解
-
外层循环:一级栏目
{dede:channel type='top' row='10'}type='top':这是关键参数,表示只调用顶级栏目(即一级栏目)。row='10':表示调用的一级栏目数量,最多10个,如果不写,默认调用所有顶级栏目。</li>和<div class="subnav">是为了包裹一级栏目和其二级菜单而添加的HTML结构,您可以根据自己的CSS需求修改。
-
内层循环:二级栏目
{dede:channel type='son' typeid='[field:id/]'}type='son':表示调用子栏目。typeid='[field:id/]':这是另一个关键参数,它引用了外层循环中当前一级栏目的ID ([field:id]),这样,内层循环就知道要调用哪个一级栏目下面的二级栏目了。
[field:typelink/]和[field:typename/]分别输出二级栏目的链接和名称。
调用指定一级栏目下的二级栏目
你可能只想调用某一个特定一级栏目(产品中心”)下的所有二级栏目,而不是所有一级栏目下的。
代码示例
假设“产品中心”这个一级栏目的ID是 2。
<div class="product-category">
{dede:channel type='son' typeid='2'}
<a href="[field:typelink/]">[field:typename/]</a>
{/dede:channel}
</div>
代码详解
- 这种方法非常简单,直接使用
{dede:channel type='son' typeid='2'}。 typeid='2'直接指定了你要查询的父级栏目ID。type='son'表示只查询ID为2的栏目的直接子栏目(即二级栏目)。- 这种方法常用于页脚的“快速导航”或者某个特定内容区域的分类展示。
调用所有层级的栏目(递归调用)
如果你需要一个可以无限层级的栏目调用(比如网站地图),或者想一次性获取所有栏目数据自己进行处理,可以使用递归调用。
代码示例
<ul>
{dede:channelartlist typeid='0' cacheid='channellist'}
<li>
<a href="{dede:field name='typeurl'/}">{dede:field name='typename'/}</a>
<!-- 检查并输出子栏目 -->
{dede:channel type='son' noself='yes'}
<ul class="sonlist">
{dede:field name='typename'/} - {dede:field name='id'/}
<!-- 这里可以继续嵌套调用三级、四级... -->
</ul>
{/dede:channel}
</li>
{/dede:channelartlist}
</ul>
代码详解
{dede:channelartlist}:这个标签专门用于获取栏目列表,并支持在循环中获取当前栏目的信息。typeid='0':表示获取所有顶级栏目。{dede:field name='typeurl'/}和{dede:field name='typename'/}:在channelartlist循环中,使用field标签来获取当前栏目的信息。{dede:channel type='son' noself='yes'}:在channelartlist循环内部,同样可以使用channel标签来调用子栏目。noself='yes'表示不包含栏目本身。- 递归:你可以看到,在二级栏目的
<ul>内部,你可以再次嵌套一个{dede:channelartlist}或{dede:channel}循环,通过typeid指定当前二级栏目的ID,来调用三级栏目,以此类推,实现无限级调用。
| 属性 | 说明 | |
|---|---|---|
{dede:channel} |
type='top' |
调用顶级栏目(一级栏目) |
type='son' |
调用指定栏目的子栏目 | |
typeid='栏目ID' |
指定栏目ID,用于限定查询范围 | |
row='数字' |
调用栏目数量 | |
currentstyle='' |
高亮样式,非常实用! | |
{dede:channelartlist} |
typeid='0' |
获取所有顶级栏目 |
cacheid='缓存ID' |
设置缓存,提高性能 |
高级技巧:高亮当前栏目
在导航菜单中,我们通常希望当前所在的栏目能高亮显示,织梦提供了 currentstyle 属性来实现这个功能。
示例代码
{dede:channel type='top' currentstyle="<li class='on'><a href='~typelink~'>~typename~</a></li>"}
<li>
<a href="[field:typelink/]">[field:typename/]</a>
<div class="subnav">
{dede:channel type='son' typeid='[field:id]' currentstyle="<a href='~typelink~' class='active'>~typename~</a>"}
<a href="[field:typelink/]">[field:typename/]</a>
{/dede:channel}
</div>
</li>
{/dede:channel}
currentstyle属性里的~typename~、~typelink~等是模板替换符号,会分别被替换为[field:typename/]、[field:typelink/]的值。- 当访问的栏目URL与
[field:typelink/]匹配时,就会输出currentstyle中定义的HTML结构。 - 在上面的例子中,一级栏目高亮会添加
class='on',二级栏目高亮会添加class='active',你只需要在CSS中定义好.on和.active的样式即可。
| 需求场景 | 推荐方法 | 关键代码 |
|---|---|---|
| 主导航下拉菜单 | 方法一 | {dede:channel type='top'} 嵌套 {dede:channel type='son' typeid='[field:id]'} |
| 页脚或特定区域分类 | 方法二 | {dede:channel type='son' typeid='指定ID'} |
| 网站地图等无限级 | 方法三 | {dede:channelartlist} 嵌套 {dede:channel} |
| 高亮当前栏目 | 结合 currentstyle |
在 {dede:channel} 中添加 currentstyle 属性 |
希望这份详细的教程能帮助您在织梦CMS中轻松调用二级栏目!如果您有任何疑问,欢迎随时提问。
