在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。

(图片来源网络,侵删)
文章来源网络,作者:运维,如若转载,请注明出处:https://shuyeidc.com/wp/353394.html<
