使用自定义表单(强烈推荐)
这种方法的核心思想是:不使用DedeCMS自带的search.php,而是创建一个独立的搜索页面,这个页面接收用户输入,然后直接操作数据库进行查询。
步骤详解:
第1步:创建自定义表单(作为搜索输入页)
-
登录后台:进入DedeCMS后台。
-
找到功能:在左侧菜单栏找到
核心->自定义表单。 -
添加表单:
- 点击
增加自定义表单。 - 表单名称:填写一个你容易识别的名称,高级搜索”。
- 数据表:系统会自动创建一个名为
dede_addonexample的表,我们不用管它,这个表单只是用来生成一个搜索页面框架。 - 默认列表页面模板:留空,因为我们不需要默认的列表页。
- 保存。
- 点击
-
生成搜索页面:
- 在自定义表单列表中,找到你刚创建的“高级搜索”,点击后面的
管理->生成HTML。 - 在弹出的页面中,点击
开始生成,这会在你网站的根目录生成一个名为plus的文件夹,里面包含一个list.php文件,plus/list.php?tid=1(tid是你的自定义表单ID)。 - 记录下这个页面的URL,
http://你的网站.com/plus/list.php?tid=1,这就是你的搜索入口页面。
- 在自定义表单列表中,找到你刚创建的“高级搜索”,点击后面的
第2步:修改搜索页面模板
-
找到模板文件:在后台
模板->自定义模板中,找到你刚刚生成的模板文件,它的路径通常是templets/default/list_加上你的tid.php,templets/default/list_1.php。 -
编辑模板:打开这个文件,删除里面默认的DedeCMS列表标签,替换为你自己的搜索表单HTML代码。
示例代码 (
list_1.php):<!DOCTYPE html> <html> <head> <meta charset="utf-8">自定义搜索</title> </head> <body> <h1>文章搜索</h1> <form action="/search-result.php" method="get"> <!-- 搜索关键词 --> <input type="text" name="keyword" placeholder="请输入关键词"> <!-- 分类筛选 (下拉选择) --> <select name="typeid"> <option value="0">所有分类</option> {dede:channel type='son' noself='yes'} <option value="[field:id/]">[field:typename/]</option> {/dede:channel} </select> <!-- 发布时间筛选 (单选) --> <label><input type="radio" name="time" value="all" checked> 所有时间</label> <label><input type="radio" name="time" value="today"> lt;/label> <label><input type="radio" name="time" value="week"> 本周</label> <label><input type="radio" name="time" value="month"> 本月</label> <button type="submit">搜索</button> </form> </body> </html>说明:
form的action属性指向一个我们即将创建的PHP处理文件,/search-result.php。input和select的name属性非常重要,它们是PHP接收数据的键名。
第3步:创建搜索结果处理页面
-
创建文件:在你的网站根目录下,创建一个名为
search-result.php的文件。 -
编写PHP代码:在这个文件中,编写接收表单数据、查询数据库并显示结果的逻辑。
示例代码 (
search-result.php):<?php require_once (dirname(__FILE__) . "/include/common.inc.php"); require_once DEDEINC."/arc.search.class.php"; // 1. 接收并过滤搜索参数 $keyword = isset($_GET['keyword']) ? trim(HtmlReplace($_GET['keyword'], -1)) : ''; $typeid = isset($_GET['typeid']) ? intval($_GET['typeid']) : 0; $time = isset($_GET['time']) ? trim($_GET['time']) : 'all'; // 如果没有关键词,则跳转到搜索首页或提示 if (empty($keyword)) { ShowMsg('请输入搜索关键词!', '-1'); exit(); } // 2. 构建搜索条件 $addquery = " arc.arctypeid IN ($typeid)"; // 分类条件,typeid为0时,这个条件会无效,所以需要处理 if ($typeid > 0) { // 如果选择了特定分类,需要获取其所有子分类ID $typeid .= GetSonIds($typeid); $addquery = " arc.arctypeid IN ($typeid)"; } // 时间条件 $timeday = 0; if ($time == 'today') { $timeday = 1; } elseif ($time == 'week') { $timeday = 7; } elseif ($time == 'month') { $timeday = 30; } if ($timeday > 0) { $addquery .= " AND arc.senddate > " . (time() - 3600 * 24 * $timeday); } // 3. 使用DedeCMS自带的搜索类 $search = new Search(); $search->Init(); $search->SetQuery($keyword, $addquery); $search->Display(); ?>代码说明:
require_once引入了DedeCMS的核心文件和搜索类,确保环境正确。HtmlReplace和intval用于过滤用户输入,防止SQL注入。GetSonIds()是DedeCMS的内置函数,用于获取一个分类及其所有子分类的ID。- 我们创建了一个
Search对象,设置了关键词、附加条件,然后调用Display()方法来输出结果。Display()方法会自动加载templets/default/search.htm模板来显示结果。
第4步:修改搜索结果模板(可选)
如果你想自定义搜索结果的样式,可以编辑 templets/default/search.htm 文件,里面的标签和列表页模板(如 list_article.htm)基本一致,如 {dede:list} 等。
修改核心 search.php 文件(不推荐,需谨慎)
这种方法是直接修改DedeCMS的搜索核心文件,适用于对系统有一定了解,且愿意承担升级后需要重新修改风险的开发者。
步骤:
- 找到文件:
include/arc.searchview.class.php,这是处理搜索逻辑的核心类文件。 - 修改
ParseDM函数:这个函数用于解析搜索模板中的标签,你可以在这里添加自定义的SQL查询逻辑。 - 修改
GetKeywordSql函数:这个函数用于生成关键词的SQL条件,你可以在这里增加对自定义字段或条件的支持。
⚠️ 重要警告:
- 升级风险:每次DedeCMS升级后,这个文件很可能会被覆盖,你需要手动重新修改。
- 复杂性高:直接修改核心文件需要你对PHP、MySQL和DedeCMS的内部结构有深入的了解。
- 不安全:如果修改不当,很容易引入安全漏洞(如SQL注入)。
除非你有特殊需求(需要与DedeCMS的标签系统深度集成),否则强烈建议使用方法一。
总结与对比
| 特性 | 自定义表单 | 修改核心文件 |
|---|---|---|
| 安全性 | 高,代码独立,不触碰核心,影响面小。 | 低,修改核心文件,容易引入漏洞,风险大。 |
| 稳定性 | 高,与DedeCMS升级无关,非常稳定。 | 低,每次升级后都需要重新修改,维护成本高。 |
| 灵活性 | 高,可以完全自由地构建搜索条件和结果页。 | 中等,受限于原有代码结构,修改点固定。 |
| 技术门槛 | 中等,需要了解PHP基础和数据库查询。 | 高,需要深入理解DedeCMS源码和架构。 |
| 推荐度 | ⭐⭐⭐⭐⭐ (强烈推荐) | ⭐ (仅限专家,且不推荐) |
对于绝大多数用户和开发者来说,使用自定义表单的方法是实现DedeCMS自定义搜索的最佳实践,它安全、稳定,且能实现绝大多数自定义搜索的需求。
