织梦搜索页pagelist标签如何实现分页?

99ANYc3cd6
预计阅读时长 32 分钟
位置: 首页 织梦建站 正文

搜索页的分页与普通列表页(如文章列表、产品列表)的分页在实现原理上基本一致,但关键区别在于如何获取搜索条件,并将其传递给分页链接。

织梦 搜索页 pagelist
(图片来源网络,侵删)

下面我将分步讲解,从核心代码到完整示例,确保你能成功实现。


核心原理

分页的核心是两个函数:

  1. GetArcList(): 用于获取当前页的数据(文章列表)。
  2. GetPageList(): 用于生成分页的HTML代码(页码、上一页/下一页等)。

对于搜索页,最重要的就是要确保在生成分页链接时,用户输入的关键词能够被正确地附加到每一个页码链接的URL后面。


第一步:修改搜索页模板文件

你需要修改织梦默认的搜索页模板,通常是 /templets/default/search.htm

织梦 搜索页 pagelist
(图片来源网络,侵删)

获取并传递搜索关键词

在调用分页函数之前,必须先获取到用户搜索的关键词,织梦会通过 dedesearch 这个全局变量来传递搜索参数。

在模板的适当位置(通常是循环列表之前)加入以下PHP代码:

{dede:php}
    // 获取搜索关键词,并进行安全处理
    $keyword = isset($dedesearch['keyword']) ? htmlspecialchars($dedesearch['keyword']) : '';
    // 将关键词赋值给一个PHP变量,供后续分页函数使用
    // 这里的 $searchkey 会在调用 GetPageList 时被用到
    $searchkey = $keyword;
{/dede:php}

代码解释:

  • isset($dedesearch['keyword']): 判断是否存在搜索关键词。
  • htmlspecialchars(): 对关键词进行HTML实体转义,防止XSS攻击。
  • $searchkey = $keyword;: 将处理后的关键词赋值给 $searchkey 变量,这个变量名将在分页函数中被引用。

调用 GetArcList 获取搜索结果

使用 {dede:arclist} 标签来获取当前页的搜索结果数据。arclist 标签本身并不直接支持搜索,所以我们需要结合 {dede:php}GetArcList 函数来实现。

{dede:php}
    // 设置每页显示条数
    $pagesize = 10;
    // 获取当前页码
    $page = isset($pageno) ? intval($pageno) : 1;
    // 计算总条数 (这里需要一个能统计搜索结果总数的函数,我们后面会提供)
    $total_result = SearchTotal($searchkey);
    $totalpage = ceil($total_result / $pagesize);
    // 如果当前页码大于总页数,则跳转到最后一页
    if($page > $totalpage) $page = $totalpage;
    // 调用 GetArcList 获取当前页数据
    // 注意:这里的关键词参数需要根据你的织梦版本和实际情况调整
    // 通用写法是传入 'keyword' => $searchkey
    $arcList = GetArcList(
        $typeid = 0,        // 搜索所有栏目,0表示不限制
        $channel = 0,       // 搜索所有模型,0表示不限制
        $flag = '',         // 标志位,空表示不限制
        $orderby = 'id desc',// 按ID降序排列
        $ismake = 0,        // 是否生成静态,0为否
        $innertext = '',    // 模板内代码,留空
        $arcids = '',       // 文章ID,留空
        $channeltype = '',  // 模型ID,留空
        $limit = ($page - 1) * $pagesize . ',' . $pagesize, // 分页限制
        $att = '',          // 属性,留空
        $keyword = $searchkey // 【核心】传入搜索关键词
    );
    // 循环输出文章列表
    foreach($arcList as $a) {
        // 设置文章相关信息,以便在模板中使用
        $fields = GetOneArchive($a['id']);
        $a['arcurl'] = $fields['arcurl'];
        $a['typeurl'] = GetTypeUrl($a['typeid'], $a['typedir'], $a['isdefault'], $a['namerule'], $a['moresite'], $a['siteurl'], $a['defaultname']);
        // 将当前文章数据赋值给 $fields,供 {dede:field} 等标签使用
        // 注意:这需要在 {dede:php} 标签内使用 echo 来输出
        // 更好的方式是直接在这里处理,然后将结果输出到模板变量
        // 这里为了简化,我们直接输出HTML
        echo '<li><a href="'.$a['arcurl'].'">'.$a['title'].'</a></li>';
    }
{/dede:php}

