dede搜索结果分页如何实现?

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

DedeCMS 的搜索分页和普通列表页分页原理类似,但实现起来稍微复杂一些,因为它涉及到两个核心文件:

dede搜索结果分页
(图片来源网络,侵删)
  1. 搜索处理页面plus/search.php,负责接收搜索关键词、执行查询,并包含分页的“上一页”、“下一页”等链接。
  2. 搜索结果模板templets/default/search.htm,负责显示搜索到的内容列表和分页导航。

下面我将分步为你讲解如何实现和自定义搜索分页。


第一步:理解核心文件

在修改之前,请务必了解这两个文件的作用:

  • plus/search.php:这是 PHP 脚本,它从 URL 中获取关键词(如 q=织梦typeid=1),然后根据这些条件构建 SQL 查询语句,它调用 GetPageList() 函数生成分页 HTML 代码,并将列表数据传递给模板。
  • templets/default/search.htm:这是 HTML 模板文件,它使用 DedeCMS 的模板标签(如 {dede:list}{dede:arclist})来显示从 search.php 传过来的数据,并使用 {dede:pagelist} 标签来显示分页导航。

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

这是实现分页功能最关键的一步,你需要确保 search.php 正确地获取了分页参数并生成了分页链接。

  1. 找到并修改分页参数获取: 在 plus/search.php 文件中,找到获取当前页码的代码,通常是这样的:

    dede搜索结果分页
    (图片来源网络,侵删)
    // 获取当前页码
    $page = isset($page) && is_numeric($page) ? intval($page) : 1;

    这段代码确保了 $page 变量是一个有效的整数,URL 中没有 page 参数,则默认为第 1 页。

  2. 修改 SQL 查询以支持分页: 找到执行数据库查询的核心部分,你需要修改 SQL 语句,使用 LIMIT 子句来限制每页显示的记录数。

    假设你的查询代码大概长这样(需要根据你的实际情况调整):

    // 原始查询(未分页)
    // $query = "SELECT arc.id, arc.title, arc.litpic, arc.pubdate FROM `dede_archives` arc WHERE arc.title LIKE '%$keyword%'";
    // 修改后的查询(带分页)
    $pageSize = 10; // 每页显示10条记录
    $start = ($page - 1) * $pageSize; // 计算记录偏移量
    $query = "SELECT arc.id, arc.title, arc.litpic, arc.pubdate, CONCAT(arc.typeid,',') AS ids 
              FROM `#@__archives` arc 
              WHERE arc.title LIKE '%$keyword%' 
              ORDER BY arc.id DESC 
              LIMIT $start, $pageSize";
    • $pageSize:定义每页显示的文章数量。
    • $start:计算从数据库的第几条记录开始查询。
    • LIMIT $start, $pageSize:这是 MySQL 的分页语法,LIMIT offset, count
  3. 生成分页链接search.php 文件通常会调用 GetPageList() 函数,你需要确保它正确地传递了所有必要的参数,以便分页链接能正确地跳转。

    查找类似这样的代码(DedeCMS 版本不同,代码可能略有差异):

    // ... 执行查询 $dsql->Execute('me', $query);
    $totalResult = $dsql->GetTotalResult(); // 获取总记录数
    $totalPage = ceil($totalResult / $pageSize); // 计算总页数
    // 调用分页函数
    $pageList = GetPageList($totalPage, $page, $cfg_rewrite == 'Y' ? 'search' : 'plus/search.php', $keyword, $typeid);
    // 将分页HTML和列表数据传递给模板
    $tpl->Assign('pageList', $pageList);
    $tpl->Assign('fields', $dsql->GetArray('me'));
    // ... 其他赋值
    $tpl->Display();
    • GetPageList() 函数需要总页数、当前页、分页基础链接、关键词和栏目ID等信息。
    • cfg_rewrite == 'Y' 判断是否开启了伪静态,这会影响分页链接的生成方式(search/织梦/page/2.html vs plus/search.php?q=织梦&page=2)。

第三步:修改搜索结果模板 (templets/default/search.htm)

在模板文件中,你需要使用两个核心标签:{dede:list} 用于显示文章列表,{dede:pagelist} 用于显示分页导航。

  1. 使用 {dede:list} 显示搜索结果{dede:list} 标签在搜索模板中的用法和列表页类似,它会循环显示 search.php 查询并传递过来的数据。

    <div class="search_result">
      <h2>搜索结果:"{dede:global name='keyword'/}"</h2>
      <ul>
        {dede:list pagesize='10'} 
          <!-- 注意:这里的 pagesize 属性通常会被 search.php 中的 $pageSize 覆盖,但保留也无妨 -->
          <li>
            <a href="[field:arcurl/]">[field:title/]</a>
            <span class="date">([field:pubdate function="MyDate('Y-m-d',@me)"/])</span>
            <p>[field:description/]...</p>
          </li>
        {/dede:list}
      </ul>
    </div>
  2. 使用 {dede:pagelist} 显示分页导航: 这个标签会直接显示 search.php$pageList 变量生成的 HTML 代码。

    <div class="page_nav">
      {dede:pagelist listsize='5' listitem='index pre pageno next end '/}
    </div>
    • listsize='5':显示页码的数量,1 2 3 4 5
    • listitem='...':定义要显示的分页元素,常用值包括:
      • index:首页
      • pre:上一页
      • pageno:页码
      • next:下一页
      • end:尾页
      • option:跳转下拉框

