yii2分页需自定义pageparam(如'p')并配置params保留业务参数,启用美化url时须显式指定route,ajax分页应动态构造含新页码参数的url。

Yii2 默认从 $_GET['page'] 读取页码,但实际项目中常需改用其他参数名(如 p、page_no 或带前缀的 list[page]),否则 URL 拼接会出错——比如点击分页链接后业务参数丢失、页码不生效,或生成类似 ?page=2&page=3 的重复参数。
修改 page 参数名:用 pageParam 配置
在创建 Pagination 实例时,直接指定 pageParam 即可:
-
'pageParam' => 'p'→ URL 变为?p=2 -
'pageParam' => 'page_no'→ URL 变为?page_no=2 -
'pageParam' => 'list[page]'→ URL 变为?list[page]=2(自动编码)
这个配置会同时影响:页码解析(读哪个键)、URL 生成(LinkPager 输出的链接)、跳转逻辑(AJAX 请求目标地址)。
保留非分页参数:显式透传 params
仅设 pageParam 不够。LinkPager 默认只保留 page 和 per-page 类参数,其他如 category=3、q=abc 会被丢弃。解决方法是在 Pagination 配置中加入 params 数组:
- 安全写法:逐个指定需保留的键,例如
'params' => ['category', 'q', 'status'] - 更稳妥:取值时用
Yii::$app->request->get()并过滤,如'params' => array_filter(['category' => Yii::$app->request->get('category'), 'q' => Yii::$app->request->get('q')]) - 注意:不要直接写
'params' => $_GET,防止敏感参数(如 token、debug)泄露
启用 URL 美化时 route 必须写全
如果开启 enablePrettyUrl,LinkPager 生成的链接依赖路由信息。若未显式指定 route,它可能拼出错误路径(如跳转到 /index.php?r=site/index 而非 /site/index)。
- 在
LinkPager::widget()中补上'route' => 'article/index' - 若使用
ActiveDataProvider,则在 pagination 配置里加:'route' => 'article/index' - route 值必须与当前请求的实际路由一致,不能省略控制器名
AJAX 分页时 href 解析要兼容新参数名
自定义 pageParam 后,原生 AJAX 代码中 $(this).attr('href') 取到的仍是含 page=2 的链接,导致请求失败。应改用 JS 动态构造 URL:
- 提取当前 URL,用正则替换或 URL 对象更新
pageParam对应的参数值 - 或统一用
Url::to()在服务端预生成带全部参数的 AJAX 地址,再传给 JS - 推荐做法:在视图中用
data-url-base="= Url::to(['article/index'], true) ?>",JS 中拼接base + '?p=' + pageNum + '&category=3'











