- 后台表单中调用:在发布或编辑内容的表单里,让用户可以选择联动类别。
- 前台页面列表中调用列表页、内容页等前台页面,显示已保存的联动类别信息。
下面我将分别对这两种情况进行详细说明。

准备工作:创建一个联动类别
在调用之前,你必须先在后台创建好一个联动类别,我们以创建一个“地区”联动类别为例。
- 登录 DedeCMS 后台。
- 进入 [核心] -> [联动类别管理]。
- 点击 [增加联动类别]。
- 类别名称:填写
地区。 - 类别表单名:填写
nativeplace(这个很重要,前台调用时会用到,建议使用英文小写)。 - 使用频道:选择你希望使用这个联动类别的模型(文章、软件等)。
- 分类项:在这里填写你的地区层级。
- 一级:北京, 上海, 广东, 四川
- 二级:北京->朝阳区, 北京->海淀区; 上海->浦东新区, 上海->黄浦区; 广东->广州市, 广东->深圳市; 四川->成都市, 四川->绵阳市
- 点击 [确定] 保存。
- 类别名称:填写
完成这一步后,你的数据库里就有了 dede_sys_enum 表,并插入了相关的联动类别数据。
在后台表单中调用联动类别
这是最常见的需求,比如在发布文章时,让作者选择文章的“地区”。
方法:使用 {dede:channel}
{dede:channel} 标签不仅可以调用栏目,也可以用来调用联动类别。
(图片来源网络,侵删)
模型中添加字段
你需要将这个联动类别添加到你使用的内容模型中。
- 进入 [核心] -> [内容模型管理],选择你正在使用的模型(文章模型”),点击 [字段管理]。
- 点击 [增加新字段]。
- 字段名称:
地区 (用于后台显示)
- 字段标识:
nativeplace (必须和后台创建联动类别时填写的“类别表单名”完全一致)
- 字段类型:选择
联动类型
- 后台相关参数:
- 联动类型:选择你刚刚创建的“地区”。
- 是否为必填项:根据需要选择。
- 点击 [保存]。
修改后台模板文件
你需要修改发布内容的模板,让这个新字段显示出来。
- 文章模型:模板文件是
/dede/templets/article_add.htm。
- 其他模型:路径类似,如
/dede/templets/software_add.htm。
打开对应的模板文件,找到你想插入联动类别的位置(通常是在 {dede:field.body/} 之前),然后添加以下代码:
<tr>
<td height="25" align="right">地区:</td>
<td>
{dede:channel type='self' function='GetEnums("nativeplace")'}
<select name='nativeplace' id='nativeplace'>
<option value='0'>请选择...</option>
{dede:field name='nativeplace'/}
</select>
<script language="javascript">
//联动菜单初始化
$(function(){
new DedeChannelSelect('nativeplace', 'nativeplace', 0);
});
</script>
</td>
</tr>
代码解释:
{dede:channel type='self' function='GetEnums("nativeplace")'} ... {/dede:channel}:这是核心标签,它会根据 nativeplace 这个标识,从数据库中读取所有层级的联动选项,并生成 <option>
<select name='nativeplace' ...>:标准的下拉选择框。name 属性必须和字段标识 nativeplace 一致,这样提交数据时才能正确保存。
<script language="javascript">...</script>:这段 JavaScript 是联动菜单能够实现“省-市-区”级联选择的关键,它调用了 DedeCMS 内置的 DedeChannelSelect 函数来初始化联动效果。
你再进入后台发布文章,就能看到“地区”的下拉选择框,并且可以多级联动选择了。
在前台页面调用已保存的联动类别
已经发布并保存了联动类别信息后,你想在前台列表页或内容页显示它。
使用 {dede:field} 标签直接输出(推荐)
这是最简单直接的方法,适用于只显示最终选择的值。
在列表页 (list_*.htm) 或内容页 (article_*.htm) 中:
<p>文章地区:{dede:field.nativeplace/}</p>
问题: 直接这样输出,得到的是一个类似 1,3,5 的枚举值,而不是“北京市 朝阳区”这样的可读文本。
解决方案:使用自定义函数或解析枚举值
DedeCMS 提供了一个函数 GetEnums() 来获取枚举的文本。
*在列表页 (`list_.htm`) 中调用:**
DedeCMS 的列表页标签 {dede:list} 本身不支持直接调用自定义函数,我们需要一个变通方法,通常是在内容页显示,或者通过修改列表页模板来实现。
更简单的方法是直接解析:
<p>文章地区:[field:function='GetEnums(@me, "nativeplace")'/]</p>
[field:...]:列表页字段调用标签。
@me:代表当前字段的值,也就是 nativeplace 的枚举值(如 1,3)。
GetEnums(@me, "nativeplace"):调用 GetEnums 函数,它会根据枚举值和类别名,查询出对应的文本(如 "北京市, 朝阳区")。
*页 (`article_.htm`) 中调用:**
页的调用更简单。
<p>文章地区:{dede:field.nativeplace function='GetEnums(@me, "nativeplace")'/}</p>
{dede:field.nativeplace}:获取 nativeplace 字段的值。
function='GetEnums(@me, "nativeplace")':对获取到的值应用 GetEnums 函数进行转换。
注意:GetEnums 函数默认会用逗号 分隔多个选项,如果你希望用其他分隔符(比如空格),可以修改 include/helpers/enumhelper.php 文件中的相关代码,或者自己写一个更复杂的小程序来处理。
使用 {dede:global} 标签(适用于特定情况)
如果你的联动类别只选择了一级(比如只选择了“广东省”),并且这个值被保存在某个特定变量里,你也可以尝试用 global 标签,但这种方法不常用且不稳定,不推荐。
总结与最佳实践
场景
核心标签/代码
说明
后台表单调用
{dede:channel type='self' function='GetEnums("nativeplace")'}
用于在发布内容时生成联动选择的下拉框,需要配合 JS 初始化。
页调用
{dede:field.nativeplace function='GetEnums(@me, "nativeplace")'/}
推荐方法,在文章内容页显示联动类别的可读文本。
前台列表页调用
[field:function='GetEnums(@me, "nativeplace")'/]
在文章列表页显示联动类别的可读文本。
关键点回顾:
- 标识一致性:后台创建联动类别时的“类别表单名”、后台添加字段时的“字段标识”、前台调用时使用的字段名(
nativeplace),这三者必须完全一致。
- 后台表单:核心是
{dede:channel} 标签和 DedeChannelSelect 的 JS 初始化。
- 前台显示:核心是
GetEnums() 函数,它能将枚举值(如 1,3)转换成人类可读的文本(如 "北京市, 朝阳区")。
希望这份详细的教程能帮助你成功地在 DedeCMS 中调用联动类别!
{dede:channel} 标签不仅可以调用栏目,也可以用来调用联动类别。

