使用 {dede:sonchannel} 标签 (最推荐、最简单)
这是 DedeCMS 专门为调用当前栏目的直接子栏目设计的标签,也是实现此功能最直接、最简单的方法。
适用场景:只需要调用当前栏下的第一级子栏目。
基本语法:
{dede:sonchannel}
<a href="[field:typelink/]">[field:typename/]</a>
{/dede:sonchannel}
标签参数说明:
row='数字':获取子栏目的数量,默认为8。typeid='栏目ID':指定要获取子栏目的父栏目ID,如果省略,则默认为当前栏目。noself='yes':是否不包含当前栏目本身,在调用子栏目时,通常需要设置为yes,避免混淆。
示例:在一个栏目页调用其所有子栏目
假设你的栏目页模板是 list_article.htm,你希望在这个页面的某个位置显示它所有的子栏目。
<!-- 在 list_article.htm 模板中 -->
<div class="sub-channel-list">
<h3>子栏目</h3>
<ul>
{dede:sonchannel row='10' noself='yes'}
<li>
<a href="[field:typelink/]">[field:typename/]</a>
</li>
{dede:sonchannel}
</ul>
</div>
代码解释:
{dede:sonchannel}:开始调用子栏目。row='10':最多调用10个子栏目。noself='yes':不包含当前栏目本身。[field:typelink/]:子栏目的链接地址。[field:typename/]:子栏目的名称。
使用 {dede:channel} 标签 (灵活,可指定任意父栏目)
{dede:channel} 标签主要用于获取栏目列表,通过指定 typeid 参数,可以调用任意指定栏目的子栏目。
适用场景:
- 在非栏目页(如首页、文章页)调用某个特定栏目的子栏目。
- 功能上与方法一类似,但更通用。
基本语法:
{dede:channel type='son' typeid='父栏目ID'}
<a href="[field:typelink/]">[field:typename/]</a>
{/dede:channel}
标签参数说明:
type='son':指定获取类型为“子栏目”,这是关键参数。typeid='父栏目ID':必须指定,你想获取哪个栏目的子栏目,就把它的ID写在这里,想在首页调用ID为5的栏目的子栏目,就写typeid='5'。row='数字':获取数量。currentstyle='':当前样式,与方法一的{dede:sonchannel}不同,{dede:channel}的currentstyle用于高亮显示当前所在的栏目。
示例:在首页调用指定栏目(ID=5)的子栏目
假设你想在网站首页的侧边栏,调用“产品中心”栏目(假设其ID为 5)的所有子栏目。
<!-- 在首页 index.htm 模板中 -->
<div class="product-categories">
<h3>产品分类</h3>
<ul>
{dede:channel type='son' typeid='5' row='20'}
<li>
<a href="[field:typelink/]">[field:typename/]</a>
</li>
{dede:channel}
</ul>
</div>
嵌套使用 {dede:type} 和 {dede:sonchannel} (用于复杂结构)
如果你需要在循环子栏目时,获取每个子栏目自身的更多属性(如栏目图片、描述等),就需要结合 {dede:type} 标签一起使用。
适用场景:在调用子栏目列表的同时,需要显示每个子栏目的更多信息,如缩略图、简介等。
基本思路:
- 用
{dede:sonchannel}循环出所有子栏目的typeid。 - 在循环内部,再用
{dede:type}根据这个typeid获取该子栏目的详细信息。
示例:调用子栏目并显示其图片和描述
<div class="sub-channel-detail-list">
{dede:sonchannel}
<!-- 循环开始,[field:id] 就是当前子栏目的ID -->
{dede:type typeid='[field:id]'}
<div class="channel-item">
<a href="[field:typelink/]">
<!-- [field:typedir/] 是栏目目录,[field:litpic/] 是缩略图 -->
<img src="[field:litpic/]" alt="[field:typename/]">
<h4>[field:typename/]</h4>
<p>[field:description function='cn_substr(@me, 100)'/]</p> <!-- 截取100字描述 -->
</a>
</div>
{/dede:type}
{/dede:sonchannel}
</div>
代码解释:
{dede:sonchannel}:遍历当前栏目的所有子栏目。[field:id]:在{dede:sonchannel}循环中,这个变量代表当前子栏目的ID。{dede:type typeid='[field:id]'}:在循环内部,我们使用{dede:type}标签,并将它的typeid参数设置为子栏目的ID,这样就能获取到该子栏目的完整信息。[field:litpic/]:子栏目的缩略图。[field:description/]:子栏目的描述,这里用function='cn_substr(@me, 100)'来截取前100个字符。
总结与对比
| 方法 | 标签组合 | 优点 | 缺点 | 适用场景 |
|---|---|---|---|---|
| 方法一 | {dede:sonchannel} |
最简单、最直接、代码少、性能好。 | 只能调用当前栏目的直接子栏目。 | 在栏目页调用其下一级子栏目,是最常见的需求。 |
| 方法二 | {dede:channel} |
非常灵活,可以在任何页面调用任意指定栏目的子栏目。 | 语法稍复杂,需要手动指定 typeid。 |
在首页、文章页等非栏目页调用其他栏目的子栏目。 |
| 方法三 | {dede:sonchannel} + {dede:type} |
功能最强大,可以获取子栏目的任何自定义字段(如图片、描述等)。 | 代码嵌套,相对复杂。 | 需要在调用子栏目列表的同时,展示每个子栏目的详细信息。 |
推荐首选:在绝大多数情况下,直接使用 方法一 ({dede:sonchannel}) 是最佳选择,因为它最简洁、高效,只有当方法一无法满足需求时,再考虑方法二和方法三。
