这个标签专门用于生成栏目列表,也就是我们常说的“主导航”或“一级栏目”及其子栏目列表,它非常适合用在网站的页眉、页脚或者侧边栏。

(图片来源网络,侵删)
channelartlist 的作用和适用场景
想象一下一个典型的网站布局:
+--------------------------------------------------+
| [首页] [公司简介] [产品展示] [新闻中心] [联系我们] | <-- 这就是 channelartlist 要生成的
+--------------------------------------------------+
| |
| [产品A] [产品B] [产品C] | <-- 这是当前栏目(产品展示)下的子栏目
| |
| 产品列表内容... |
| |
+--------------------------------------------------+
在这个例子中,channelartlist 就负责生成第一行的主导航,当用户点击“产品展示”时,它不仅会高亮显示“产品展示”,还会在下方(或侧边栏)列出其子栏目 [产品A] [产品B] [产品C]。
适用场景:
- 网站主导航菜单:最经典的应用。
- 页脚的栏目链接。
- 侧边栏的栏目导航块。
- 任何需要“父栏目 + 其直接子栏目”列表的地方。
基本语法和属性
channelartlist 是一个单标签,通常与 {/channelartlist} 成对使用,中间包裹的是循环内容。

(图片来源网络,侵删)
基本语法结构
{channelartlist}
<a href="{field:typeurl/}">{field:typename/}</a>
{dede:channel type='son' noself='yes'}
<a href="[field:typelink/]">[field:typename/]</a>
{/dede:channel}
{/channelartlist}
核心属性
| 属性名 | 说明 | 示例 | 默认值 |
|---|---|---|---|
typeid |
指定调用的栏目ID,如果为空,则默认从首页调用顶级栏目。 | typeid='2,5,8' |
空字符串 |
cacheid |
缓存ID,用于开启缓存,提高性能。 | cacheid='nav' |
无 |
typeid |
指定调用的栏目ID,如果为空,则默认从首页调用顶级栏目。 | typeid='2,5,8' |
空字符串 |
row |
循环输出的栏目数量(即显示多少个父栏目)。 | row='6' |
无限制 |
col |
每行显示的栏目个数(主要用于CSS布局,较少用)。 | col='4' |
1 |
cache |
是否开启缓存。yes为开启,no为关闭。 |
cache='yes' |
no |
reid |
指定父栏目ID,用于获取其子栏目(与typeid类似,但逻辑不同)。 |
reid='10' |
无 |
内置字段(变量)
在 {channelartlist} 和 {/channelartlist} 之间,可以使用以下字段来获取当前循环到的父栏目的信息。
| 字段名 | 说明 |
|---|---|
{field:typeid} |
当前栏目的ID |
{field:typename} |
当前栏目的名称 |
{field:typedir} |
当前栏目的目录(相对路径) |
{field:typeurl} |
当前栏目的链接地址(自动处理了静态/动态链接) |
{field:seotitle} |
当前栏目的SEO标题 |
{field:description} |
当前栏目的描述 |
{field:ismenu} |
当前栏目是否为菜单(1是,0否) |
子栏目调用(关键点)
这是 channelartlist 最核心的功能,在 {channelartlist} 循环体内,使用 {dede:channel} 标签来调用当前父栏目的直接子栏目。
{dede:channel} 的关键属性
| 属性名 | 说明 | 示例 | 默认值 |
|---|---|---|---|
type |
必须设置为 'son',表示获取当前栏目的子栏目。 |
type='son' |
无 |
noself |
必须设置为 'yes',表示不包含栏目本身,只显示子栏目。 |
noself='yes' |
no |
row |
调用子栏目的数量。 | row='10' |
无限制 |
完整实例:制作一个网站主导航
假设我们要制作一个带有下拉子菜单的网站主导航。
第1步:在模板文件中写入代码
在 head.htm 模板文件中:
<!-- 网站主导航开始 -->
<div class="main-nav">
<ul class="nav-list">
{channelartlist row='6' cacheid='nav'}
<li class="nav-item">
<!-- 父栏目链接 -->
<a href="{field:typeurl/}" class="parent-link">
{field:typename/}
</a>
<!-- 判断是否有子栏目,有则显示下拉框 -->
{dede:channel type='son' noself='yes' row='10'}
<!-- 如果进入此循环,说明有子栏目 -->
<div class="sub-nav">
<ul class="sub-nav-list">
{dede:field name='array' runphp='yes'}
// 这段PHP代码用于判断子栏目是否存在
$dsql = new DedeSql(false);
$typeids = array();
foreach($GLOBALS['arrChildID'] as $cid) {
if($cid > 0) $typeids[] = $cid;
}
if(!empty($typeids)) {
$typeidstr = join(',', $typeids);
$query = "SELECT * FROM `#@__arctype` WHERE id IN ($typeidstr) ORDER BY sortrank ASC";
$dsql->SetQuery($query);
$dsql->Execute('op');
while($row = $dsql->GetArray('op')) {
$url = GetOneTypeUrlA($row);
echo "<li><a href='".$url."'>".$row['typename']."</a></li>\n";
}
} else {
echo '';
}
$dsql->Close();
{/dede:field}
</ul>
</div>
{/dede:channel}
</li>
{/channelartlist}
</ul>
</div>
<!-- 网站主导航结束 -->
代码解释:
{channelartlist row='6'}:循环调用6个顶级栏目。{field:typeurl/}和{field:typename/}:输出父栏目的链接和名称。{dede:channel type='son' noself='yes'}:这是获取子栏目的标准写法。{dede:field name='array' runphp='yes'}...{/dede:field}:这是一个更灵活的子栏目调用方式,它通过PHP代码直接查询数据库,可以更精细地控制子栏目的输出,例如按sortrank(排序)排序,如果你只需要简单的列表,可以直接使用{dede:channel}的默认输出。
第2步:添加CSS样式
为了让导航看起来像下拉菜单,需要添加CSS,在 style.css 文件中:
.main-nav { width: 100%; background-color: #333; }
.nav-list { list-style: none; margin: 0; padding: 0; display: flex; }
.nav-item { position: relative; }
.parent-link {
display: block;
padding: 15px 20px;
color: #fff;
text-decoration: none;
}
.parent-link:hover { background-color: #555; }
/* 默认隐藏子菜单 */
.sub-nav {
position: absolute;
top: 100%;
left: 0;
background-color: #444;
min-width: 160px;
display: none; /* 关键:默认隐藏 */
z-index: 1000;
}
.sub-nav-list { list-style: none; margin: 0; padding: 0; }
.sub-nav-list li a {
display: block;
padding: 10px 15px;
color: #fff;
text-decoration: none;
white-space: nowrap; /* 防止换行 */
}
.sub-nav-list li a:hover { background-color: #555; }
/* 鼠标悬停在父栏目上时,显示子菜单 */
.nav-item:hover .sub-nav {
display: block;
}
第3步:生成并查看
保存模板文件和CSS文件后,到后台“生成” -> “更新HTML” -> “更新主页”,然后刷新网站首页,你就能看到一个带有下拉子菜单的主导航了。
常见问题与注意事项
-
Q: 为什么我的子栏目调用不出来?
- A: 最常见的原因是
{dede:channel}的属性写错了,请确保type='son'和noself='yes'都写上了,检查一下对应的父栏目在后台是否设置了“栏目属性”为“栏目列表”,并且有子栏目。
- A: 最常见的原因是
-
Q:
typeid和reid有什么区别?- A:
typeid是直接指定你要调用的栏目ID列表。reid是指定一个父栏目ID,channelartlist会调用这个父栏目下的所有同级栏目(也就是兄弟栏目)。typeid更常用、更直接。
- A:
-
Q: 如何实现当前栏目高亮?
- A: 这需要结合PHP判断,在
{channelartlist}循环中,判断当前栏目的typeid是否等于全局变量$GLOBALS['typeid'](当前页面的栏目ID),如果相等,就给li或a标签添加一个高亮CSS类(如class="current")。 - 示例:
{channelartlist} <li class="{if field:typeid == $GLOBALS['typeid']}current{/if}"> <a href="{field:typeurl/}">{field:typename/}</a> </li> {/channelartlist}
- A: 这需要结合PHP判断,在
-
Q: 性能问题?
- A:
channelartlist涉及数据库查询,如果栏目非常多,可能会影响页面加载速度,建议开启缓存功能,使用cacheid='nav'和cache='yes',并设置一个合理的缓存时间。
- A:
希望这份详细的解析能帮助你完全掌握 channelartlist 的使用!