模型中添加字段
你需要将这个联动类别添加到你使用的内容模型中。
- 进入 [核心] -> [内容模型管理],选择你正在使用的模型(文章模型”),点击 [字段管理]。
- 点击 [增加新字段]。
- 字段名称:
地区(用于后台显示) - 字段标识:
nativeplace(必须和后台创建联动类别时填写的“类别表单名”完全一致) - 字段类型:选择
联动类型 - 后台相关参数:
- 联动类型:选择你刚刚创建的“地区”。
- 是否为必填项:根据需要选择。
- 点击 [保存]。
- 字段名称:
修改后台模板文件
你需要修改发布内容的模板,让这个新字段显示出来。
- 文章模型:模板文件是
/dede/templets/article_add.htm。 - 其他模型:路径类似,如
/dede/templets/software_add.htm。
打开对应的模板文件,找到你想插入联动类别的位置(通常是在 {dede:field.body/} 之前),然后添加以下代码:
<tr>
<td height="25" align="right">地区:</td>
<td>
{dede:channel type='self' function='GetEnums("nativeplace")'}
<select name='nativeplace' id='nativeplace'>
<option value='0'>请选择...</option>
{dede:field name='nativeplace'/}
</select>
<script language="javascript">
//联动菜单初始化
$(function(){
new DedeChannelSelect('nativeplace', 'nativeplace', 0);
});
</script>
</td>
</tr>
代码解释:
{dede:channel type='self' function='GetEnums("nativeplace")'} ... {/dede:channel}:这是核心标签,它会根据nativeplace这个标识,从数据库中读取所有层级的联动选项,并生成<option><select name='nativeplace' ...>:标准的下拉选择框。name属性必须和字段标识nativeplace一致,这样提交数据时才能正确保存。<script language="javascript">...</script>:这段 JavaScript 是联动菜单能够实现“省-市-区”级联选择的关键,它调用了 DedeCMS 内置的DedeChannelSelect函数来初始化联动效果。
你再进入后台发布文章,就能看到“地区”的下拉选择框,并且可以多级联动选择了。
在前台页面调用已保存的联动类别
已经发布并保存了联动类别信息后,你想在前台列表页或内容页显示它。
使用 {dede:field} 标签直接输出(推荐)
这是最简单直接的方法,适用于只显示最终选择的值。
在列表页 (list_*.htm) 或内容页 (article_*.htm) 中:
<p>文章地区:{dede:field.nativeplace/}</p>
问题: 直接这样输出,得到的是一个类似 1,3,5 的枚举值,而不是“北京市 朝阳区”这样的可读文本。
解决方案:使用自定义函数或解析枚举值
DedeCMS 提供了一个函数 GetEnums() 来获取枚举的文本。
*在列表页 (`list_.htm`) 中调用:**
DedeCMS 的列表页标签 {dede:list} 本身不支持直接调用自定义函数,我们需要一个变通方法,通常是在内容页显示,或者通过修改列表页模板来实现。
更简单的方法是直接解析:
<p>文章地区:[field:function='GetEnums(@me, "nativeplace")'/]</p>
[field:...]:列表页字段调用标签。@me:代表当前字段的值,也就是nativeplace的枚举值(如1,3)。GetEnums(@me, "nativeplace"):调用GetEnums函数,它会根据枚举值和类别名,查询出对应的文本(如 "北京市, 朝阳区")。
*页 (`article_.htm`) 中调用:** 页的调用更简单。
<p>文章地区:{dede:field.nativeplace function='GetEnums(@me, "nativeplace")'/}</p>
{dede:field.nativeplace}:获取nativeplace字段的值。function='GetEnums(@me, "nativeplace")':对获取到的值应用GetEnums函数进行转换。
注意:GetEnums 函数默认会用逗号 分隔多个选项,如果你希望用其他分隔符(比如空格),可以修改 include/helpers/enumhelper.php 文件中的相关代码,或者自己写一个更复杂的小程序来处理。
使用 {dede:global} 标签(适用于特定情况)
如果你的联动类别只选择了一级(比如只选择了“广东省”),并且这个值被保存在某个特定变量里,你也可以尝试用 global 标签,但这种方法不常用且不稳定,不推荐。
总结与最佳实践
| 场景 | 核心标签/代码 | 说明 |
|---|---|---|
| 后台表单调用 | {dede:channel type='self' function='GetEnums("nativeplace")'} |
用于在发布内容时生成联动选择的下拉框,需要配合 JS 初始化。 |
| 页调用 | {dede:field.nativeplace function='GetEnums(@me, "nativeplace")'/} |
推荐方法,在文章内容页显示联动类别的可读文本。 |
| 前台列表页调用 | [field:function='GetEnums(@me, "nativeplace")'/] |
在文章列表页显示联动类别的可读文本。 |
关键点回顾:
- 标识一致性:后台创建联动类别时的“类别表单名”、后台添加字段时的“字段标识”、前台调用时使用的字段名(
nativeplace),这三者必须完全一致。 - 后台表单:核心是
{dede:channel}标签和DedeChannelSelect的 JS 初始化。 - 前台显示:核心是
GetEnums()函数,它能将枚举值(如1,3)转换成人类可读的文本(如 "北京市, 朝阳区")。
希望这份详细的教程能帮助你成功地在 DedeCMS 中调用联动类别!
