ThinkPHP模板中不存在$_paginates变量,分页需控制器传入paginate对象并调用render()渲染;自定义结构可通过render()参数控制;URL参数丢失需配合withQuery()或appends();simple()提供轻量分页但无总记录数。

ThinkPHP 模板里 $_paginates 不存在?先确认数据来源
模板里直接用 $list->render() 才能输出分页 HTML,不是靠 $_paginates 或类似变量——这个变量根本不会自动注入。ThinkPHP 的分页对象(比如 $list)是通过控制器传入模板的,它本身带 render() 方法,渲染逻辑封装在内部,不暴露原始分页参数数组。
- 控制器必须显式调用
paginate()并 assign 给模板变量,例如:$this->assign('list', $query->paginate(10)); - 模板中不能写
{$list->total}以外的“分页元信息”来手动拼 HTML,因为render()依赖完整对象上下文(含请求参数、URL 规则等) - 若用
toArray()或items()提前取数据,分页对象就断了链,render()会报错或空白
render() 渲染出来全是默认样式,怎么自定义结构?
ThinkPHP 分页默认用 Bootstrap 风格 HTML,但你不需要改源码或重写整个类——直接传参数给 render() 就能控制模板片段和 class 名。
- 传数组参数可覆盖默认配置,例如:
{$list->render(['type' => 'bootstrap', 'var_page' => 'page', 'theme' => '%FIRST% %UP_PAGE% %LINKS% %DOWN_PAGE% %END% %TOTAL%'])} -
theme字符串里支持占位符:%LINKS%是页码列表,%UP_PAGE%是上一页,%TOTAL%是总条数,别漏掉%NOW_PAGE%和%LAST_PAGE% - 如果用了非标准 URL 参数(比如分页参数叫
p而不是page),必须同步设'var_page' => 'p',否则点击跳转会丢参数
为什么 render() 点击后页面 404 或参数丢失?
核心原因是分页生成的链接没继承当前路由规则或参数,尤其在使用 pathinfo 模式、带查询参数(如搜索条件)或自定义路由时极易出问题。
- 确保控制器中构建查询时用了
withQuery(),例如:$query->where('status', 1)->withQuery(input('param.'))->paginate(10),否则搜索条件不会透传到分页链接 - 如果你的路由是
route /article/:id这种带变量的,分页默认无法还原,得手动加->appends(['id' => $id]) - 开启
url_html_suffix且后缀非.html时,render()可能拼错 URL,建议统一用''(空字符串)或显式指定'url' => url('index/article', [], false, true)
想彻底接管分页 HTML,又不想写死逻辑?用 simple() + 手动遍历
当默认 render() 太僵硬,又不愿引入第三方分页组件时,simple() 是轻量替代方案:它返回简化分页对象,只含必要字段,结构清晰,适合手写 <nav> 标签。
立即学习“PHP免费学习笔记(深入)”;
- 控制器改用:
$list = $query->paginate(10)->simple();,模板里就能安全访问:{$list->currentPage()}、{$list->lastPage()}、{$list->hasMore()} - 页码循环写法:
{volist name="list.render().data" id="p"}<a href="{$p.url}">{$p.text}</a>{/volist}不行——simple()不提供render().data,得自己算:{for start="1" end="$list.lastPage" name="i"}<a href="{:url('index/list', ['page'=>$i])}">{$i}</a>{/for} - 注意:
simple()不包含总记录数,total()方法不可用;如需显示“共 X 条”,得额外查一次count()或从完整paginate()对象里取
render() 调用时有没有把上下文(参数、路由、URL 规则)带全。漏掉 withQuery() 或 appends(),再好看的模板也点不动。


















