x x
当前位置 : 主页 > 网站建设 > 正文

DedeCMS表单自定义字段地区三级联动下拉选择修改优化版

原创

重庆seo2021-04-16阅读(340)

DedeCMS做表单比较方便,各种自定义字段都有预设:文字、整数、小数、下拉选择、HTML等,大家可以根据自己的需要选择。

织梦比较特殊的是各地区联动,这些地区保存到数据表上是以数字表示而不是具体某个地区。目前有两种方法,有需求的朋友可以参考修改。

DedeCMS表单采用JS+自定义字段(文本)实现各城市地区三级联动

分别增加如下自定义字段,数据类型全部为文本,如下

省份,s_province
城市,s_city
地区,s_county

在所需要用到的模板加入如下代码

<script type="text/javascript" src="/js/area.js"></script>
<select class="input w100" id="s_province" name="s_province">
<option value="省份">省份</option>
</select>
<select class="input w100" id="s_city" name="s_city">
<option value="城市">城市</option>
</select>
<select class="input w100" id="s_county" name="s_county">
<option value="地区">地区</option>
</select>
<script type="text/javascript">_init_area();</script>

上面用到的area.js下载链接如下,根据自己的要求放到指定的文件夹下即可。

下载链接: https://pan.baidu.com/s/18V-6sEE1MMqazch1-g-Q_w
提取码: stbm

注:经笔者测试放在系统默认的发布表单页面(如:/plus/diy.php?action=post&diyid=1)失效,放在网页模板里可正常使用。

这样在表单列表里看到的就是中文地名而不是显示枚举值(数字)。网上还有用系统自带的联动模型修改,个人感觉修改比较多,根据需要选择。

DedeCMS表单采用自定义字段(数字类型为联动)实现各地区联动优化版

打开/dede/templets/diy_field_add.htm,大概在146行,可以看到已经被注释了,修改为:

<div class='nw'><input type='radio' class='np' name='dtype' id='dtype16' value="stepselect">联动类型</div>

这样前台就能看到数据类型为联动类型的选择了。这个字段实际上是系统自带的,因此字段名字必须是nativeplace,如下所示:

至此地区联动已经正常使用了,接下来修改表单列表上显示正确的中文地区名。

打开/dede/templets/diy_list.htm,大约在41行,找到

else if($fielddata[1]=='addon')
{
    $fields[$field] = "<a href='{$fields[$field]}' target='_blank'><img src='images/channeladd.gif' border='0' /> 其它附件</a>";
}

在上面加入如下代码段,复制时“分隔符”请自行删除。

//联动类型显示修正开始
 else if($fielddata[1]=='stepselect')
{
    $db->Execute('me',"SELECT * FROM `#分隔符@__stepselect` WHERE egroup='{$field}'");
    while($arr = $db->GetArray(me))
    {
        $egroup = $arr['egroup'];
    }
    $fields[$field] = Getenums("{$fields[$field]}",$egroup);
}
//联动类型显示修正结束

继续找到

{/dede:datalist}

下面加入代码段

<?php
function Getenums($evalue = 0, $egroup)
{
    if (!isset($GLOBALS['em_' . $egroup . 's'])) {
        $cachefile = DEDEDATA . '/enums/' . $egroup . '.php';
        if (!file_exists($cachefile)) {
            require_once DEDEINC . '/enums.func.php';
            WriteEnumsCache();
        }
        if (!file_exists($cachefile)) {
            return '';
        } else {
            require_once $cachefile;
        }
    }
    if ($evalue >= 500) {
        if ($evalue % 500 == 0) {
            return isset($GLOBALS['em_' . $egroup . 's'][$evalue]) ? $GLOBALS['em_' . $egroup . 's'][$evalue] : '';
        } else {
            if (preg_match('#([0-9]{1,})\\.([0-9]{1,})#', $evalue, $matchs)) {

$esonvalue = $matchs[1];
$etopvalue = $esonvalue - $esonvalue % 500;
$esecvalue = preg_replace('/(?<=\.)[0]+/', '', $evalue);

$GLOBALS['em_' . $egroup . 's'][$etopvalue] = empty($GLOBALS['em_' . $egroup . 's'][$etopvalue]) ? '' : $GLOBALS['em_' . $egroup . 's'][$etopvalue];

$GLOBALS['em_' . $egroup . 's'][$esonvalue] = empty($GLOBALS['em_' . $egroup . 's'][$esonvalue]) ? '' : $GLOBALS['em_' . $egroup . 's'][$esonvalue];

$GLOBALS['em_' . $egroup . 's'][$esecvalue] = empty($GLOBALS['em_' . $egroup . 's'][$esecvalue]) ? '' : $GLOBALS['em_' . $egroup . 's'][$esecvalue];

return $GLOBALS['em_' . $egroup . 's'][$etopvalue] . ' - ' . $GLOBALS['em_' . $egroup . 's'][$esonvalue] . ' - ' . $GLOBALS['em_' . $egroup . 's'][$esecvalue];
            }
			else 
			{
$elimit = $evalue % 500;
$erevalue = $evalue - $elimit;
$GLOBALS['em_' . $egroup . 's'][$erevalue] = empty($GLOBALS['em_' . $egroup . 's'][$erevalue]) ? '' : $GLOBALS['em_' . $egroup . 's'][$erevalue];
$GLOBALS['em_' . $egroup . 's'][$evalue] = empty($GLOBALS['em_' . $egroup . 's'][$evalue]) ? '' : $GLOBALS['em_' . $egroup . 's'][$evalue];
return $GLOBALS['em_' . $egroup . 's'][$erevalue] . ' - ' . $GLOBALS['em_' . $egroup . 's'][$evalue];
            }
        }
    }
}
?>

至此修改完毕,最终效果如下

黑龙江省 - 伊春市 - 金山屯区

有些朋友会增加一些表单发送到指定邮箱《DedeCMS用PHPMailer自定义表单发送到QQ邮箱》,建议采用第一种方法,不然发送到邮箱的还是枚举值(数字)。

    本文地址:https://www.vi586.com/mip/web/769.html
    版权声明:原创文章,版权归重庆SEO吖七所有,欢迎分享本文,支持原创,转载请保留出处