织梦地区联动默认值如何设置?

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

“地区联动”指的是在表单(如会员注册、信息发布、自定义表单等)中,使用联动菜单来选择地理位置,通常是国家、省份、城市、区县这样的层级结构。

“默认值”就是希望在用户打开表单时,某个或某些地区选项已经被自动选中,而不是让用户从空白开始选择。

核心概念:如何实现默认值?

在织梦中,地区联动的默认值不是在后台某个地方直接设置的,而是通过修改模板文件中的HTML标签来实现的,你需要找到生成联动菜单的标签,并为其添加一个 value 属性来指定默认选中的值。


在会员注册表单中设置默认值

这是最常见的场景,假设你想让所有新注册的会员默认都选择“中国 > 广东省 > 广州市”。

操作步骤:

  1. 找到模板文件:

    • 登录织梦后台。
    • 进入【模板】->【模板管理】。
    • 找到并打开你当前使用的会员注册模板,通常是 /templets/default/reg-new.htm
  2. 定位联动菜单代码:reg-new.htm 文件中,找到生成地区联动的代码,它通常长这个样子:

    <select name="province" id="province">
        <option value='0'>请选择省份</option>
        {dede:global.cfg_addon_skins function='GetAreaSelect(@me,1)'/}
    </select>
    <select name="city" id="city">
        <option value='0'>请选择城市</option>
        {dede:global.cfg_addon_skins function='GetAreaSelect(@me,2)'/}
    </select>
    <select name="area" id="area">
        <option value='0'>请选择区县</option>
        {dede:global.cfg_addon_skins function='GetAreaSelect(@me,3)'/}
    </select>
    • nameid 分别是省份、城市、区县菜单的标识。
    • {dede:global.cfg_addon_skins function='GetAreaSelect(@me,层级)'/} 是织梦的底层模板标签,用于动态生成联动菜单选项。
  3. 修改代码,添加默认值: 我们需要为每个 <select> 标签添加一个 onchange 事件,并给 <option> 标签添加 selected 属性。

    修改后的代码示例(默认选择“广东省广州市”):

    <script language="javascript" type="text/javascript">
    function changeCity(obj){
        var cityList = document.getElementById('city');
        var areaList = document.getElementById('area');
        cityList.options.length=1; // 清空城市列表,保留第一个“请选择”
        areaList.options.length=1; // 清空区县列表,保留第一个“请选择”
        var province = obj.value;
        if(province!='0'){
            // 这里通过AJAX获取城市列表,织梦默认联动会自动处理
            // 我们只需要在页面加载时设置默认值即可
        }
    }
    function changeArea(obj){
        // 类似上面的函数,用于处理区级联动
    }
    </script>
    <!-- 省份 -->
    <select name="province" id="province" onchange="changeCity(this)">
        <option value='0'>请选择省份</option>
        {dede:global.cfg_addon_skins function='GetAreaSelect(@me,1)'/}
    </select>
    <!-- 城市 -->
    <select name="city" id="city" onchange="changeArea(this)">
        <option value='0'>请选择城市</option>
        {dede:global.cfg_addon_skins function='GetAreaSelect(@me,2)'/}
    </select>
    <!-- 区县 -->
    <select name="area" id="area">
        <option value='0'>请选择区县</option>
        {dede:global.cfg_addon_skins function='GetAreaSelect(@me,3)'/}
    </select>
    <!-- 在页面底部添加一段JS代码来设置默认值 -->
    <script language="javascript" type="text/javascript">
    window.onload = function() {
        // 1. 找到省份下拉框
        var provinceSelect = document.getElementById('province');
        // 2. 找到城市下拉框
        var citySelect = document.getElementById('city');
        // 3. 找到区县下拉框
        var areaSelect = document.getElementById('area');
        // 【关键步骤】设置默认省份为“广东省”
        // 你需要知道“广东省”在数据库中的ID,通常是 1
        for (var i = 0; i < provinceSelect.options.length; i++) {
            if (provinceSelect.options[i].value == '1') { // '1' 是广东省的ID
                provinceSelect.options[i].selected = true;
                break;
            }
        }
        // 【关键步骤】设置默认城市为“广州市”
        // 你需要知道“广州市”在数据库中的ID,通常是 59
        // 注意:这里需要在省份选择后,通过联动加载城市列表,然后再设置
        // 为了简化,我们假设页面加载后城市列表已经根据默认省份更新(这通常需要联动JS支持)
        // 或者,我们可以手动触发一次省份的onchange事件
        provinceSelect.onchange(); // 触发省份变更,加载城市列表
        // 等待城市列表加载完成(这是一个简化的处理,实际中可能需要更复杂的异步处理)
        setTimeout(function() {
            for (var i = 0; i < citySelect.options.length; i++) {
                if (citySelect.options[i].value == '59') { // '59' 是广州市的ID
                    citySelect.options[i].selected = true;
                    break;
                }
            }
            // 再次触发城市变更,加载区县列表
            citySelect.onchange();
        }, 300); // 延迟300毫秒,等待联动加载
        // 设置默认区县为“天河区”
        // 你需要知道“天河区”在数据库中的ID,通常是 1111
        setTimeout(function() {
            for (var i = 0; i < areaSelect.options.length; i++) {
                if (areaSelect.options[i].value == '1111') { // '1111' 是天河区的ID
                    areaSelect.options[i].selected = true;
                    break;
                }
            }
        }, 600); // 再次延迟,等待区县列表加载
    }
    </script>
  • 难点:你需要提前知道目标省份、城市、区县在 dede_areainfo 数据表中的 id
  • 方法:通过查询数据库或观察其他已选中的选项来确定这些ID。
  • 原理:利用 window.onload 事件,在页面加载完成后,用JavaScript遍历下拉框的选项,找到对应的ID并设置 selected = true

