thinkphp6分页自定义核心是render()方法传参控制html结构,无需换模板文件即可修改标签、添加属性、隐藏页码等;关键需配置query保留搜索参数,仅复杂需求才需严格规范自定义模板文件。

ThinkPHP6 分页自定义模板,核心不在“换文件”,而在用好 render() 方法的运行时参数控制 HTML 结构。多数样式和语义需求(比如改 <ul></ul> 为 <nav></nav>、加 aria-label、隐藏页码只留上/下一页)无需动模板文件,靠传参就能实现。
直接传参控制 render 输出结构
调用 {$list->render($options)} 时传入关联数组,可覆盖默认 HTML 拼接逻辑:
-
theme:定义整体 HTML 模板字符串,支持占位符,如
'theme' => '<nav aria-label="分页导航">%UP_PAGE%%LINKS%%DOWN_PAGE%</nav>' -
var_page:若 URL 使用
?p=2而非默认?page=2,必须设'var_page' => 'p',否则翻页参数错乱 -
current_class:指定当前页链接的 class 名,如
'current_class' => 'active' -
prev_text / next_text:自定义上一页/下一页文字,支持符号或图标,如
'prev_text' => '‹', 'next_text' => '›'
保留搜索等 query 参数的关键配置
分页链接若丢失筛选条件(如 ?keyword=php&page=2 点击后变成 ?page=2),是常见功能断裂点。解决方法是在控制器中显式透传:
- 使用
'query' => request()->param()作为 paginate 配置项,确保所有 GET 参数自动附加到每一页链接中 - 若需排除某些参数(如
token),可先过滤:'query' => array_diff_key(request()->param(), ['token' => ''])
真要重写模板文件?路径和规范必须严格
只有当需要添加跳转输入框、GO 按钮、总条数提示等复杂结构时,才建议自定义模板文件。但要注意:
- 模板文件必须放在
app/template/paginate/目录下(不是view/或app/view/) - 文件名任意(如
simple.php),但内容必须返回纯字符串,不能有echo、空格、BOM 或任何输出 - 需在
config/paginate.php中声明驱动类型,并注册对应类,例如:'type' => 'Simple',同时补全'drivers' => ['Simple' => \app\template\paginate\Simple::class] - 该类必须实现
think\contract\PaginatorRenderInterface接口,否则启动报错
避免响应式陷阱:别让 ul 默认样式破坏布局
默认分页输出含 <ul><li></ul> 结构,CSS 中若全局重置了 ul 的 margin/padding/list-style,可能造成排版错乱。响应式场景下建议:
- 给分页容器加独立 class(如
class="pagination-nav"),用后代选择器精准控制,不依赖全局 ul 样式 - 用
theme参数直接去掉<ul></ul>,改用<div class="pagination-links"> 包裹 %LINKS%,更利于 Flex/Grid 布局 <li>小屏下可结合 <code>%UP_PAGE%和%DOWN_PAGE%单独渲染箭头按钮,%LINKS% 留空或仅显示当前页,再通过 JS 动态加载页码列表











