在DedeCMS中,自定义属性是扩展内容字段功能的重要方式,常用于添加额外的分类信息、标签或规格等,要实现自定义属性的搜索功能,需要结合前端表单提交、后端数据处理及SQL查询优化,以下是详细步骤和注意事项:

需明确自定义属性的存储方式,DedeCMS中,自定义字段通常存储在dede_arcatt
表(用于属性)和dede_addonXX
表(用于附加表,XX为模型ID),若属性为单选或多选,需在模型管理中创建相应的字段类型(如“单选按钮”“多选 checkbox”),并设置选项值。
创建自定义属性并关联数据
- 模型管理:进入“核心”→“内容模型管理”→“添加新模型”,或编辑现有模型,在“字段管理”中添加自定义字段,颜色”字段,类型选择“单选按钮”,选项值填写“红色,绿色,蓝色”。
- 数据录入时,选择对应属性值,数据会存入附加表(如
dede_addon17
)的对应字段(如color
)。
实现搜索功能
前端表单设计
在搜索页面(如search.php
)添加表单元素,
<form action="/search.php" method="get"> <input type="text" name="keyword" placeholder="关键词搜索"> <select name="color"> <option value="">颜色</option> <option value="红色">红色</option> <option value="绿色">绿色</option> </select> <button type="submit">搜索</button> </form>
后端接收参数并处理
修改search.php
文件,在查询前处理自定义属性参数:
if (isset($_GET['color']) && $_GET['color'] != '') { $color = addslashes($_GET['color']); $typeid = isset($_GET['typeid']) ? intval($_GET['typeid']) : 0; $channeltype = isset($_GET['channeltype']) ? intval($_GET['channeltype']) : 0; // 获取附加表字段名(需根据实际模型配置调整) $addtable = GetAddTable($typeid); $addfields = GetAddFields($typeid); $fieldname = 'color'; // 自定义字段名 // 构建SQL查询 $sql = "SELECT a.id,a.title,a.litpic,a.pubdate FROM `dede_archives` a LEFT JOIN `{$addtable}` b ON a.id = aid WHERE a.arctypeid IN (SELECT id FROM `dede_arctype` WHERE reid = {$typeid} OR id = {$typeid}) AND b.{$fieldname} = '{$color}' AND a.channel = {$channeltype}"; $dsql->SetQuery($sql); $dsql->Execute(); while ($row = $dsql->GetArray()) { // 输出搜索结果 } }
优化查询性能
- 索引优化:确保附加表的字段(如
color
)已建立索引,避免全表扫描。 - 分页处理:使用
$dsql->GetTotalRow()
获取总数,并通过$dsql->SetLimit($pageSize, $offset)
实现分页。
多条件组合搜索
若需同时搜索多个自定义属性,可通过AND
或OR
组合条件:

$sql = "SELECT ... WHERE a.title LIKE '%{$keyword}%' AND b.color = '{$color}' AND b.size = '{$size}'";
注意事项
- 字段名匹配:SQL查询中的字段名需与附加表中的实际字段名一致,可通过
DESC dede_addonXX
查看表结构。 - 安全过滤:使用
addslashes()
或$dsql->EscapeString()
防止SQL注入。 - 模型兼容性:不同模型的附加表不同,需动态获取
$addtable
。
相关问答FAQs
Q1:自定义属性为多选时如何搜索?
A:多选字段存储的值为逗号分隔的字符串(如“红色,蓝色”),查询时需使用LIKE
或FIND_IN_SET
函数。SELECT * FROM dede_addon17 WHERE FIND_IN_SET('红色', color)
。
Q2:搜索结果如何分页显示?
A:在查询后添加分页代码,
$total = $dsql->GetTotalRow(); $pageSize = 10; $PageNo = isset($_GET['PageNo']) ? intval($_GET['PageNo']) : 1; $offset = ($PageNo - 1) * $pageSize; $dsql->SetLimit($pageSize, $offset); $PageList = GetPageList($total, $PageNo, $pageSize, '/search.php?color='.$color);
并在模板中输出$PageList
。
