使用 channel 标签(最常用、最灵活)
channel 标签是织梦调用栏目的核心标签,功能非常强大,可以轻松实现调用顶级栏目的需求。
场景1:只调用顶级栏目,不包含子栏目
这是最基本的需求,通常用于网站主导航。
标签代码:
{dede:channel type='top' row='8'}
<a href="[field:typelink/]">[field:typename/]</a>
{/dede:channel}
代码解析:
{dede:channel ...}:这是调用栏目的开始和结束标签。type='top':这是最关键的参数,它指定了只调用顶级栏目。row='8':表示调用8个栏目,如果不设置,默认调用所有顶级栏目。[field:typelink/]:字段标签,表示获取栏目的链接地址。[field:typename/]:字段标签,表示获取栏目的名称。
场景2:调用顶级栏目,并高亮当前栏目
在导航菜单中,我们通常希望当前所在的栏目能够高亮显示(改变颜色或加粗),织梦的 channel 标签通过 currentstyle 参数可以轻松实现。
标签代码:
{dede:channel type='top' row='8' currentstyle="<li class='active'><a href='~typelink~'>~typename~</a></li>"}
<li><a href="[field:typelink/]">[field:typename/]</a></li>
{/dede:channel}
代码解析:
currentstyle='...':这个参数用于定义当前栏目的HTML样式。~typelink~:是[field:typelink/]的简写形式。~typename~:是[field:typename/]的简写形式。- 当用户访问某个顶级栏目时,该栏目对应的
<li>会被替换成currentstyle中定义的<li class='active'>...</li>。
- 默认样式
<li><a href="[field:typelink/]">[field:typename/]</a></li>用于非当前栏目。
使用 channelartlist 标签(带下拉菜单的导航)
如果你的顶级栏目下有子栏目,并且希望实现鼠标悬停时显示子菜单的效果,channelartlist 是最佳选择,它会先循环顶级栏目,然后在每个顶级栏目内循环其子栏目。
标签代码:
<ul id="nav">
{dede:channelartlist typeid='top' row='8'}
<li>
<a href="{dede:field name='typeurl'/}">{dede:field name='typename'/}</a>
{dede:channel type='son' noself='yes'}
<a href="[field:typelink/]">[field:typename/]</a>
{/dede:channel}
</li>
{/dede:channelartlist}
</ul>
代码解析:
-
外层循环
{dede:channelartlist ...}:typeid='top':指定只循环顶级栏目。row='8':循环8个顶级栏目。{dede:field name='typeurl'/}:获取当前顶级栏目的链接。{dede:field name='typename'/}:获取当前顶级栏目的名称。
-
内层循环
{dede:channel type='son' ...}:type='son':这个参数指定只调用当前顶级栏目下的子栏目。noself='yes':不包含栏目本身,只调用子栏目,通常用于下拉菜单,避免重复显示顶级栏目名。[field:typelink/]和[field:typename/]:这里调用的是子栏目的链接和名称。
CSS配合: 为了让子菜单在悬停时显示,你需要一些CSS样式:
#nav li {
position: relative;
float: left;
list-style: none;
}
#nav li a {
display: block;
padding: 10px;
text-decoration: none;
}
/* 默认隐藏子菜单 */
#nav li ul {
display: none;
position: absolute;
top: 100%;
left: 0;
background: #fff;
border: 1px solid #ccc;
}
/* 鼠标悬停在父级li上时,显示子菜单 */
#nav li:hover ul {
display: block;
}
使用SQL直接查询(适用于复杂场景)
当 channel 和 channelartlist 标签无法满足非常特殊的需求时(根据特定条件筛选顶级栏目),可以直接使用SQL语句查询。
标签代码:
{dede:sql sql='SELECT id, typename, typedir FROM `dede_arctype` WHERE reid=0 AND ishidden=0 ORDER BY sortrank ASC LIMIT 0, 10'}
<a href="[field:typedir function='str_replace("{cmspath}", "", "@me")'/]">[field:typename/]</a>
{/dede:sql}
代码解析:
{dede:sql sql='...'}:执行自定义SQL查询的标签。SELECT id, typename, typedir FROM ...:查询dede_arctype表(栏目表)的id、typename(栏目名)、typedir(栏目目录)字段。WHERE reid=0:这是关键条件,reid字段为0表示该栏目是顶级栏目。AND ishidden=0:可选条件,ishidden为0表示不隐藏的栏目。ORDER BY sortrank ASC:按sortrank(栏目排序)升序排列。LIMIT 0, 10:限制查询结果为10条。[field:typedir function='str_replace("{cmspath}", "", "@me")'/]:由于typedir字段的值可能包含{cmspath}(网站根目录路径),我们需要用function函数将其替换掉,得到正确的URL。{cmspath}/a/会变成/a/。
总结与对比
| 方法 | 适用场景 | 优点 | 缺点 |
|---|---|---|---|
channel |
简单的顶级栏目列表、主导航、带高亮效果 | 代码简洁、性能好、官方支持 | 功能相对固定,不适合复杂嵌套 |
channelartlist |
带下拉菜单的多级导航 | 结构清晰,能完美处理“父栏目 -> 子栏目”的嵌套结构 | 代码稍复杂,主要用于导航 |
sql 直接查询 |
需要根据特定条件筛选、排序或获取其他额外字段 | 灵活性最高,可以完全控制查询逻辑 | 代码可读性差,有一定性能开销,不熟悉SQL不建议使用 |
推荐:
- 99% 的情况下,使用
channel 就足够了,特别是制作网站主导航。 - 如果需要下拉菜单,请使用
channelartlist- 除非有特殊需求,否则尽量避免直接使用SQL,以保持模板的简洁和可维护性。
希望这些详细的解释能帮助你更好地在织梦CMS中调用顶级栏目!