注意: 上述 GetArcListkeyword 参数在某些旧版本的织梦中可能不起作用,如果无效,请尝试以下方法:

方法A:使用 Select 查询(更可靠)

GetArcList 不支持 keyword 参数,可以直接用SQL查询。

{dede:php}
    $pagesize = 10;
    $page = isset($pageno) ? intval($pageno) : 1;
    $searchkey = isset($dedesearch['keyword']) ? htmlspecialchars($dedesearch['keyword']) : '';
    // 构建基础查询
    $addquery = " WHERE arcrank > -1 ";
    if (!empty($searchkey)) {
        // 使用 CONCAT 连接标题和内容进行模糊搜索
        $addquery .= " AND (title LIKE '%$searchkey%' OR body LIKE '%$searchkey%') ";
    }
    // 获取总记录数
    $dsql->SetQuery("SELECT COUNT(*) as dd FROM `dede_archives` $addquery");
    $dsql->Execute();
    $total_result = $dsql->GetArray('dd');
    $total_result = $total_result['dd'];
    $totalpage = ceil($total_result / $pagesize);
    if($page > $totalpage) $page = $totalpage;
    // 获取当前页数据
    $limitstart = ($page - 1) * $pagesize;
    $dsql->SetQuery("SELECT * FROM `dede_archives` $addquery ORDER BY id DESC LIMIT $limitstart, $pagesize");
    $dsql->Execute();
    while($row = $dsql->GetArray()){
        $arcRow = GetOneArchive($row['id']);
        echo '<li><a href="'.$arcRow['arcurl'].'">'.$row['title'].'</a></li>';
    }
{/dede:php}

调用 GetPageList 生成分页导航

在文章列表输出之后,调用 GetPageList 函数来生成分页链接。

<div class="pagelist">
    {dede:php}
        // 调用 GetPageList 生成分页
        // 参数说明:
        // 1. $list_len: 页码显示数量,如 5 表示显示 ... 1 2 3 4 5 ...
        // 2. $listitem: 显示的项目,如 'info,index,pre,next,pageno'
        // 3. $listitemstyle: 项目之间的分隔符
        // 4. $searchkey: 【核心】要附加到URL上的搜索关键词
        $page_list = GetPageList(
            $list_len = 5,
            $listitem = 'info,index,pre,next,pageno',
            $listitemstyle = '',
            $searchkey = $searchkey // 使用之前定义的变量
        );
        echo $page_list;
    {/dede:php}
</div>

代码解释:

  • GetPageList 的第四个参数 $searchkey 是关键,它会将这个值附加到每个页码链接的末尾,格式为 ?q=关键词
  • GetPageList 函数内部会处理URL的构建,确保搜索参数不会丢失。

第二步:完善搜索结果总数统计函数

在第一步的代码中,我们用到了 SearchTotal($searchkey) 函数来获取搜索结果总数,这个函数在织梦默认环境中并不存在,所以我们需要手动添加。

打开 /include/extend.func.php 文件(如果不存在,请创建),在文件末尾添加以下函数:

/**
 * 统计搜索结果总数
 * @param string $keyword 搜索关键词
 * @return int
 */
function SearchTotal($keyword = '')
{
    global $dsql;
    $addquery = " WHERE arcrank > -1 ";
    if (!empty($keyword)) {
        $addquery .= " AND (title LIKE '%$keyword%' OR body LIKE '%$keyword%') ";
    }
    $dsql->SetQuery("SELECT COUNT(*) as dd FROM `dede_archives` $addquery");
    $dsql->Execute();
    $row = $dsql->GetArray();
    return $row['dd'];
}

