dede搜索调用自定义

99ANYc3cd6
预计阅读时长 18 分钟
位置: 首页 DEDE建站 正文

使用自定义表单(强烈推荐)

这种方法的核心思想是:不使用DedeCMS自带的search.php,而是创建一个独立的搜索页面,这个页面接收用户输入,然后直接操作数据库进行查询。

步骤详解:

第1步:创建自定义表单(作为搜索输入页)

  1. 登录后台:进入DedeCMS后台。

  2. 找到功能:在左侧菜单栏找到 核心 -> 自定义表单

  3. 添加表单

    • 点击 增加自定义表单
    • 表单名称:填写一个你容易识别的名称,高级搜索”。
    • 数据表:系统会自动创建一个名为 dede_addonexample 的表,我们不用管它,这个表单只是用来生成一个搜索页面框架。
    • 默认列表页面模板留空,因为我们不需要默认的列表页。
    • 保存
  4. 生成搜索页面

    • 在自定义表单列表中,找到你刚创建的“高级搜索”,点击后面的 管理 -> 生成HTML
    • 在弹出的页面中,点击 开始生成,这会在你网站的根目录生成一个名为 plus 的文件夹,里面包含一个 list.php 文件,plus/list.php?tid=1tid是你的自定义表单ID)。
    • 记录下这个页面的URLhttp://你的网站.com/plus/list.php?tid=1,这就是你的搜索入口页面。

第2步:修改搜索页面模板

  1. 找到模板文件:在后台 模板 -> 自定义模板 中,找到你刚刚生成的模板文件,它的路径通常是 templets/default/list_加上你的tid.phptemplets/default/list_1.php

  2. 编辑模板:打开这个文件,删除里面默认的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>

    说明

    • formaction 属性指向一个我们即将创建的PHP处理文件/search-result.php
    • inputselectname 属性非常重要,它们是PHP接收数据的键名。

第3步:创建搜索结果处理页面

  1. 创建文件:在你的网站根目录下,创建一个名为 search-result.php 的文件。

  2. 编写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的核心文件和搜索类,确保环境正确。
    • HtmlReplaceintval 用于过滤用户输入,防止SQL注入。
    • GetSonIds() 是DedeCMS的内置函数,用于获取一个分类及其所有子分类的ID。
    • 我们创建了一个 Search 对象,设置了关键词、附加条件,然后调用 Display() 方法来输出结果。Display() 方法会自动加载 templets/default/search.htm 模板来显示结果。

第4步:修改搜索结果模板(可选)

如果你想自定义搜索结果的样式,可以编辑 templets/default/search.htm 文件,里面的标签和列表页模板(如 list_article.htm)基本一致,如 {dede:list} 等。


修改核心 search.php 文件(不推荐,需谨慎)

这种方法是直接修改DedeCMS的搜索核心文件,适用于对系统有一定了解,且愿意承担升级后需要重新修改风险的开发者。

步骤:

  1. 找到文件include/arc.searchview.class.php,这是处理搜索逻辑的核心类文件。
  2. 修改 ParseDM 函数:这个函数用于解析搜索模板中的标签,你可以在这里添加自定义的SQL查询逻辑。
  3. 修改 GetKeywordSql 函数:这个函数用于生成关键词的SQL条件,你可以在这里增加对自定义字段或条件的支持。

⚠️ 重要警告

  • 升级风险:每次DedeCMS升级后,这个文件很可能会被覆盖,你需要手动重新修改。
  • 复杂性高:直接修改核心文件需要你对PHP、MySQL和DedeCMS的内部结构有深入的了解。
  • 不安全:如果修改不当,很容易引入安全漏洞(如SQL注入)。

除非你有特殊需求(需要与DedeCMS的标签系统深度集成),否则强烈建议使用方法一


总结与对比

特性 自定义表单 修改核心文件
安全性 ,代码独立,不触碰核心,影响面小。 ,修改核心文件,容易引入漏洞,风险大。
稳定性 ,与DedeCMS升级无关,非常稳定。 ,每次升级后都需要重新修改,维护成本高。
灵活性 ,可以完全自由地构建搜索条件和结果页。 中等,受限于原有代码结构,修改点固定。
技术门槛 中等,需要了解PHP基础和数据库查询。 ,需要深入理解DedeCMS源码和架构。
推荐度 ⭐⭐⭐⭐⭐ (强烈推荐) ⭐ (仅限专家,且不推荐)

对于绝大多数用户和开发者来说,使用自定义表单的方法是实现DedeCMS自定义搜索的最佳实践,它安全、稳定,且能实现绝大多数自定义搜索的需求。

-- 展开阅读全文 --
头像
C语言如何求1到20的阶乘和?
« 上一篇 03-28
dede采集自定义字段
下一篇 » 03-28

相关文章

取消
微信二维码
支付宝二维码

目录[+]