{dede:channel} 标签主要用于获取网站栏目的列表信息,通常用于制作网站的导航栏、侧边栏的栏目列表、面包屑导航等。
基础语法
{dede:channel} 标签的基本语法如下:
{dede:channel}
<a href="[field:typelink/]">[field:typename/]</a>
{/dede:channel}
{dede:channel}和{/dede:channel}是标签的开始和结束。[field:typelink/]是一个字段,表示栏目的链接地址。[field:typename/]是一个字段,表示栏目的名称。
最简单的应用示例(制作主导航):
假设你的网站有几个顶级栏目,你想把它们显示在网站顶部,可以这样写:
<div class="main-nav">
<ul>
{dede:channel type='top'}
<li><a href="[field:typelink/]" title="[field:typename/]">[field:typename/]</a></li>
{/dede:channel}
</ul>
</div>
核心属性详解
{dede:channel} 的强大之处在于它的各种属性,通过组合这些属性可以实现不同的调用效果。
type - 栏目类型(最常用)
top: 调用顶级栏目,这是默认值,会获取所有没有被其他栏目包含的一级栏目。son: 调用当前栏目的子栏目,必须在使用此标签的页面中指定当前栏目ID(通过typeid属性),否则调用失败。self: 调用当前栏目及其所有子栏目,同样需要指定typeid。sun: 调用指定栏目ID下的所有子栏目(多级)。
示例:
-
调用顶级栏目(主导航)
{dede:channel type='top'} <a href="[field:typelink/]">[field:typename/]</a> {/dede:channel} -
调用指定栏目ID为3的子栏目(产品分类的子分类)
{dede:channel type='son' typeid='3'} <a href="[field:typelink/]">[field:typename/]</a> {/dede:channel}
typeid - 指定栏目ID
这个属性用于指定要操作的栏目,当 type 为 son 或 self 时,typeid 是必须的,你也可以用它来指定一个或多个顶级栏目(用逗号隔开),type 属性可以省略。
示例:
- 只调用栏目ID为2和5的栏目
{dede:channel typeid='2,5'} <a href="[field:typelink/]">[field:typename/]</a> {/dede:channel}
row - 调用栏目数量
指定要调用的栏目数量,默认为调用所有符合条件的栏目。
示例:
- 只调用前5个顶级栏目
{dede:channel type='top' row='5'} <a href="[field:typelink/]">[field:typename/]</a> {/dede:channel}
currentstyle - 当前栏目样式
这是一个非常实用的属性,用于高亮显示当前所在的栏目,当用户访问某个栏目页面时,这个栏目对应的链接会应用你指定的样式。
语法: currentstyle='<a href="[field:typelink/]" class="active">[field:typename/]</a>'
示例:
{dede:channel type='top' currentstyle="<a href='[field:typelink/]' class='active'>[field:typename/]</a>"}
<a href="[field:typelink/]">[field:typename/]</a>
{/dede:channel}
工作原理:
- 当访问首页时,
{dede:channel}会正常输出所有顶级栏目。 - 当你点击并进入“关于我们”栏目页面时,
{dede:channel}会自动检测到当前栏目是“关于我们”,然后输出currentstyle中定义的代码,即<a href="..." class="active">关于我们</a>,而其他栏目则输出普通的<a>
常用字段列表
在标签内部,[field:xxx/] 用于输出栏目的各种信息。
| 字段名 | 说明 | 示例 |
|---|---|---|
typename |
栏目名称 | [field:typename/] |
typelink |
栏目链接 | [field:typelink/] |
id |
栏目ID | [field:id/] |
description |
栏目描述 | [field:description/] |
seotitle |
栏目SEO标题 | [field:seotitle/] |
keywords |
栏目关键词 | [field:keywords/] |
content |
栏目介绍(内容) | [field:content/] |
typedir |
栏目目录(路径) | [field:typedir/] |
litpic |
栏目缩略图 | <img src="[field:litpic/]" alt="[field:typename/]"> |
综合实例
实例1:带缩略图和描述的侧边栏栏目列表
假设我们要在侧边栏调用一个栏目(ID为4)下的所有子栏目,并显示每个子栏目的缩略图、名称和描述。
<div class="sidebar-category">
<h3>产品分类</h3>
<ul>
{dede:channel type='son' typeid='4'}
<li>
<a href="[field:typelink/]">
<img src="[field:litpic/]" alt="[field:typename/]" />
<h4>[field:typename/]</h4>
<p>[field:description function='cn_substr(@me, 50)'/]</p>
</a>
</li>
{/dede:channel}
</ul>
</div>
说明:
typeid='4'指定了父栏目ID。type='son'调用其子栏目。[field:litpic/]调用栏目缩略图。[field:description function='cn_substr(@me, 50)'/]调用栏目描述,并用cn_substr函数截取前50个字符,防止过长。
实例2:面包屑导航
面包屑导航通常使用 {dede:field name='position' /} 标签,但它的原理也是基于 {dede:channel},如果你想自定义面包屑的样式,可以这样做:
<div class="breadcrumb">
<a href="/">首页</a>
{dede:field name='position' runphp='yes'}
// 这是一个更高级的用法,通过PHP代码来处理面包屑字符串
// 将 > 替换为 /
$aaa = str_replace(' >', ' / ', @me);
@me = $aaa;
{/dede:field}
</div>
对于面包屑,直接使用 {dede:field name='position' /} 是最简单直接的方法。
常见问题与注意事项
-
为什么调不出来子栏目?
- 原因:最常见的原因是忘记指定
typeid属性,当type='son'或type='self'时,系统必须知道是哪个栏目的子栏目,typeid是必需的。 - 解决:确保在标签中写上了正确的栏目ID,
typeid='5'。
- 原因:最常见的原因是忘记指定
-
currentstyle不生效?- 原因:通常是因为
typeid和type的组合不正确,你在顶级栏目页面(首页)调用,但typeid指定的是二级栏目,currentstyle就无法正确匹配。 - 解决:确保
currentstyle的使用场景正确,通常用于调用顶级栏目 (type='top') 来高亮主导航。
- 原因:通常是因为
-
栏目链接打不开,显示404?
- 原因:DedeCMS 的栏目链接有两种形式:动态链接(如
plus/list.php?tid=1)和静态链接(如category/1.html),如果你的网站开启了伪静态,但栏目内容页没有生成对应的静态HTML文件,就会导致404。 - 解决:进入后台“生成” -> “一键更新网站” -> “更新栏目HTML”,重新生成所有栏目页。
- 原因:DedeCMS 的栏目链接有两种形式:动态链接(如
希望这份详细的教程能帮助你完全掌握 {dede:channel} 标签的使用!