重要提示:

  • 这个函数使用了 LIKE 模糊查询,对于大型网站,效率可能不高。
  • 更高效的方式是使用织梦自带的 全文索引 功能,但这需要配置 MySQL 的 FULLTEXT 索引,如果你的网站数据量很大,强烈建议研究并配置全文索引来优化搜索性能。

第三步:完整 search.htm 模板示例

将以上所有部分组合起来,一个功能完整的搜索页模板 search.htm 如下:

<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">搜索结果 - {dede:global.cfg_webname/}</title>
</head>
<body>
    <h1>搜索结果</h1>
    <!-- 1. 获取并传递搜索关键词 -->
    {dede:php}
        $keyword = isset($dedesearch['keyword']) ? htmlspecialchars($dedesearch['keyword']) : '';
        $searchkey = $keyword;
    {/dede:php}
    <p>您搜索的关键词是:<strong>{dede:php}echo $keyword;{/dede:php}</strong></p>
    <ul>
        <!-- 2. 调用 GetArcList 获取搜索结果 -->
        {dede:php}
            $pagesize = 10;
            $page = isset($pageno) ? intval($pageno) : 1;
            $total_result = SearchTotal($searchkey);
            $totalpage = ceil($total_result / $pagesize);
            if($page > $totalpage) $page = $totalpage;
            if($page < 1) $page = 1;
            // 使用可靠的SQL查询方式
            $limitstart = ($page - 1) * $pagesize;
            $addquery = " WHERE arcrank > -1 ";
            if (!empty($searchkey)) {
                $addquery .= " AND (title LIKE '%$searchkey%') "; // 为了效率,只搜索标题
            }
            $dsql->SetQuery("SELECT * FROM `dede_archives` $addquery ORDER BY id DESC LIMIT $limitstart, $pagesize");
            $dsql->Execute();
            while($row = $dsql->GetArray()){
                $arcRow = GetOneArchive($row['id']);
                echo '<li><a href="'.$arcRow['arcurl'].'" target="_blank">'.$row['title'].'</a></li>';
            }
        {/dede:php}
    </ul>
    <!-- 3. 调用 GetPageList 生成分页导航 -->
    {if $totalpage > 1}
    <div class="pagelist">
        {dede:php}
            echo GetPageList(5, 'info,index,pre,next,pageno', '', $searchkey);
        {/dede:php}
    </div>
    {/if}
</body>
</html>

常见问题与解决方案

Q1: 分页链接没有带上搜索关键词,导致点击第二页后搜索结果消失。 A: 这是最常见的问题,请确保:

  1. 在模板中正确获取了 $searchkey
  2. 在调用 GetPageList 时,第四个参数正确传入了 $searchkey
  3. 检查你的搜索表单提交方式是否正确,通常是 GET 方式,URL类似 search.php?keyword=织梦

Q2: GetArcList 函数不生效,搜不到结果。 A: GetArcListkeyword 参数在某些版本中确实不稳定,强烈建议改用 方法A 中的直接SQL查询方式,这样更可控、更可靠。

Q3: 如何修改分页的样式? A: GetPageList 生成的HTML有固定的class名,

  • 上一页:class="pagepre"
  • 下一页:class="pagenext"
  • 页码:class="pageinfo" (1/2)
  • 具体数字:class="pageitem"

你可以在你的CSS文件中定义这些class的样式来美化分页。

/* 示例CSS */
.pagelist a { text-decoration: none; padding: 5px 10px; border: 1px solid #ccc; margin: 0 2px; }
.pagelist a:hover { background-color: #f0f0f0; }
.pagelist .thisclass { background-color: #ff6600; color: white; border-color: #ff6600; }
.pagelist .pagepre, .pagelist .pagenext { border-color: #999; }

通过以上步骤,你就可以在织梦CMS中实现一个功能完善、用户体验良好的搜索结果分页了。

-- 展开阅读全文 --
头像
织梦dedecms会员列表如何实现联动效果?
« 上一篇 昨天
dede datalist复选框如何实现批量操作?
下一篇 » 昨天

相关文章

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

目录[+]