第四步:自定义分页样式(CSS)

{dede:pagelist} 生成的 HTML 结构通常是固定的,你可以通过 CSS 来美化它。

  1. 查看生成的 HTML 结构: 在浏览器中打开一个搜索结果页,然后查看分页导航部分的 HTML 代码,它通常是这样的结构:

    <div class="page_nav">
      <span class="pageinfo">共 <strong>1</strong> 页 <strong>10</strong> 条记录</span>
      <a href="search.php?q=织梦&page=1">首页</a>
      <a href="search.php?q=织梦&page=1">上一页</a>
      <span class="thisclass">1</span>
      <a href="search.php?q=织梦&page=2">2</a>
      <a href="search.php?q=织梦&page=3">3</a>
      ...
      <a href="search.php?q=织梦&page=2">下一页</a>
      <a href="search.php?q=织梦&page=10">尾页</a>
    </div>
  2. 添加 CSS 样式: 在你的模板 CSS 文件(如 templets/default/style/css.css)中,为分页元素添加样式。

    /* 分页容器 */
    .page_nav {
      text-align: center;
      margin: 20px 0;
      font-size: 14px;
    }
    /* 所有分页链接的公共样式 */
    .page_nav a, .page_nav span {
      display: inline-block;
      margin: 0 5px;
      padding: 5px 10px;
      border: 1px solid #ddd;
      color: #666;
      text-decoration: none;
    }
    /* 鼠标悬停效果 */
    .page_nav a:hover {
      background-color: #f8f8f8;
      color: #0066cc;
    }
    /* 当前页码样式 */
    .page_nav .thisclass {
      background-color: #0066cc;
      color: #fff;
      border-color: #0066cc;
      font-weight: bold;
    }
    /* 页面信息样式 */
    .page_nav .pageinfo {
      color: #999;
    }

常见问题与解决方法

  1. 问题:搜索结果页没有分页,或者点击分页后没有变化。

    • 原因plus/search.php 中的分页逻辑有误,或者 $page 参数没有正确传递。
    • 解决:仔细检查 search.php 中的 SQL LIMIT 子句和 GetPageList() 函数的调用。
  2. 问题:分页链接是 search.php?q=关键词&page=2,但网站开启了伪静态,希望是 search/关键词/page/2.html 的形式。

    • 原因:伪静态规则未配置或配置有误。
    • 解决
      1. 确保后台“系统” -> “系统基本参数” -> “选项”中的“是否使用伪静态”是“是”。
      2. 检查网站根目录下的 httpd.ini (IIS) 或 .htaccess (Apache) 文件,确保包含了搜索页的伪静态规则。
      3. 对于 Apache,.htaccess 中通常需要类似这样的规则:
        RewriteRule ^search/(.*)/([0-9]+).html$ /plus/search.php?q=$1&page=$2
        RewriteRule ^search/(.*).html$ /plus/search.php?q=$1
  3. 问题:搜索结果为空,但关键词在文章中确实存在。

    • 原因

      • 关键词是中文,且数据库表使用了 latin1 编码,导致查询失败。
      • 关键词中包含特殊字符(如 , &),没有进行过滤。
    • 解决

      1. 修改 search.php 中的查询语句,使用 dede_filter 函数对关键词进行安全过滤,并确保编码正确。

        // 对关键词进行过滤和编码处理
        $keyword = dede_filter($keyword);
        $keyword = cn_substr($keyword, 20); // 限制关键词长度
        // 修改 SQL,使用 CONCAT 和 FIND_IN_SET 来优化搜索(可选)
        // $query = "SELECT ... WHERE CONCAT(arc.title, arc.keywords) LIKE '%$keyword%'";
      2. 检查数据库字符集,建议统一使用 utf8mb4

实现 DedeCMS 搜索分页的完整流程如下:

  1. 配置 plus/search.php:获取分页参数,修改 SQL 查询加入 LIMIT,调用 GetPageList() 生成链接。
  2. 编辑 templets/default/search.htm:使用 {dede:list} 显示列表,使用 {dede:pagelist} 显示分页导航。
  3. 编写 CSS:美化 {dede:pagelist} 生成的 HTML 结构。

通过以上步骤,你就可以成功地为 DedeCMS 的搜索功能添加分页了,如果遇到问题,优先检查 search.php 的 PHP 逻辑和模板中 {dede:pagelist} 的使用方法。

-- 展开阅读全文 --
头像
织梦列表顶踩数标签如何调用与显示?
« 上一篇 04-20
extern C在C++中到底有什么用?
下一篇 » 04-20

相关文章

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

目录[+]