dede添加自定义联动

99ANYc3cd6
预计阅读时长 21 分钟
位置: 首页 DEDE建站 正文

核心思路

整个流程分为四大步:

dede添加自定义联动
(图片来源网络,侵删)
  1. 数据库准备:在数据库中创建联动表和项目表,并填入初始数据。
  2. 后台设置:在DedeCMS后台添加一个新的联动类型,并关联到你的内容模型中。
  3. 内容模型修改:在你需要使用联动的模型(例如文章模型)中,添加一个新的字段,类型为“联动类型”。
  4. 前台调用:在发布内容的表单和内容详情页,使用相应的标签调用联动数据。

第一步:数据库准备 (手动操作)

这是最关键的一步,我们需要手动在数据库里创建两张表:dede_sys_enum(用于存放联动类型本身)和dede_sys_enum(用于存放具体的联动项目)。

注意: dede_ 是你的数据库表前缀,如果你的不是,请自行替换。

创建联动类型

dede_sys_enum 表中插入一条记录,定义我们的联动类型。

INSERT INTO `dede_sys_enum` (`id`, `enname`, `egroup`, `evalue`, `eshow`, `orderkey`, `issystem`)
VALUES
(NULL, 'area', '联动类型', '0', '地区联动', '0', '0');
  • enname: 联动类型的唯一标识,非常重要,后面会用到,我们这里用 area
  • egroup: 固定写 '联动类型',这是DedeCMS识别联动类型的标志。
  • evalue: 固定写 '0'
  • eshow: 在后台显示的名称,地区联动”。
  • orderkey: 排序,可以忽略。
  • issystem: 是否系统内置,写 0 表示自定义。

创建联动项目数据

我们在 dede_sys_enum 表中插入具体的省、市、区数据,这里有一个技巧,通过 evalue 的值来体现层级关系。

dede添加自定义联动
(图片来源网络,侵删)
  • 一级(省份)evalue省份ID,0evalue2 为父级ID(0表示顶级)。
  • 二级(城市)evalue城市ID,省份IDevalue2 为其所属省份的ID。
  • 三级(区县)evalue区县ID,城市IDevalue2 为其所属城市的ID。

示例数据(仅作演示,你需要根据实际情况添加完整数据):

-- 一级:省份
INSERT INTO `dede_sys_enum` (`id`, `enname`, `egroup`, `evalue`, `evalue2`, `eshow`, `orderkey`, `issystem`) VALUES
(NULL, 'area', '联动类型', '1,0', '0', '广东省', '1', '0'),
(NULL, 'area', '联动类型', '2,0', '0', '浙江省', '2', '0');
-- 二级:城市 (属于广东省)
INSERT INTO `dede_sys_enum` (`id`, `enname`, `egroup`, `evalue`, `evalue2`, `eshow`, `orderkey`, `issystem`) VALUES
(NULL, 'area', '联动类型', '3,1', '1', '广州市', '1', '0'),
(NULL, 'area', '联动类型', '4,1', '1', '深圳市', '2', '0'),
(NULL, 'area', '联动类型', '5,2', '2', '杭州市', '1', '0'),
(NULL, 'area', '联动类型', '6,2', '2', '宁波市', '2', '0');
-- 三级:区县 (属于广州市)
INSERT INTO `dede_sys_enum` (`id`, `enname`, `egroup`, `evalue`, `evalue2`, `eshow`, `orderkey`, `issystem`) VALUES
(NULL, 'area', '联动类型', '7,3', '3', '天河区', '1', '0'),
(NULL, 'area', '联动类型', '8,3', '3', '越秀区', '2', '0'),
(NULL, 'area', '联动类型', '9,4', '4', '南山区', '1', '0'),
(NULL, 'area', '联动类型', '10,4', '4', '福田区', '2', '0');

数据结构解释:

  • enname 全部是 area,表示它们都属于我们刚才创建的“地区联动”类型。
  • evalue2关键,它存储了父级项目的ID,广州市的 evalue21,而 1 正是广东省的ID。
  • eshow 是显示给用户的名称。

完成以上两步后,你的数据库里就有了联动的基础数据。


第二步:后台设置

现在回到DedeCMS后台,让系统识别我们刚刚创建的联动类型。

  1. 登录DedeCMS后台。
  2. 进入 [系统] -> [系统基本参数设置] -> [联动类型管理]
  3. 你应该能看到我们第一步添加的“地区联动”类型。
  4. 点击右侧的 [增加联动类型],虽然数据已经存在,但这里可以让你设置它的参数,是否启用”等,通常直接点击保存即可。

