联动类别是织梦一个非常实用的功能,常用于地区选择、品牌选择、职位分类等具有层级关系的字段,调用它主要分为两种情况:

- 在后台表单中调用发布时让用户选择。
- 在前台页面中调用:用于展示已选择的联动类别信息,或者制作一个筛选表单。
下面我们分别对这两种情况进行详细说明。
发布表单中调用联动类别
这是联动类别最常见的用途,当你在后台添加或编辑文章时,让作者可以从一个下拉菜单中选择联动分类。
步骤 1:在后台创建联动类别
- 登录织梦后台,进入【核心】 -> 【联动类型管理】。
- 点击【增加联动类型】。
- 填写基本信息:
- 类型名称:给你的联动类别起个名字,"所在地区"。
- 类型目录:英文名称或拼音,
district,这个很重要,会在调用时用到。 - 项目名称:默认项的名称,"请选择..."。
- 是否开启:选择 "是"。
- 父类选项:选择 "无"。
- 是否启用多选:根据需要选择,通常地区选择是单选。
- 添加子项:
- 点击你刚创建的类型名称(如 "所在地区"),进入项目编辑页面。
- 你可以像管理栏目一样,添加层级关系。
- 一级:广东省
- 二级:广州市, 深圳市, 东莞市...
- 三级:天河区, 越秀区... (对应广州市)
- 保存所有设置。
步骤 2:在模型中添加联动类别字段
- 进入【核心】 -> 【内容模型管理】,选择你要修改的模型("文章模型"),点击【字段管理】。
- 点击【增加新字段】。
- 填写字段信息:
- 字段名称:
district(必须和你上面设置的“类型目录”完全一致)。 - 字段提示文字:在后台表单中显示的提示文字,"请选择所在地区"。
- 字段类型:务必选择 "联动类型"。
- 联动类型:从下拉菜单中选择你刚刚创建的 "所在地区"。
- 是否显示:选择 "是"。
- 前台表单调用:选择 "是"。
- 其他选项:根据需要设置,比如是否必填等。
- 字段名称:
- 保存字段。
步骤 3:在前台发布表单中调用
织梦默认会自动识别模型中的联动类型字段并生成表单,你无需手动写代码,只需要确保你使用的模板文件(通常是 article_add.htm 和 article_edit.htm)包含了默认的表单标签 {dede:field name='body'/} 和 {dede:field name='body2'/}。
如果你想在自定义模板中手动调用它,可以使用以下标签:

{dede:global.name='district'/}
district 就是你设置的“字段名称”/“类型目录”。
效果:当你发布文章时,就会看到一个可以逐级选择的联动下拉菜单。
在前台页面中调用联动类别
前台调用也分为两种:展示已保存的数据 和 制作一个独立的筛选表单。
展示文章中已保存的联动类别信息
假设你已经用上面的方法,发布了一篇文章,并且选择了 "广东省 > 广州市 > 天河区",现在想在文章详情页或列表页显示这个地区。
使用默认字段(推荐)
织梦会自动为联动类别生成一个默认的显示字段,字段名通常是 联动类型目录 + 'link'。
你的联动类型目录是 district,那么显示字段就是 districtlink。
在文章详情页模板 article_article.htm 中,你可以这样调用:
<p>发布地区:{dede:field name='districtlink'/}</p>
输出效果:广东省 > 广州市 > 天河区
手动获取各级ID并显示(更灵活)
如果你想分别获取每一级的ID或名称,可以使用 GetInfos 函数。
假设你的联动类型目录是 district,并且你在模型中只保存了最终的ID(这是默认行为)。
在模板文件中,使用如下代码:
{dede:field name='district' function='GetInfos(@me, "district")'/}
代码解释:
{dede:field name='district'}:获取当前文章中district字段的值(即最终选择的项的ID)。function='GetInfos(@me, "district")':这是一个自定义函数。@me:代表当前字段的值(那个ID)。"district":代表你要查询的联动类型的“类型目录”。
这个函数会返回一个包含所有层级信息的数组,为了显示完整的路径,通常需要结合PHP代码片段来实现,一个更完整的写法如下(在织梦V5.7及更高版本中,推荐使用channelartlist标签或直接写PHP):
<?php
// 在模板中直接嵌入PHP代码
$field_value = $arcRow['district']; // 获取字段值
if($field_value > 0){
$infos = GetInfos($field_value, 'district');
$linktext = '';
foreach($infos as $info){
$linktext .= $info['typename'] . ' > ';
}
echo rtrim($linktext, ' > '); // 输出:广东省 > 广州市 > 天河区
}
?>
注意:直接在模板中写PHP需要确保你的服务器环境支持,并且模板文件有执行PHP的权限(通常后端设置中开启)。
制作一个独立的联动筛选表单
这个功能常用于搜索或筛选,按地区筛选文章”,这需要结合JS和Ajax来实现。
步骤 1:准备模板文件
在你的列表页模板(list_article.htm)中,添加以下HTML结构,我们以“所在地区”为例,类型目录为 district。
<div class="filter-area">
<form name="selectform" action="/plus/search.php" method="get">
<span id="district_area">
<!-- 第一级联动将通过JS动态加载 -->
<select name="district" id="district" onchange="changeDistrict(this.value)">
<option value='0'>请选择省份</option>
{dede:channelartlist typeid='0'}
{dede:sql sql="SELECT * FROM `dede_sys_enum` where egroup='district' and evalue > 0 ORDER BY disorder ASC, evalue ASC"}
<option value='[field:evalue/]'>[field:typename/]</option>
{/dede:sql}
{/dede:channelartlist}
</select>
</span>
<!-- 第二级联动将在这里动态插入 -->
<span id="district_son"></span>
<!-- 第三级联动将在这里动态插入 -->
<span id="district_grandson"></span>
<button type="submit">筛选</button>
</form>
</div>
步骤 2:编写JavaScript和Ajax
在模板文件的 <head> 标签内或底部,加入以下JS代码,这些代码负责当用户选择上一级时,通过Ajax请求下一级的数据并填充到下拉框中。
<script language="javascript" type="text/javascript">
// Ajax请求联动子类的函数
function changeDistrict(id) {
// 清空下级联动菜单
document.getElementById('district_son').innerHTML = '';
document.getElementById('district_grandson').innerHTML = '';
if (id == 0) return;
// 创建Ajax对象
var ajax = null;
if (window.XMLHttpRequest) {
ajax = new XMLHttpRequest();
} else if (window.ActiveXObject) {
ajax = new ActiveXObject("Microsoft.XMLHTTP");
}
if (ajax) {
// 发送请求到plus目录下的一个专门处理联动的文件
ajax.open("GET", "/plus/diy.php?action=list&diyid=你的联动类型ID&pid=" + id, true);
ajax.onreadystatechange = function() {
if (ajax.readyState == 4 && ajax.status == 200) {
// 将返回的HTML插入到span标签中
document.getElementById('district_son').innerHTML = ajax.responseText;
}
};
ajax.send(null);
}
}
// 同上,用于第三级联动
function changeDistrictSon(id) {
document.getElementById('district_grandson').innerHTML = '';
if (id == 0) return;
var ajax = null;
// ... (同上创建Ajax对象的代码) ...
if (ajax) {
ajax.open("GET", "/plus/diy.php?action=list&diyid=你的联动类型ID&pid=" + id, true);
ajax.onreadystatechange = function() {
if (ajax.readyState == 4 && ajax.status == 200) {
document.getElementById('district_grandson').innerHTML = ajax.responseText;
}
};
ajax.send(null);
}
}
</script>
重要提示:
diyid=你的联动类型ID:你需要去数据库dede_sys_enum表中找到你的联动类型(如 'district')对应的id值,替换掉代码中的你的联动类型ID。- 更简单的做法:织梦官方或很多模板已经封装好了联动调用的JS,你只需要在后台找到对应的JS文件(如
js/selectjs.js),并在模板中引入它,然后使用特定的类名或ID来绑定即可,这比手写Ajax要简单得多,请查阅你所使用的织梦版本的文档,寻找 "联动菜单JS调用" 的相关说明。
| 调用场景 | 关键点 | 核心代码/标签 |
|---|---|---|
| 后台表单 | 创建联动类型(记下类型目录) 在模型中添加“联动类型”字段(字段名=类型目录) |
{dede:global.name='你的类型目录'/} (通常自动生成) |
| 前台展示 | 使用默认的 link 后缀字段 |
{dede:field name='你的类型目录link'/} |
| 前台展示 | 手动获取各级信息 | {dede:field name='你的类型目录' function='GetInfos(@me, "你的类型目录")'/} 或结合PHP |
| 前台筛选表单 | 准备HTML结构 编写JS/Ajax实现级联 |
HTML结构 + <script> 中的 changeDistrict() 函数 |
希望这份详细的指南能帮助你完全掌握织梦联动标签的调用方法!
