织梦自定义联动调用如何实现?

99ANYc3cd6
预计阅读时长 22 分钟
位置: 首页 织梦建站 正文

“联动菜单”(或称“联动分类”)是织梦一个非常实用的功能,常用于地区选择、品牌选择、车型选择等具有层级关系的数据,自定义调用意味着你可以不局限于系统默认的调用方式,而是根据你的页面布局和需求,灵活地获取和展示这些数据。

织梦自定义联动调用
(图片来源网络,侵删)

整个过程可以分为三个主要部分:

  1. 后台设置:创建和配置联动菜单。
  2. 前台模板:在模板文件中编写调用代码。
  3. 数据处理:在表单提交或列表页中处理联动菜单的值。

第一部分:后台设置联动菜单

这是所有工作的基础,我们需要先在后台创建好我们需要的联动菜单。

登录织梦后台,进入“核心” -> “频道模型” -> “联动菜单管理”。

点击“增加新联动菜单”

织梦自定义联动调用
(图片来源网络,侵删)

填写菜单信息

  • 菜单名称:给你的联动菜单起个名字,地区”、“品牌”、“车辆类型”等,这个名字在调用时会用到。
  • 菜单目录:系统会自动生成一个英文名称,用于数据库和程序调用,一般保持默认即可。
  • 是否启用:务必勾选“是”,否则前台无法调用。
  • 分类信息表:选择要关联的数据表,通常使用默认的 dede_sys_enum 表即可,如果你的数据量非常大或有特殊需求,可以考虑使用自定义的独立表。
  • 字段名:这是关键,如果你是新建的联动菜单,这里可以留空,但如果你是想关联到某个自定义模型字段(比如文章模型下的“品牌”字段),就需要选择那个字段,这里我们先以新建一个独立的联动菜单为例,所以留空。

添加联动项

  • 设置好基本信息后,点击“保存”。
  • 保存成功后,你会看到这个联动菜单的列表,旁边有一个“管理”按钮。
  • 点击“管理”,进入具体的项管理界面。
  • 你可以添加层级数据,对于“地区”菜单:
  • 第一级0,省份,0 (父ID为0,名称为“省份”,或者直接写“广东省”)
  • 第二级1,广州市,1 (父ID为1,属于“广东省”)
  • 第三级2,天河区,2 (父ID为2,属于“广州市”)
  • 继续添加1,深圳市,1 (父ID为1,属于“广东省”)
  • 格式说明:每一行代表一个项,格式为 父ID,项目名称,项目ID,项目ID是系统自动分配的,你只需要按顺序填写即可,父ID为0的就是顶级。

完成,重复以上步骤,创建你需要的所有联动菜单。


第二部分:前台模板调用

这是实现“自定义”的核心,织梦提供了多种调用方式,从简单到复杂。

织梦自定义联动调用
(图片来源网络,侵删)

使用{dede:sonchannel}标签(最常用)

这个标签主要用于调用指定父级下的所有子级联动项,非常适合制作下拉列表。

基本语法

{dede:sonchannel}
    <option value="[field:typename/]">[field:typename/]</option>
{/dede:sonchannel}

示例1:调用“地区”菜单下的所有省份(顶级) 假设你的联动菜单名称是 area

<select name="province">
    <option value="0">请选择省份</option>
    {dede:sonchannel type='top' row='20' noself='yes'}
        <option value="[field:id/]">[field:typename/]</option>
    {/dede:sonchannel}
</select>
  • type='top':表示调用顶级菜单项。
  • row='20':限制显示20条。
  • noself='yes':不包含自身(在顶级调用时意义不大,但是个好习惯)。
  • [field:id/]:获取联动项的ID。
  • [field:typename/]:获取联动项的名称。

示例2:二级联动(选择省份后,动态加载城市) 这是最常见的联动场景,需要结合JavaScript实现。

<!-- 省份选择 -->
<select name="province" id="province" onchange="loadCity(this.value)">
    <option value="0">请选择省份</option>
    {dede:sonchannel type='top' row='20' noself='yes'}
        <option value="[field:id/]">[field:typename/]</option>
    {/dede:sonchannel}
</select>
<!-- 城市选择(初始为空) -->
<select name="city" id="city">
    <option value="0">请先选择省份</option>