在自定义表单中设置默认值

原理与会员注册表单完全相同,只是模板文件的位置不同。

  1. 找到模板文件:

    • 进入【后台】->【自定义表单】。
    • 点击你想要修改的那个自定义表单的“管理”按钮。
    • 在表单管理页面,找到“修改表单模板”或类似的链接,点击进入模板编辑。
    • 模板文件通常是 /templets/default/plus/diy_list.htm(用于展示)或 /templets/default/plus/diy_form.htm(用于提交),你需要修改的是 diy_form.htm
  2. 定位并修改联动菜单代码:diy_form.htm 中找到地区联动的代码,其结构和会员注册模板中的类似,按照场景一中的方法,添加JavaScript代码来设置默认值。


在发布信息(如文章、小说)时设置默认值

这个场景比较特殊,因为通常信息发布是针对已有会员的,默认值应该根据会员的所在地来设置。

  1. 实现逻辑:

    • 当会员登录后,进入信息发布页面。
    • 系统读取当前登录会员的 matt(会员资料表)中的所在地信息。
    • 将这个信息作为联动菜单的默认值。
  2. 实现方法: 这需要对织梦的核心文件进行修改,较为复杂,通常不建议新手操作。

    • 找到发布页面模板:如 /templets/default/article_add.htm
    • 找到联动菜单代码
    • 修改PHP逻辑:在模板文件中,你需要嵌入PHP代码来获取当前会员信息,然后将对应的地区ID传递给JavaScript。
    • 示例思路(伪代码)
      // 在模板文件中
      <?php
      if($cfg_ml->IsLogin()){
          $uid = $cfg_ml->M_ID;
          $row = $dsql->GetOne("SELECT province, city, area FROM `dede_member` WHERE mid = $uid");
          $default_province = $row['province'];
          $default_city = $row['city'];
          $default_area = $row['area'];
      }
      ?>
      <script>
      window.onload = function() {
          // 使用PHP变量来设置默认值
          var defaultProvince = <?php echo $default_province; ?>;
          // ... JS代码逻辑,使用 defaultProvince 来设置选中项
      }
      </script>

      这个方法需要对PHP和织梦系统有较深的理解。


常见问题与注意事项

  1. 如何找到地区ID? 最直接的方法是登录你的网站数据库,找到 dede_areainfo 这张表,里面列出了所有地区及其对应的 idpid(父级ID)、name(名称)等字段,你可以直接查询 SELECT * FROM dede_areainfo 来找到你需要的地区ID。

  2. 为什么设置了 selected 不生效?

    • 联动问题:如果你设置了省份的默认值,但没有正确触发 onchange 事件来加载城市列表,那么城市和区县的菜单可能还是空的,一定要确保联动逻辑(JS代码)能正确响应你的默认值设置。
    • ID错误:检查你设置的 value 值是否与数据库中的 id 完全一致,包括数字前后的空格。
    • 缓存问题:修改模板文件后,务必在后台【生成】->【更新HTML】或清除浏览器缓存后再测试。
  3. 联动菜单的底层标签 {dede:global.cfg_addon_skins function='GetAreaSelect(@me,层级)'/} 是什么? 这是织梦的一个全局变量调用,cfg_addon_skins 通常指向联动菜单的JS处理文件(如 /include/area.func.php/js/area.js)。GetAreaSelect 是一个函数,它根据层级(1=省, 2=市, 3=区县)生成对应的 <option> 选项,你不需要修改这个标签本身,只需要用它生成的 <select> 容器来操作即可。

希望这份详细的指南能帮助你成功设置织梦地区联动的默认值!

-- 展开阅读全文 --
头像
dede图片水印怎么设置?
« 上一篇 04-24
dede 判断不为空
下一篇 » 04-24

相关文章

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

目录[+]