如何有效解决织梦自定义表单联动时城市表单名称仅显示数字或枚举值的问题?
织梦自定义表单联动之城市表单名称只显示数字或枚举值的解决方法
在使用织梦(DedeCMS)进行网站建设时,有时会遇到需要在自定义表单中实现城市联动功能,默认情况下,织梦并没有提供直接的城市联动字段类型,为了实现这一功能,我们需要对织梦系统进行二次开发,包括添加联动类型和解决后台显示问题,本文将详细介绍如何实现这一功能,并提供相关的代码示例和解决方案。
一、添加联动类型字段
我们需要在织梦的自定义表单模板中添加联动类型的选项,这涉及到修改两个文件:diy_field_add.htm
和diy_field_edit.htm
。
1、修改diy_field_add.htm
打开并编辑dede/templets/diy_field_add.htm
文件,找到以下代码段:
<!div class='nw'><input type='radio' class='np' name='dtype' id='dtype16' value="stepselect">联动类型</div>
将其修改为:
<div class='nw'><input type='radio' class='np' name='dtype' id='dtype16' value="stepselect">联动类型</div>
保存文件。
2、修改diy_field_edit.htm
打开并编辑dede/templets/diy_field_edit.htm
文件,找到以下代码段:
<option value="checkbox">Checkbox多选框</option>
在其下面添加:
<option value="stepselect">联动类型</option>
保存文件。
完成以上两步后,返回织梦后台的自定义表单界面,可以看到新增了一个名为“联动类型”的字段类型。
二、实现城市联动功能
我们需要在自定义表单中添加一个城市联动字段,假设我们要添加一个名为“所在地区”的字段。
1、添加字段
在织梦后台的自定义表单管理界面,点击“添加字段”,输入字段名称(如“所在地区”),选择字段类型为“联动类型”,字段名称填写为nativeplace
(这是织梦系统中预定义的地区联动组名),并设置默认值为nativeplace
,完成后保存。
2、前台调用
前台页面会自动显示城市联动选择器,用户可以选择省、市、区等具体信息,这部分不需要额外配置,织梦会根据后台设置自动生成相应的HTML代码。
三、解决后台显示问题
虽然前台可以正常显示城市名称,但在后台查看提交的数据时,可能会发现城市名称显示为数字或枚举值,为了解决这个问题,我们需要修改模板文件来正确显示城市名称。
1、修改diy_list.htm
打开并编辑dede/templets/diy_list.htm
文件,找到以下代码段:
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 * FROMdede_stepselect
WHERE itemname='{$fielddata[0]}'");
while($arr = $db>GetArray(me)) {
$egroup = $arr['egroup'];
}
$fields[$field] = Getenums("{$fields[$field]}",$egroup);
}
2、添加Getenums
函数
在diy_list.htm
文件的末尾添加以下函数:
<?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("#([09]{1,})\.([09]{1,})#", $evalue, $matchs)) { $esonvalue = $matchs[1]; $etopvalue = $esonvalue ($esonvalue % 500); $esecvalue = str_replace(".00",".",$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]; } } } ?>
这段代码用于将存储的数字转换为对应的城市名称。
通过以上步骤,我们可以实现织梦自定义表单中的城市联动功能,并在后台正确显示城市名称,以下是一些常见问题及其解答,以帮助用户更好地理解和应用上述方法。
四、常见问题解答
1、Q: 为什么需要修改diy_field_add.htm
和diy_field_edit.htm
文件?
A: 这两个文件分别用于添加和编辑自定义表单字段,默认情况下,织梦没有启用联动类型字段,因此需要手动取消注释相关代码以启用该功能。
2、Q: 如何在前台调用城市联动选择器?
A: 在自定义表单中添加一个字段,选择字段类型为“联动类型”,并设置字段名称为nativeplace
,织梦会自动生成相应的HTML代码,无需额外配置。
3、Q: 为什么后台显示的是数字而不是城市名称?
A: 因为织梦默认将联动类型的数据存储为枚举值或数字,需要通过修改模板文件来转换这些值为具体的城市名称,这就是为什么我们需要添加Getenums
函数的原因。
4、Q: 如何确保Getenums
函数正常工作?
A: 确保缓存文件存在且有效,如果缓存文件不存在,可以通过调用WriteEnumsCache()
函数生成新的缓存文件,确保dede_stepselect
表中有正确的联动数据。
5、Q: 是否可以自定义其他联动类型?
A: 是的,你可以根据需要添加更多的联动类型,只需在相应的模板文件中添加新的选项,并在数据库中创建相应的联动数据表即可。
通过以上详细的步骤和解答,相信您已经掌握了如何在织梦自定义表单中实现城市联动功能,并解决了后台显示问题,如果在实际操作过程中遇到任何问题,欢迎随时提问!