dede搜索如何指定内容模型?

99ANYc3cd6
预计阅读时长 21 分钟
位置: 首页 DEDE建站 正文
  1. 搜索页面模板文件 (search.php):用于添加模型选择的下拉菜单。
  2. 搜索处理程序文件 (plus/search.php):用于接收模型选择参数,并修改搜索逻辑。

操作步骤详解

第一步:修改搜索页面模板 (search.php)

这个文件是用户在网站上看到的搜索框所在的页面,我们需要在这里添加一个 <select> 下拉菜单,让用户可以选择内容模型。

dede搜索 指定内容模型
(图片来源网络,侵删)
  1. 定位文件 登录你的 DedeCMS 后台,在 /templets/default/ 目录下找到 search.php 文件,如果你的网站使用了其他模板,请在你自己的模板目录下寻找。

  2. 找到搜索表单search.php 文件中,找到包含搜索输入框 <input type="text"><form> 表单,通常代码看起来像这样:

    <form name="formsearch" action="{dede:global.cfg_cmspath/}/plus/search.php" method="get">
      <div class="form-search">
        <input type="hidden" name="kwtype" value="0" />
        <input type="hidden" name="searchtype" value="titlekeyword" />
        <input type="text" name="q" class="input-text" placeholder="请输入搜索关键词">
        <button type="submit" class="btn">搜索</button>
      </div>
    </form>
  3. 添加模型选择下拉菜单<input type="text"> 输入框和 <button> 按钮之间,添加一个 <select> 下拉菜单,为了动态获取所有模型,我们需要使用 DedeCMS 的标签 {dede:channel}

    修改后的代码示例:

    dede搜索 指定内容模型
    (图片来源网络,侵删)
    <form name="formsearch" action="{dede:global.cfg_cmspath/}/plus/search.php" method="get">
      <div class="form-search">
        <!-- 原有的隐藏字段,可以保留或根据需要修改 -->
        <input type="hidden" name="kwtype" value="0" />
        <input type="hidden" name="searchtype" value="titlekeyword" />
        <!-- 添加模型选择下拉菜单 -->
        <select name="channeltype" id="channeltype" style="width: 120px; margin-right: 10px;">
          <option value="0">全部模型</option>
          <!-- 这里使用 dede:channel 标签来循环出所有内容模型 -->
          <!-- typeid='top' 表示只获取顶级栏目,即内容模型 -->
          <!-- noself='yes' 表示不包含当前栏目(这里不适用,但可以防止一些意外) -->
          {dede:channel type='self' row='10' noself='yes'}
          <option value="[field:id/]">[field:typename/]</option>
          {/dede:channel}
        </select>
        <input type="text" name="q" class="input-text" placeholder="请输入搜索关键词">
        <button type="submit" class="btn">搜索</button>
      </div>
    </form>

    代码解释:

    • <select name="channeltype">:我们给这个下拉菜单命名为 channeltype,这个名字非常重要,我们将在 plus/search.php 中使用它。
    • <option value="0">全部模型</option>:提供一个默认选项,value="0" 代表搜索所有模型。
    • {dede:channel ...}:这是一个 DedeCMS 的循环标签,它会从数据库中读取所有内容模型(顶级栏目)。
    • [field:id/]:获取模型的 ID,作为 <option>value 值。
    • [field:typename/]:获取模型的名称,作为显示给用户看的内容。
  4. 保存并上传 修改完成后,保存 search.php 文件并上传到你的服务器 /templets/default/ 目录下,你的搜索页面就已经有了模型选择的下拉菜单。


第二步:修改搜索处理程序 (plus/search.php)

