菜鸟科技网

dedecms如何搜索自定义属性,dedecms自定义属性怎么实现搜索功能?

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

dedecms如何搜索自定义属性,dedecms自定义属性怎么实现搜索功能?-图1
(图片来源网络,侵删)

需明确自定义属性的存储方式,DedeCMS中,自定义字段通常存储在dede_arcatt表(用于属性)和dede_addonXX表(用于附加表,XX为模型ID),若属性为单选或多选,需在模型管理中创建相应的字段类型(如“单选按钮”“多选 checkbox”),并设置选项值。

创建自定义属性并关联数据

  1. 模型管理:进入“核心”→“内容模型管理”→“添加新模型”,或编辑现有模型,在“字段管理”中添加自定义字段,颜色”字段,类型选择“单选按钮”,选项值填写“红色,绿色,蓝色”。
  2. 数据录入时,选择对应属性值,数据会存入附加表(如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)实现分页。

多条件组合搜索

若需同时搜索多个自定义属性,可通过ANDOR组合条件:

dedecms如何搜索自定义属性,dedecms自定义属性怎么实现搜索功能?-图2
(图片来源网络,侵删)
$sql = "SELECT ... WHERE a.title LIKE '%{$keyword}%' AND b.color = '{$color}' AND b.size = '{$size}'";

注意事项

  1. 字段名匹配:SQL查询中的字段名需与附加表中的实际字段名一致,可通过DESC dede_addonXX查看表结构。
  2. 安全过滤:使用addslashes()$dsql->EscapeString()防止SQL注入。
  3. 模型兼容性:不同模型的附加表不同,需动态获取$addtable

相关问答FAQs

Q1:自定义属性为多选时如何搜索?
A:多选字段存储的值为逗号分隔的字符串(如“红色,蓝色”),查询时需使用LIKEFIND_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

dedecms如何搜索自定义属性,dedecms自定义属性怎么实现搜索功能?-图3
(图片来源网络,侵删)
分享:
扫描分享到社交APP
上一篇
下一篇