</select>
<!-- JavaScript代码 -->
<script type="text/javascript">
function loadCity(pid) {
    // 如果选择的是“请选择”,则清空城市列表
    if (pid == 0) {
        document.getElementById('city').innerHTML = '<option value="0">请先选择省份</option>';
        return;
    }
    // 使用AJAX获取城市数据
    var myajax = new DedeAjax(taget_obj, false, true, '', '', 0);
    myajax.SendGet2("/plus/ajax_stypes.php?pid="+pid);
    DedeXHTTP = null;
}
// 模拟DedeAjax类(如果你的模板没有加载这个类)
function DedeAjax(func, aurl, bpost, ainfo, pageno, nload) {
    this.xmlHttp = null;
    this.f_func = func;
    this.s_url = aurl;
    this.b_post = bpost;
    this.s_info = ainfo;
    this.pageno = pageno;
    this.n_load = nload;
    this.createAjax = function() {
        // ... 创建XMLHttpRequest对象的代码 ...
    }
    this.SendGet = function() {
        // ... GET请求的代码 ...
    }
    this.SendPost = function() {
        // ... POST请求的代码 ...
    }
    this.SendGet2 = function(url) {
        this.s_url = url;
        this.createAjax();
        this.xmlHttp.open("GET", this.s_url, true);
        this.xmlHttp.onreadystatechange = this.f_func;
        this.xmlHttp.send(null);
    }
}
// 页面加载完成后,创建一个全局的taget_obj
var taget_obj = document.getElementById('city');
</script>

注意:上面的AJAX调用 /plus/ajax_stypes.php 是织梦系统自带的处理联动菜单AJAX请求的文件,它会根据传入的 pid (父ID) 返回JSON格式的子级数据,你的JS代码需要解析这个JSON并填充到<select>中,织梦默认的JS库(如dedeajax2.js)已经封装好了这个逻辑,直接使用会更简单。

使用{dede:global}标签调用顶级项

如果你只是想在页面上静态地列出所有顶级联动项,可以使用这个方法。

示例

<ul>
    {dede:global name='typename' function='GetTopTypename(@me)'/}
</ul>

这个方法比较简单,灵活性不高,不适合做动态下拉框。

直接查询数据库(最灵活)

对于完全自定义的布局和复杂的数据处理,可以直接在模板中使用PHP代码查询数据库。

示例

<ul>
    <?php
    $dsql = new DedeSql(false);
    $sql = "SELECT * FROM `dede_sys_enum` where egroup='你的菜单目录' and evalue=0 ORDER BY disorder ASC, id ASC";
    $dsql->Execute('me',$sql);
    while($row = $dsql->GetArray('me'))
    {
        echo "<li><a href='#'>".$row['ename']."</a></li>";
    }
    $dsql->Close();
    ?>
</ul>
  • dede_sys_enum:存储联动数据的表。
  • egroup:联动菜单的“菜单目录”,也就是你在后台设置的英文名称。
  • evalue=0:表示查询顶级项。
  • disorder:排序字段。

这种方法功能最强大,但需要你熟悉织梦的数据库结构。


第三部分:数据处理

当你使用联动菜单作为表单元素(如发布文章、自定义表单)时,提交到数据库里的是选中项的ID

在自定义模型中添加联动字段: 在后台“频道模型” -> “自定义模型”中,为你的模型添加一个字段。

  • 字段名:如 sheng
  • 字段类型:选择“联动类型”
  • 所属联动菜单:选择你之前创建的“地区”菜单。

前台表单

<input type="hidden" name="sheng" value="0" />
<select name="sheng" onchange="loadCity(this.value)">
    <!-- 省份选项 -->
</select>

后台接收: 当表单提交后,$_POST['sheng'] 的值就是用户选择的省份的ID,织梦会自动将这个ID保存到对应的数据字段中。

在列表页或内容页显示: 数据库里存的是ID,但前台需要显示名称,这时就需要用到织梦的转换函数。

在列表页(list_article.htm: 使用 GetArcypt 函数,但更常用的是 {dede:field} 结合 function

{dede:field name='sheng' function='GetTypename(@me)'/}
  • GetTypename() 是织梦内置的函数,可以根据ID获取到联动菜单的名称。 页(article_article.htm)**: 同样使用上面的方法。
    <span>省份:{dede:field name='sheng' function='GetTypename(@me)'/}</span>

总结与最佳实践

  1. 明确需求:首先想清楚你的联动菜单有几个层级,用在什么地方(表单?列表?)。
  2. 后台配置:花时间在后台把联动菜单的数据结构搭建好,确保层级关系正确。
  3. 选择调用方式
    • 简单下拉列表:优先使用 {dede:sonchannel}
    • 多级联动(如省-市-区):使用 {dede:sonchannel} + AJAX,这是最标准、最可靠的方式,记得引入织梦的AJAX库。
    • 完全自定义布局:直接使用PHP查询数据库,灵活度最高。
  4. 处理数据:记住前台存ID,后台和内容页显示名称时用 GetTypename() 函数进行转换。
  5. 调试:如果联动不生效,检查后台菜单是否启用、typepid 参数是否正确、JS路径是否正确。

希望这份详细的指南能帮助你完全掌握织梦自定义联动调用的使用!

-- 展开阅读全文 --
头像
dede轮播调用简单,具体怎么实现?
« 上一篇 今天
dede如何添加搜索功能?
下一篇 » 今天

相关文章

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

目录[+]