这个文件是处理搜索请求的 PHP 脚本,我们需要修改它,使其能够识别用户选择的 channeltype,并只在该模型对应的栏目中进行搜索。

  1. 定位文件 通过 FTP 或文件管理器,进入网站的 /plus/ 目录,找到 search.php 文件。

    dede搜索 指定内容模型
    (图片来源网络,侵删)
  2. 找到并修改 SQL 查询语句search.php 文件中,找到执行数据库查询的核心代码,通常在一个 if 条件判断中,if($typeid > 0),我们需要修改的是构建 arc.typeid 条件的 SQL 语句。

    原始代码(大概位置): 你需要找到类似下面这样的代码段,特别是 $addquery 这个变量。

    // ... 其他代码 ...
    if($typeid > 0)
    {
        $typeid = GetSonIds($typeid);
        $addquery = " And arc.typeid in($typeid) ";
    }
    // ... 其他代码 ...
    $query = "Select arc.*,tp.typedir,tp.typename,tp.corank,tp.isdefault,tp.defaultname,
              tp.namerule,tp.namerule2,tp.ispart,tp.moresite,tp.siteurl,tp.sitepath
              From `dede_archives` arc left join `dede_arctype` tp on arc.typeid=tp.id
              where 1=1 $addquery $ordersql limit $startrow,$pagesize";
    // ... 其他代码 ...
  3. 添加模型判断逻辑 我们需要在 $typeid 的判断之后,增加一个对 channeltype 的判断。channeltype 不为 0,我们就构建一个新的查询条件。

    修改后的代码示例:if($typeid > 0)if 语句之后,else 语句之前(如果没有 else,就直接在 if 语句后面),添加如下代码:

    // ... 其他代码 ...
    // 原有的 typeid 判断
    if($typeid > 0)
    {
        $typeid = GetSonIds($typeid);
        $addquery = " And arc.typeid in($typeid) ";
    }
    // 新增的 channeltype 判断
    else if(!empty($channeltype) && $channeltype != 0)
    {
        // 获取该模型下的所有栏目ID
        $channeltype = GetSonIds($channeltype);
        $addquery = " And arc.typeid in($channeltype) ";
    }
    // ... 其他代码 ...
    // 最终的查询语句保持不变,$addquery 会根据上面的逻辑被正确赋值
    $query = "Select arc.*,tp.typedir,tp.typename,tp.corank,tp.isdefault,tp.defaultname,
              tp.namerule,tp.namerule2,tp.ispart,tp.moresite,tp.siteurl,tp.sitepath
              From `dede_archives` arc left join `dede_arctype` tp on arc.typeid=tp.id
              where 1=1 $addquery $ordersql limit $startrow,$pagesize";
    // ... 其他代码 ...

    代码解释:

    • else if(!empty($channeltype) && $channeltype != 0):这个判断的含义是:“$channeltype 变量存在,并且它的值不等于 0(即不是‘全部模型’选项)”。
    • $channeltype = GetSonIds($channeltype);GetSonIds() 是 DedeCMS 的一个核心函数,用于获取一个栏目及其所有子栏目的 ID,这里我们用它来获取用户选择的模型(它本身是一个顶级栏目)下的所有栏目 ID。
    • $addquery = " And arc.typeid in($channeltype) ";:构建 SQL 查询的 WHERE 条件,这条语句的意思是,只搜索 arc.typeid(文章的栏目ID)在 $channeltype(模型下的所有栏目ID)列表中的文章。
  4. 保存并上传 修改完成后,保存 plus/search.php 文件并上传到服务器的 /plus/ 目录下。


完成!

你已经成功地为 DedeCMS 的搜索功能添加了“指定内容模型”的能力。

测试流程:

  1. 访问你的搜索页面 (search.php)。
  2. 在下拉菜单中选择一个内容模型(产品”)。
  3. 在搜索框中输入一个关键词,并点击搜索。
  4. 查看搜索结果,你会发现结果中只包含了属于“产品”模型及其子栏目的内容。

如果选择“全部模型”,则会进行全局搜索,与原来一样。

注意事项

  • 备份数据:在修改任何核心文件之前,请务必备份原始的 search.php 文件,以防出错可以快速恢复。
  • 权限问题:确保你的服务器对 /plus/search.php 文件有写入权限,以便上传修改后的文件。
  • 模板引擎:如果你的网站开启了模板编译缓存,修改 search.php 模板后可能需要清空缓存才能看到效果。
  • 代码兼容性:以上代码是基于 DedeCMS 5.7 版本的经典内核,如果你使用的是更早或更晚的版本,代码行号可能会有差异,但核心逻辑是相同的,请根据你实际的文件结构进行调整。
-- 展开阅读全文 --
头像
C语言continue语句具体作用是什么?
« 上一篇 今天
C语言如何编写Windows程序?
下一篇 » 今天

相关文章

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

目录[+]