- 发布/编辑时:选择文章要归属的栏目。
- 前端模板调用时:高亮显示当前所在的栏目,实现导航菜单的“选中”状态。
- 自定义表单或程序逻辑中:需要获取或判断某个栏目是否被选中。
下面我将分这三种最常见的情况,提供详细的解决方案。

发布/编辑时选择栏目
这是 DedeCMS 最基本的功能,当你发布一篇文章时,系统会自动提供一个栏目选择的下拉菜单。
如何操作:
- 登录 DedeCMS 后台。
- 进入「内容管理」 -> 「添加普通文章」 或 「编辑文档」。
- 在文章编辑页面的顶部,你会看到一个名为“选择主栏目”的下拉框。
- 点击下拉框,从所有你创建好的栏目中选择一个即可。
核心原理:
这个下拉框是通过表单元素 <select> 实现的,它的选项数据来自于 dede_arctype 数据表(栏目表),当你选择一个栏目并提交表单时,文章的 typeid 字段就会被设置为该栏目的 ID,从而建立了文章与栏目之间的关联。
前端模板中高亮显示“选中”的栏目(导航菜单)
这是最常见的需求,比如网站的顶部导航栏,当用户访问“产品中心”时,“产品中心”这一项需要高亮显示(比如改变颜色或背景)。

实现方法:
DedeCMS 提供了非常方便的模板标签来实现这个功能,最常用的是 示例代码(用于顶部导航): 在你的模板文件(通常是 代码解析: CSS 样式: 为了让高亮效果生效,你需要在 CSS 文件(如 如果你想在非导航的地方判断当前栏目,比如在文章页面的侧边栏显示“相关文章”并高亮其所属栏目,可以使用 示例代码(在文章详情页 代码解析: 如果你在开发自定义功能或修改核心文件时,需要在 PHP 代码中进行判断,方法也很直接。 核心原理: DedeCMS 在加载每个页面时,都会将当前栏目的信息存入一个全局数组 示例代码(在 PHP 文件中): 假设你在一个自定义的 PHP 文件里,需要判断当前栏目是否为 ID 为 5 的“产品中心”。 根据你的具体需求,选择最适合的方法即可,对于绝大多数前端模板开发的需求,使用 channel
使用
channel 标签(推荐)channel 标签可以递归地获取所有栏目,并且会自动给当前所在页面对应的栏目添加一个 current 类。templets/default/header.htm)中,加入以下代码:
<div id="nav">
<ul>
{dede:channel type='top' currentstyle="<li class='thisclass'><a href='~typelink~'>~typename~</a></li>"}
<li><a href='[field:typeurl/]'>[field:typename/]</a></li>
{/dede:channel}
</ul>
</div>
{dede:channel type='top' ...}:调用顶级栏目。
type='top':表示只调用顶级栏目,如果需要调用所有栏目(包括子栏目),可以去掉这个属性或设置为 。currentstyle="...":这是实现“选中”效果的核心,它的作用是:当循环的栏目是当前页面所在的栏目时,就使用这里的 HTML 代码来替换默认的 <li><a>...</a></li> 结构。~typelink~:会被替换为当前栏目的链接地址。~typename~:会被替换为当前栏目的名称。[field:typeurl/] 和 [field:typename/]:这是默认样式里使用的字段标签,作用和 ~typelink~、~typename~ 一样。style.css)中定义 .thisclass 的样式:/* 默认导航样式 */
#nav ul li {
float: left;
list-style: none;
padding: 10px 15px;
}
#nav ul li a {
color: #333;
text-decoration: none;
}
/* 选中/当前栏目的高亮样式 */
#nav ul li.thisclass {
background-color: #ff6600; /* 设置一个橙色背景 */
}
#nav ul li.thisclass a {
color: #fff; /* 文字颜色变为白色 */
}
使用
typeid 变量判断typeid 变量。article_article.htm 中):<div class="sidebar">
<h3>栏目列表</h3>
<ul>
{dede:channel type='top'}
<li>
<a href="[field:typeurl/]">[field:typename/]</a>
<!-- 判断当前循环的栏目ID是否等于文章所属的栏目ID -->
[field:ID runphp='yes']
if(@me == $typeid) {
@me = " <span class='active'>(当前)</span>";
} else {
@me = "";
}
[/field:ID]
</li>
{/dede:channel}
</ul>
</div>
$typeid:这是 DedeCMS 在文章详情页等页面中自动定义的一个全局变量,存储了当前页面内容所属的栏目 ID。[field:ID runphp='yes']:获取当前循环到的栏目的 ID,并使用 PHP 进行判断。if(@me == $typeid):如果当前栏目的 ID 等于文章所属的栏目 ID,就输出一个 <span> 标签表示“选中”状态。
在 PHP 代码中判断栏目是否被选中
$_arctype 中,同时当前栏目的 ID 也存入了全局变量 $typeid。<?php
// 引入 DedeCMS 的核心文件
// require_once(dirname(__FILE__)."/../include/common.inc.php");
// 1. 使用全局变量 $typeid (最常用)
if ($typeid == 5) {
echo "当前页面属于【产品中心】栏目!";
// 执行你的逻辑...
}
// 2. 使用全局数组 $_arctype (可以获取更多信息)
if (isset($_arctype) && is_array($_arctype)) {
if ($_arctype['id'] == 5) {
echo "当前页面属于【" . $_arctype['typename'] . "】栏目!";
// 执行你的逻辑...
}
}
// 3. 如果你想判断一个 *任意* 的栏目是否被选中(例如在表单中)
// 假设 $channel_id 是你想要判断的栏目ID
$channel_id = 10;
// 检查请求中是否有这个栏目的选中信息(比如来自复选框)
// 注意:这需要根据你的具体表单结构来写
if (isset($_POST['channel']) && is_array($_POST['channel']) && in_array($channel_id, $_POST['channel'])) {
echo "ID 为 {$channel_id} 的栏目被选中了!";
}
?>
场景
实现方法
核心要点
后台选择
通过下拉表单选择
提交表单,文章的
typeid 字段被赋值。
前端高亮
channel 标签的 currentstyle 属性自动为当前栏目添加
current 类,通过 CSS 控制样式。
PHP 判断
使用全局变量
$typeid 或数组 $_arctype在 PHP 逻辑中获取当前页面的栏目信息并进行判断。
channel 标签的 currentstyle 是最简单、最规范的方式。
