PHP通用分页函数:支持静态化URL与Ajax翻页
本文介绍一个通用的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模式。
- 若使用静态化URL,格式示例:
$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开发技巧的资料请关注本站其它相关文章!
本站声明
本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。













