联动类别是 DedeCMS 中一个非常实用的功能,常用于实现地区选择、职位选择、品牌筛选等具有层级关系的数据调用,它通过一个“频道模型”来组织数据,前端通过 JavaScript 实现联动效果。

(图片来源网络,侵删)
联动标签的基本结构
联动标签的基本结构是 {dede:infoguide},它本身是一个单标签,需要配合其他属性来使用。
基本语法:
{dede:infoguide typeid='0' channelid='1' style='select'}
核心属性详解
理解每个属性的含义是灵活调用联动标签的关键。
| 属性名 | 含义 | 可选值 | 说明 |
|---|---|---|---|
typeid |
指定要调用的联动类别ID | 数字 | 这是最核心的属性,如果你想在首页调用“地区”联动,而“地区”联动模型的ID是 5,那么这里就填 5,如果不填,默认为 0,会调用系统默认的第一个联动类别。 |
channelid |
指定联动类别所在的频道模型ID | 数字 | 联动类别是依附于频道模型的,你需要知道你的联动类别是在哪个模型下创建的,如果你在“文章模型”下创建了“地区”联动,而“文章模型”的ID是 1,那么这里就填 1,如果不确定,可以不填,系统会自动查找。 |
style |
指定显示的样式 | select, text, hidden |
- select: 以下拉选择框的形式显示(最常用)。- text: 以文本输入框的形式显示,通常配合一个触发按钮使用。- hidden: 以隐藏域的形式显示,通常用于后台提交表单时使用。 |
fieldname |
为表单元素指定一个名称 | 字符串 | 当你在表单中使用联动标签时,这个属性是必需的,用于后台接收数据。name="province",如果不指定,默认为 infoguide。 |
autooption |
是否显示“请选择”等提示选项 | yes, no |
- yes: 在下拉框的顶部添加一个默认选项,如“请选择”、“不限”等。- no: 不添加默认选项。 |
limit |
限制输出的选项数量 | 数字 | limit='10',只显示前10个选项。 |
changefn |
指定选项改变时执行的JavaScript函数 | 函数名 | 当联动层级发生变化时(如选择了“省份”),可以调用一个自定义的JS函数来执行后续操作,比如加载城市列表,这个是实现级联效果的关键。 |
实战调用示例
假设我们要做一个常见的“省-市-区”三级联动选择。

(图片来源网络,侵删)
第1步:后台准备
-
创建联动类别:
- 进入 DedeCMS 后台 -> 核心 -> 频道模型 -> 联动类别 -> 增加联动类别。
- 类别名称:填写
地区。 - 类别表单:选择
select。 - :这是关键!你需要按照 DedeCMS 规定的格式填写,格式为:
父ID,名称;。-1代表顶级。- 顶级(省):
-1,省份; - 二级(市):
0,北京市;0,上海市;0,广东省;(这里的0表示它们是顶级“省份”下的子项) - 三级(区):
1,海淀区;1,朝阳区;(这里的1是“北京市”的ID,你需要根据实际ID填写)
- 顶级(省):
- 保存,记下这个联动类别的 ID(假设为
5)。
-
创建表单模板:
- 进入后台 -> 模板 -> 自定义宏标记 -> 增加一个自定义宏。
- 宏名称:填写
my_area(方便调用)。 - 类型:选择
标记调用。 - :这里填写完整的联动标签代码。
- 保存。
第2步:前台模板调用
现在我们可以在任何模板文件(如 index.htm, article_add.htm 等)中调用这个宏标记。
示例1:调用一个简单的省市级联联动

