dede联动类别调用如何实现?

99ANYc3cd6
预计阅读时长 15 分钟
位置: 首页 DEDE建站 正文
  1. 后台表单中调用:在发布或编辑内容的表单里,让用户可以选择联动类别。
  2. 前台页面列表中调用列表页、内容页等前台页面,显示已保存的联动类别信息。

下面我将分别对这两种情况进行详细说明。

dede 联动类别调用
(图片来源网络,侵删)

准备工作:创建一个联动类别

在调用之前,你必须先在后台创建好一个联动类别,我们以创建一个“地区”联动类别为例。

  1. 登录 DedeCMS 后台
  2. 进入 [核心] -> [联动类别管理]
  3. 点击 [增加联动类别]
    • 类别名称:填写 地区
    • 类别表单名:填写 nativeplace(这个很重要,前台调用时会用到,建议使用英文小写)。
    • 使用频道:选择你希望使用这个联动类别的模型(文章、软件等)。
    • 分类项:在这里填写你的地区层级。
      • 一级:北京, 上海, 广东, 四川
      • 二级:北京->朝阳区, 北京->海淀区; 上海->浦东新区, 上海->黄浦区; 广东->广州市, 广东->深圳市; 四川->成都市, 四川->绵阳市
    • 点击 [确定] 保存。

完成这一步后,你的数据库里就有了 dede_sys_enum 表,并插入了相关的联动类别数据。


在后台表单中调用联动类别

这是最常见的需求,比如在发布文章时,让作者选择文章的“地区”。

方法:使用 {dede:channel}

{dede:channel} 标签不仅可以调用栏目,也可以用来调用联动类别。

dede 联动类别调用
(图片来源网络,侵删)

模型中添加字段

你需要将这个联动类别添加到你使用的内容模型中。

  1. 进入 [核心] -> [内容模型管理],选择你正在使用的模型(文章模型”),点击 [字段管理]
  2. 点击 [增加新字段]
    • 字段名称地区 (用于后台显示)
    • 字段标识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")'/] 在文章列表页显示联动类别的可读文本。

关键点回顾:

  1. 标识一致性:后台创建联动类别时的“类别表单名”、后台添加字段时的“字段标识”、前台调用时使用的字段名(nativeplace),这三者必须完全一致。
  2. 后台表单:核心是 {dede:channel} 标签和 DedeChannelSelect 的 JS 初始化。
  3. 前台显示:核心是 GetEnums() 函数,它能将枚举值(如 1,3)转换成人类可读的文本(如 "北京市, 朝阳区")。

希望这份详细的教程能帮助你成功地在 DedeCMS 中调用联动类别!

-- 展开阅读全文 --
头像
梦织dede下拉菜单怎么用?
« 上一篇 03-31
C语言中double类型的具体作用是什么?
下一篇 » 03-31
取消
微信二维码
支付宝二维码