thinkphp 6 的 render() 方法默认不支持省略号分页,需手动计算页码范围并构造 html:固定首尾页、当前页前后各保留 2 页、边界处理省略号位置,同时用 url::build() 保持完整查询参数。

ThinkPHP 6 的 render() 方法默认不支持省略号,得自己重写
ThinkPHP 6 默认的分页渲染(render())只提供基础的「上一页/下一页 + 全部页码」,没有省略号逻辑。直接调用 $list->render() 拿不到类似 Google 那种 1 2 ... 5 6 7 ... 12 13 的效果——这不是配置能开出来的,必须干预渲染过程。
核心思路是:不依赖默认 HTML 模板,改用 simple() 或 getCursor() 获取原始分页数据,再手写 HTML 结构。TP6 的 $page->items() 和 $page->currentPage() 等方法可用,但页码范围计算得自己来。
手动构造省略号分页的核心逻辑
关键不是“怎么显示”,而是“哪些页码该显示、哪些该省略”。典型策略是:当前页前后各保留 2 个页码,首尾固定显示 1 和总页数,中间用省略号隔开。比如总页数 15、当前页是 7,应显示 1 ... 5 6 7 8 9 ... 15。
用 PHP 实现时注意几个边界:
- 总页数 ≤ 7 时,全部显示,不出现省略号
- 当前页靠近开头(如第 1、2 页),右侧省略号要后移,避免出现
1 2 3 ... 4这种无效省略 - 当前页靠近结尾(如倒数第 1、2 页),左侧省略号要前移
-
$page->lastPage()是总页数,$page->currentPage()是当前页,这两个是计算基础
在模板里用原生 PHP 写分页 HTML(不依赖 render())
推荐在模板中直接写逻辑,清晰可控。假设你已通过 $page = $list->paginate(10) 获取分页对象:
Google索引API工具。用于提交URL以供Google索引。支持两种模式:“auto-index”(获取sitemap,与缓存对比差异并提交...)
<?php $currentPage = $page->currentPage(); $lastPage = $page->lastPage(); $pages = []; <p>if ($lastPage 2) $pages[] = '...'; for ($i = max(2, $currentPage - 2); $i </p><p></p><div class="pagination"> <?php foreach ($pages as $p): ?><a href="?page=<?=%20%24p%20===%20'...'%20?%20%24currentPage%20:%20%24p%20?>" class="<?= $p === $currentPage ? 'active' : '' ?>"> = $p ?> </a> <?php endforeach; ?> </div>
注意:?page=... 这种写法仅作示意,实际需用 url() 或 Url::build() 生成带参数的 URL,否则会丢失搜索条件;'...' 是字符串占位符,不能当数字参与链接生成。
容易被忽略的两个坑
一是 URL 参数丢失。分页链接必须携带原始查询参数(如 ?q=thinkphp&type=doc),否则点第二页就只剩 ?page=2。TP6 推荐用 Url::build('', [], false, true) 获取当前完整 URL,再替换 page 参数。
二是移动端适配。省略号分页在小屏上可能折行或溢出,建议给 .pagination a 加 display: inline-block 和最小宽度,对 ... 单独设 user-select: none 防止误选。
真正麻烦的从来不是“怎么画出省略号”,而是“怎么让每个页码链接都带上正确的全部参数”——这个细节没处理好,用户一翻页就丢搜索条件,体验直接归零。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!