(图片来源网络,侵删)
假设我们只需要“省份”和“城市”两级联动。
<!-- 省份选择框 -->
{dede:infoguide typeid='5' style='select' autooption='yes' fieldname='province' changefn='loadCity(this.value)'}
代码解析:
typeid='5':调用我们刚才创建的ID为5的“地区”联动。style='select':以下拉框显示。autooption='yes':顶部显示“请选择”。fieldname='province':表单元素名为province,方便PHP接收$_POST['province']。changefn='loadCity(this.value)':当省份选择改变时,执行loadCity函数,并把当前选中的省份ID作为参数传入。
示例2:完整的省-市-区三级联动
这需要结合 JavaScript 来实现,在模板文件中,你需要把HTML和JS代码放在一起。
<!-- 在模板文件中,index.htm 的 <body> 标签内 -->
<h3>请选择您的地区:</h3>
<!-- 省份选择 -->
<p>
<label>省份:</label>
{dede:infoguide typeid='5' style='select' autooption='yes' fieldname='province' changefn='loadCity(this.value)'}
</p>
<!-- 城市选择 (初始为空,由JS动态填充) -->
<p>
<label>城市:</label>
<select name='city' id='city'>
<option value='0'>请选择</option>
</select>
</p>
<!-- 区县选择 (初始为空,由JS动态填充) -->
<p>
<label>区县:</label>
<select name='area' id='area'>
<option value='0'>请选择</option>
</select>
</p>
<!-- 将以下JS代码放在模板文件的底部,或引入外部JS文件 -->
<script type="text/javascript">
// 加载城市列表
function loadCity(provinceId) {
// 清空城市和区县的下拉框
document.getElementById('city').length = 1;
document.getElementById('area').length = 1;
// 如果省份ID有效,则加载对应的城市
if (provinceId > 0) {
// 使用DedeCMS自带的JS函数,参数为联动ID和父ID
// 第一个参数是联动类别的ID (5)
// 第二个参数是选中的省份ID
GetSonSelectOption(5, provinceId, 'city');
}
}
// 当城市选择改变时,加载区县列表
// 注意:这里需要给城市选择框绑定onchange事件
// 我们可以通过在HTML中写JS来绑定,或者修改上面的JS
// 为了简单,我们直接修改上面的JS函数,并在其中调用
// GetSonSelectOption(5, cityId, 'area');
// 修改后的loadCity函数示例:
function loadCity(provinceId) {
var citySelect = document.getElementById('city');
var areaSelect = document.getElementById('area');
// 清空
citySelect.length = 1;
areaSelect.length = 1;
if (provinceId > 0) {
// 加载城市
GetSonSelectOption(5, provinceId, 'city');
// 监听城市选择变化
citySelect.onchange = function() {
var cityId = this.value;
if (cityId > 0) {
GetSonSelectOption(5, cityId, 'area');
} else {
areaSelect.length = 1;
}
};
}
}
</script>
JS函数 GetSonSelectOption 说明:
这是 DedeCMS 内置的一个核心JS函数,用于获取联动类别的子级选项。
- 参数1:联动类别的
ID(这里是5)。 - 参数2:父级项目的
ID(选中的省份的ID)。 - 参数3:要填充的下拉框的
ID('city'或'area')。
常见问题与注意事项
- typeid 和 channelid 混淆:这是最常见的错误。
typeid是联动类别本身的ID,channelid是它所属的频道模型的ID,通常情况下,你只需要正确设置typeid即可。 - 联动类别内容格式错误:后台填写联动类别内容时,务必严格按照
父ID,名称;的格式,并且ID必须是数字,ID之间用英文逗号分隔,每组之间用英文分号结尾。 - JS 函数未定义:如果使用了
changefn,请确保对应的JS函数(如loadCity)在页面中已经定义,并且函数名拼写正确。 - 数据提交问题:在表单中使用联动标签时,确保
fieldname的值与后台处理程序中接收的变量名一致($_POST['province'])。 - 性能考虑:联动标签通常通过AJAX或JS动态加载数据,对服务器性能有一定影响,对于数据量非常大的联动(如全球国家城市),可以考虑优化数据结构或使用静态JSON数据。
通过以上步骤和示例,你应该能够熟练地在 DedeCMS 中调用和使用联动标签了。