至此,后台的联动类型设置就完成了。


第三步:内容模型修改

我们需要在某个内容模型(文章”模型)中添加一个字段来使用这个联动类型。

  1. 进入 [核心] -> [内容模型管理]
  2. 选择你要修改的模型,文章模型”,点击 [字段管理]
  3. 点击 [增加新字段]
  4. 填写字段信息:
    • 字段名: shengqu (英文,小写,不能有数字)
    • 字段别名: 所在地区 (中文,方便识别)
    • 字段类型: 选择 联动类型
    • 联动类型: 选择 地区联动 (这是我们第一步创建的)
    • 是否显示在发布页:
    • 其他选项可以根据需要填写,默认值”等。
  5. 点击 [保存]

保存后,系统会自动更新数据表结构,去 ] -> [添加文档],你应该就能看到新添加的“所在地区”字段,并且是一个下拉选择框了。


第四步:前台调用

现在我们可以在前台模板中使用这个联动字段了。

在发布表单中调用 (让级联选择生效)

的模板文件(通常是 templets/plus/post.htm 或你自定义的模板)中,你需要使用 {dede:联动选择}

<!-- 假设你的字段名是 shengqu -->
<div class="form-group">
    <label class="col-md-2 control-label">所在地区:</label>
    <div class="col-md-10">
        {dede:联动选择 function='GetPartSelect(@me, "shengqu")'}
        <!-- 
          @me: 当前字段的值
          "shengqu": 你的字段名
        -->
    </div>
</div>

重要:要实现省-市-区的级联效果,你的 js 文件中必须包含联动选择的相关JS,DedeCMS默认的模板中通常已经包含,如果没有,请确保引入了 ../include/js/enums.js 文件。

详情页调用

详情页模板(如 templets/default/article_article.htm)中,直接使用 {dede:field.字段名/} 即可。

<p>发布地区:{dede:field.shengqu/}</p>

但是,这样直接调用出来的是类似 1,0 这样的值,而不是“广东省”,我们需要一个函数来转换它。

使用自定义函数(推荐)

  1. /include/extend.func.php 文件中(如果没有就创建一个)添加以下函数:

    /**
     * 获取联动类型的显示名称
     * @param string $evalue 联动字段存储的值,如 '1,0'
     * @param string $enname 联动类型的enname,如 'area'
     * @return string 显示名称,如 '广东省'
     */
    function getLinkageName($evalue, $enname) {
        global $dsql;
        if (empty($evalue)) return '';
        // 获取顶级项目的ID
        $top_id = explode(',', $evalue)[0];
        $query = "SELECT eshow FROM `#@__sys_enum` WHERE enname = '{$enname}' AND evalue = '{$top_id},0'";
        $row = $dsql->GetOne($query);
        return $row['eshow'];
    }

    页模板中调用这个函数:

    <p>发布地区:{dede:field.shengqu function='getLinkageName(@me, "area")'/}</p>

    这样就会显示“广东省”了。

直接查询(不推荐,性能稍差)

如果你不想修改函数文件,也可以直接在模板里用PHP代码,但这会破坏模板的简洁性。

<p>发布地区:
    <?php
    $evalue = $fields['shengqu']; // 获取字段值
    if (!empty($evalue)) {
        $top_id = explode(',', $evalue)[0];
        $dsql = new DedeSql(false);
        $row = $dsql->GetOne("SELECT eshow FROM `#@__sys_enum` WHERE enname = 'area' AND evalue = '{$top_id},0'");
        echo $row['eshow'];
    }
    ?>
</p>

总结与注意事项

  1. 备份数据库:在进行任何数据库操作前,务必备份数据库!
  2. 表前缀:确认你的数据库表前缀是 dede_,如果不是,请全部替换。
  3. 数据量:如果你的联动数据(比如全国所有省市县)非常多,手动插入SQL会很麻烦,你可以先建好结构,然后找一些现成的省市县数据SQL脚本导入。
  4. JS依赖:确保前台模板引入了 enums.js,否则联动选择无法工作。
  5. 缓存:修改了系统参数或模型后,记得在后台清理一下缓存。

通过以上步骤,你就可以成功地在DedeCMS中添加并使用自定义联动类型了,这个过程虽然步骤多,但只要按部就班,就能顺利完成。

-- 展开阅读全文 --
头像
C语言和C++语言到底有什么区别?
« 上一篇 今天
dede附件服务器如何启用?
下一篇 » 今天

相关文章

取消
微信二维码
支付宝二维码