dede:channel
dede:channel 标签主要用于获取网站栏目的列表,其基本语法如下:

{dede:channel type='top' row='8'}
<a href='[field:typeurl/]'>[field:typename/]</a>
{/dede:channel}
常用属性:
-
typeid:指定栏目的ID。typeid='top':获取顶级栏目列表。typeid='son':获取当前栏目的子栏目列表。typeid='self':获取当前栏目本身(不常用)。typeid='指定ID':获取指定ID的栏目及其子栏目(如typeid='2,3')。
-
row:获取的栏目数量。 -
type:指定栏目的类型(通常与typeid配合使用,如type='son')。 -
currentstyle:这是实现判断的关键属性! 它用于为当前栏目所在的链接指定一个特殊的样式。
(图片来源网络,侵删)
最常用的判断:高亮当前栏目
这是 dede:channel 最核心的判断功能,通常用于主导航或子导航,让用户知道自己当前在哪个栏目下。
currentstyle 语法
currentstyle 属性的值是一个包含特殊标记 [field:typelink/] 的 HTML 字符串。[field:typelink/] 会被替换为当前栏目的完整链接。
示例:主导航高亮
假设我们有以下顶级栏目:首页、产品中心、新闻动态、关于我们。

{dede:channel type='top' currentstyle="<li class='active'><a href='~typelink~'>~typename~</a></li>"}
<li><a href="[field:typeurl/]">[field:typename/]</a></li>
{/dede:channel}
工作原理:
- 当页面是“首页”时,
{dede:channel}会遍历所有顶级栏目。 - 当遍历到“首页”这个栏目时,系统会判断它就是当前栏目。
- 它不会使用默认的
<li><a href="[field:typeurl/]">[field:typename/]</a></li>模板。 - 而是使用
currentstyle中定义的模板:<li class='active'><a href='~typelink~'>~typename~</a></li>。 - 在这个模板中,
~typelink~和~typename~会被自动替换为“首页”的链接和名称。 - 最终生成的 HTML
<li class='active'><a href='/index.html'>首页</a></li>。 - 对于其他非当前栏目(如“产品中心”),则正常使用默认模板,生成:
<li><a href='/product/'>产品中心</a></li>。
CSS 配合:
你可以在 CSS 中为 .active 类定义样式,
/* 导航默认样式 */
.nav li a {
display: block;
padding: 10px 15px;
color: #333;
text-decoration: none;
}
/* 当前栏目高亮样式 */
.nav li.active a {
background-color: #007bff;
color: #fff;
}
更复杂的判断:使用 if 条件语句
当 currentstyle 无法满足需求时(你想给父栏目和子栏目不同的样式),可以在模板中使用 PHP 的 if 判断语句。
判断当前栏目是否为指定栏目
使用 global $typeid; 获取当前栏目的 ID,然后进行判断。
示例:只在“关于我们”栏目显示特定内容
{dede:field name='typeid' runphp='yes'}
$typeid = @me;
if($typeid == 3) { // 假设“关于我们”的ID是3
@me = "<div class='special-content'>这是关于我们的特定内容。</div>";
} else {
@me = ""; // 其他栏目不显示
}
{/dede:field}
<!-- 或者更简洁的写法 -->
{dede:field name='typeid' runphp='yes'}
if(@me == 3) {
echo "<div class='special-content'>这是关于我们的特定内容。</div>";
}
{/dede:field}
判断当前栏目是否为某个栏目的子栏目
可以使用 GetTopid() 函数,该函数能获取当前栏目所属的顶级栏目ID。
示例:如果当前栏目属于“产品中心”(顶级ID为2),则显示产品筛选栏
{dede:field name='typeid' runphp='yes'}
$topid = GetTopid(@me); // 获取当前栏目的顶级栏目ID
if($topid == 2) { // 假设“产品中心”的顶级ID是2
echo "
<div class='product-filter'>
<a href='javascript:;'>全部</a>
<a href='/product/list_1.html'>类别一</a>
<a href='/product/list_2.html'>类别二</a>
</div>
";
}
{/dede:field}
在 dede:channel 循环内进行判断
如果你想在栏目列表循环中,对每个栏目进行更精细的控制,可以在循环内使用 if 语句。
示例:给第一个栏目添加特殊的 CSS 类
<ul class="channel-list">
{dede:channel type='top' row='8'}
{dede:global name='itemindex' runphp='yes'}
@me = @me + 1; // 自增计数器
{/dede:global}
{dede:field name='id' runphp='yes'}
$is_first = (@me == 1) ? 'first-item' : '';
echo $is_first;
{/dede:field}
<li class="[field:id runphp='yes']if(@me==1)@me='first-item';else @me='';[/field:id]">
<a href="[field:typeurl/]">[field:typename/]</a>
</li>
{/dede:channel}
</ul>
上面的例子有点复杂,一个更简单的方法是使用全局变量 itemindex:
<ul class="channel-list">
{dede:channel type='top' row='8'}
<li class="{dede:global name='itemindex' runphp='yes'}if(@me==1)@me='first-item';else @me='';{/dede:global}">
<a href="[field:typeurl/]">[field:typename/]</a>
</li>
{/dede:channel}
</ul>
判断栏目类型(封面、列表、文档)
有时候你需要根据栏目的类型(在后台“栏目管理”->“高级选项”->“栏目类型”中设置)来决定模板的显示方式。
示例:封面栏目显示一个图片,列表栏目显示文章列表
{dede:field name='channeltype' runphp='yes'}
if(@me == 1) { // 1代表封面栏目
echo "
<div class='cover-channel'>
<h2>[field:typename/]</h2>
<p>这里是封面栏目的内容</p>
</div>
";
} elseif(@me == 2) { // 2代表列表栏目
echo "
<div class='list-channel'>
<h2>[field:typename/]</h2>
{dede:arclist titlelen='30' row='5'}
<li><a href="[field:arcurl/]">[field:title/]</a></li>
{/dede:arclist}
</div>
";
}
{/dede:field}
总结与最佳实践
| 判断需求 | 推荐方法 | 示例 |
|---|---|---|
| 高亮当前导航栏目标题 | currentstyle 属性 |
{dede:channel currentstyle="<li class='active'>[field:typename/]</li>"} |
| 在页面某处根据栏目ID显示特定内容 | {dede:field name='typeid' runphp='yes'} |
if(@me == 3) echo "内容"; |
| 判断当前栏目是否属于某个父栏目 | GetTopid() 函数 |
$topid = GetTopid(@me); if($topid == 2) ... |
| 根据栏目类型(封面/列表)显示不同内容 | {dede:field name='channeltype' runphp='yes'} |
if(@me == 1) echo "封面内容"; |
| 在循环中给特定项添加样式 | {dede:global name='itemindex'} |
<li class="{if itemindex==1}first{/if}"> |
核心要点:
currentstyle是首选:用于导航栏目标签的高亮,简洁高效。runphp='yes'是万能钥匙:当需要复杂逻辑时,用它来执行 PHP 代码。- 全局变量很强大:
typeid(当前ID)、itemindex(循环索引)、typename(栏目名)等都非常常用。 - 函数是利器:
GetTopid()、GetTypeid()等函数能帮你获取更层级关系的ID。
希望这份详细的指南能帮助你完全掌握 DedeCMS 的栏目判断功能!
