PHP通用分页函数:支持静态化URL与Ajax翻页

白榆
白榆
发布时间:2026-10-15 | 2人浏览过
原创

本文介绍一个通用的PHP分页函数,支持将动态链接转换为静态化URL(如 xxx-p1.html),并兼容无链接时的Ajax异步分页场景。该函数通过参数区分当前页数、总页数及显示样式,自动处理上一页、下一页及中间页码的HTML结构生成。

功能概述与设计逻辑

在Web开发中,分页是常见需求。传统的分页往往直接拼接?page=参数,不利于SEO且显得不整洁。本函数主要解决两个痛点:

  • 静态化友好:当传入带有固定格式的静态化链接时,函数会自动识别其中的页码占位符,并利用正则表达式进行替换,确保生成的链接符合伪静态规则。
  • Ajax兼容性:在不改变URL的情况下,通过插入optype和pid属性,为前端JavaScript提供触发分页事件的钩子,方便实现无刷新加载。

核心参数说明

在使用该函数前,需了解其输入参数的含义,以便正确调用:

  • $link(String):基础链接地址。
    • 若使用静态化URL,格式示例:www.example.com/list-1-p1-item-xx.html。函数内部默认以-p后接数字作为页码标识进行替换。
    • 若为空字符串,则视为Ajax模式。
  • $intPage(Integer):当前所在的页码数。
  • $intTotal(Integer):数据总共的页数。
  • $intSize(Integer,可选,默认3):分页控件中可见的数字页码个数。建议保持较小数值以保持页面紧凑。
  • $type(String,可选,默认空):用于在多分页场景下区分不同的操作区域,主要用于Ajax模式的JS事件绑定。

代码实现与使用说明

以下是完整的PHP类方法代码。你可以将其复制到你的控制器或工具类中。代码包含详细的注释,解释了每一步的逻辑判断。

/**
 * 获取格式化后的分页HTML
 *
 * @param string $link 链接地址(为空时启用ajax模式)
 * @param int $intPage 当前页码
 * @param int $intTotal 总页数
 * @param int $intSize 显示的页码数量
 * @param string $type 分页类型标识(用于Ajax多分页区分)
 * @return string 返回分页组件的HTML字符串
 */
private function formatPage($link = "", $intPage, $intTotal, $intSize = 3, $type = "") {
    // 定义外层容器
    $strPage = '
'; // 仅当有数据时才生成分页 if ($intTotal > 0) { // --- 1. 处理“上一页”按钮 --- if ($intPage > 1) { // 如果有链接,替换页码;否则添加Ajax属性 $prevLink = $link != '' ? preg_replace("/-p(\d+)/", "p" . ($intPage - 1), $link) : 'javascript:void(0)'; $attrs = $link == '' ? ' optype="' . $type . '" pid="showpage_' . ($intPage - 1) . '"' : ''; $strPage .= '<<上一页</a>'; } else { // 第一页禁用或隐藏 $strPage .= '<<上一页</a>'; } // --- 2. 处理中间页码逻辑 --- // 如果总页数较少,或者设置的显示宽度大于总页数,则显示所有页码 if (($intSize + 2) >= $intTotal) { for ($i = 1; $i <= $intTotal; $i++) { $curClass = ($i == $intPage) ? 'class="g_serpagcur"' : ''; $attrStr = self::getPageAttr($link, $i, $type); $strPage .= ' 2) { $strPage .= '…'; } // 中间的连续页码 $startNum = ($intPage - $offset <= 1) ? 2 : ($intPage - $offset); $endNum = ($intPage + $offset >= $intTotal) ? ($intTotal - 1) : ($intPage + $offset); for ($i = $startNum; $i <= $endNum; $i++) { $curClass = ($i == $intPage) ? 'class="g_serpagcur"' : ''; $attrStr = self::getPageAttr($link, $i, $type); $strPage .= ' $href, 'extra' => '']; } else { $href = 'javascript:void(0)'; $extra = ' optype="' . $type . '" pid="showpage_' . $page . '"'; return ['href' => $href, 'extra' => $extra]; } }

应用场景示例

1. 传统/静态化URL分页

如果你的网站开启了伪静态(如Apache RewriteRule),将URL配置为类似 /article-list-p1-cat5.html 的形式,只需将完整链接传给$link参数。函数会自动将内部的页码 p1 更新为正确的页数。

2. Ajax异步分页

对于单页应用(SPA)或追求极致体验的列表页,可将$link留空。函数会生成包含onclick或特定data属性的<a>标签:

  • optype:标识这是哪个模块的分页(如搜索框分页 vs 侧边栏分页)。
  • pid:存储目标页码(如 showpage_2)。

前端JS监听这些标签的点击事件,读取 pid 中的数值,发起AJAX请求并刷新列表区域即可。

注意事项与排错

  • 正则匹配精度:原代码假设静态链接中页码必须以 -p 开头。如果你的静态规则不同(例如 /page/1),请修改代码中的 preg_replace 正则表达式。
  • CSS类名依赖:生成的HTML使用了 g_serpage, g_serpagcur 等类名,你需要在对应的CSS文件中定义这些类的样式(如浮动、背景色、高亮效果),否则分页可能无法正确显示布局。
  • 边界情况:当 $intTotal 为0或负数时,函数返回空容器,不会渲染任何内容,这符合预期。

以上就是PHP通用分页函数支持静态化地址及Ajax分页的详细内容,更多关于PHP开发技巧的资料请关注本站其它相关文章!

相关标签:

本站声明

本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。

Python 相关产品和应用

全部下载

专题列表