DedeCMS 的地区功能主要用于文章、商品、会员等信息附加一个地理位置属性,比如籍贯、所在地、发货地等,它通常通过一个下拉联动菜单来实现,选择方便。
下面我将为您详细拆解这个功能,包括它是什么、如何设置、如何调用以及常见问题的解决方法。
核心概念:nativeplace 是什么?
在 DedeCMS 的数据表结构中,nativeplace 字段通常存储的是 地区的 ID 编号,而不是具体的地区名称(如“北京市”、“上海市”)。
- :一个数字 ID,
1, 2, 35。 - 对应关系:这个 ID 对应 DedeCMS 后台的 “系统 -> 地区管理” 中设定的地区层级。
- 一级地区(如:省份): ID
1 - 二级地区(如:城市): ID
2 - 三级地区(如:区县): ID
35
- 一级地区(如:省份): ID
这种设计的好处是,地区信息可以无限级扩展,并且通过 ID 关联,查询和调用效率高。
如何设置和使用地区功能?
步骤 1:在后台管理地区
- 登录 DedeCMS 后台。
- 进入 “系统” -> “地区管理”。
- 您可以添加、编辑、删除各级别的地区,先添加“广东省”(一级),再添加“深圳市”(二级,隶属于广东省),最后添加“南山区”(三级,隶属于深圳市)。
步骤 2:在模型中添加 nativeplace 字段
这个字段需要添加到您使用的内容模型中(例如文章模型、产品模型)。
- 进入 “核心” -> “内容模型管理”。
- 选择您要修改的模型(如“文章系统模型”),点击 “字段管理”。
- 点击 “添加新字段”。
- 填写字段信息:
- 字段名称:
nativeplace(必须小写,这是系统约定的) - 字段说明:籍贯 / 所在地 (这个会在后台表单中显示)
- 字段类型:
联动类型(这是最关键的一步!) - 是否显示在发布页:选择“是”
- 设置联动类型参数:
- 联动类型:选择您在“地区管理”中创建的联动类型,如果后台没有,您可能需要先创建一个“地区”的联动类型,通常系统会默认提供。
- 前台显示:选择“下拉菜单”或“下拉联动菜单”。
- 字段名称:
- 保存字段设置。
步骤 3:在前台调用地区信息
添加字段后,在发布内容时,您就可以在后台看到“籍贯”或“所在地”的下拉菜单了,接下来是如何在前台模板中把它显示出来。
假设您的文章列表或内容页中,有一个变量 nativeplace 存储了地区 ID(1,2,35)。
方法 1:使用 GetAreaName 函数(推荐)
这是最简单、最直接的方法,DedeCMS 提供了一个内置函数 GetAreaName,可以根据地区 ID 字符串自动获取完整的地区名称。
语法:
{dede:field.nativeplace function='GetAreaName(@me)'/}
示例:
假设 nativeplace 的值是 1,2,35,使用上述标签后,前台会直接显示:
广东省 > 深圳市 > 南山区
方法 2:手动获取(适用于需要自定义逻辑时)
如果您想分别获取一级、二级、三级地区,可以手动获取。
语法:
{dede:field.nativeplace runphp='yes'}
// 获取第一个ID(一级地区)
$province = GetOneArea(@me);
// 获取第二个ID(二级地区)
$city = GetOneArea(explode(',', @me)[1]);
// 获取第三个ID(三级地区)
$district = GetOneArea(explode(',', @me)[2]);
// 输出
@me = $province . ' ' . $city . ' ' . $district;
{/dede:field.nativeplace}
这种方法比较灵活,但 GetAreaName 函数通常已经能满足大部分需求。
常见问题与解决方案 (FAQ)
问题:前台显示的是地区 ID,而不是名称(例如显示 1,2 而不是 北京市,上海市)。
原因:这是最常见的问题,通常是因为:
- 标签使用错误:直接使用了
{dede:field.nativeplace/},而没有用GetAreaName函数处理。 - 字段类型错误:在添加字段时,没有选择“联动类型”,而是选择了“文本”或其他类型。
解决方案:
- 检查字段类型:确保
nativeplace字段的类型是“联动类型”。 - 修改模板标签:将
{dede:field.nativeplace/}修改为{dede:field.nativeplace function='GetAreaName(@me)'/}。
问题:GetAreaName 函数无效或报错。
原因:
- 函数名称拼写错误。
- 服务器环境问题,导致函数未被正确加载(可能性较小)。
- 地区 ID 不存在。
解决方案:
- 检查拼写:确保是
GetAreaName,而不是getareaname或其他。 - 检查 ID:在后台“地区管理”中确认这些 ID 是否存在。
- 使用备用方案:尝试使用上面提到的“手动获取”方法。
问题:如何进行地区筛选(按地区搜索)?
这需要修改列表页的表单和接收参数的代码。
-
修改列表页模板 (
list_artlist.htm等): 在搜索表单中,添加一个联动菜单。<form name="search" action="/plus/search.php" method="get"> <!-- 其他搜索条件 --> <select name="nativeplace"> <option value="">请选择地区</option> {dede:channel type='top' currentstyle="<option value='~typeid~' selected>~typename~</option>"} <option value="[field:id/]">[field:typename/]</option> {/dede:channel} </select> <button type="submit">搜索</button> </form>注意:上面的例子是一个简化版,真正的联动菜单需要更复杂的 JS 来实现二级、三级联动,您可以在网上搜索“DedeCMS 联动菜单代码”找到完整的实现。
-
修改
search.php文件: 找到处理搜索请求的代码部分,增加对nativeplace参数的处理,并修改 SQL 查询语句。// 在 search.php 中找到类似 $typeid = isset($typeid) ? intval($typeid) : 0; 的地方 $nativeplace = isset($nativeplace) ? trim($nativeplace) : ''; // 修改查询 $sql 的 where 条件 if ($nativeplace != '') { // 注意:这里需要将 '1,2' 这样的字符串转换成 SQL 能识别的 IN 查询 // 并且要确保 nativeplace 字段是文本类型 $sql .= " AND arc.nativeplace LIKE '%$nativeplace%' "; // 或者,如果存储的是精确的ID列表,并且需要精确匹配 // $sql .= " AND FIND_IN_SET('$nativeplace', arc.nativeplace) "; }注意:SQL 修改部分需要根据您实际的数据结构和需求来写,并且要注意 SQL 注入风险。
| 功能点 | 关键操作 | 核心代码/标签 |
|---|---|---|
| 后台设置 | 在模型中添加 nativeplace 字段,类型为联动类型 |
后台:系统 -> 地区管理 & 核心 -> 内容模型管理 |
| 前台显示 | 使用 GetAreaName 函数将 ID 转换为名称 |
{dede:field.nativeplace function='GetAreaName(@me)'/} |
| 地区筛选 | 修改列表页表单和 search.php 逻辑 |
表单:<select name="nativeplace"> PHP: $sql .= " AND ..."; |
希望这份详细的指南能帮助您完全理解和使用 DedeCMS 的 nativeplace 功能!如果您有更具体的问题,可以随时提出。
