ThinkPHP 內建 Page 類庫預設僅保留分頁參數,搜尋表單提交的查詢條件在翻頁時會遺失。官方手冊建議遍歷 $map 陣列組裝參數,但實務上 $map 往往是動態構建的條件陣列,不一定包含所有 GET 參數,導致遺漏。
$_GET 組裝分頁參數// 控制器動作
public function index() {
$model = D('Article');
// 1. 動態構建查詢條件 (範例)
$map = [];
if (!empty($_GET['keyword'])) {
$map['title|content'] = ['LIKE', "%{$_GET['keyword']}%"];
}
if (!empty($_GET['category_id'])) {
$map['category_id'] = intval($_GET['category_id']);
}
if (!empty($_GET['status'])) {
$map['status'] = $_GET['status'];
}
// 日期範圍...
// 2. 查詢總數與資料
$count = $model->where($map)->count();
$list = $model->where($map)->order('id DESC')->select();
// 3. 實例化分頁類
import('ORG.Util.Page');
$page = new Page($count, 20); // 每頁 20 筆
// 4. 【關鍵】保留所有 GET 參數 (除 page 自身)
foreach ($_GET as $key => $val) {
if ($key !== 'p' && $key !== 'page') { // 避免重複 page 參數
$page->parameter .= "$key=" . urlencode($val) . "&";
}
}
// 5. 設定查詢限制 (配合 Page 類的 firstRow/listRows)
$list = $model->where($map)
->order('id DESC')
->limit($page->firstRow . ',' . $page->listRows)
->select();
// 6. 輸出分頁 HTML
$pageHtml = $page->show();
$this->assign('list', $list);
$this->assign('page', $pageHtml);
$this->display();
}
| 屬性 | 說明 |
|---|---|
firstRow | 當頁起始記錄偏移 (0-based) |
listRows | 每頁筆數 |
parameter | 分頁連結額外查詢字串 (如 keyword=test&category_id=3) |
rollPage | 顯示頁碼數量 (預設 11) |
config | 樣式配置陣列 (header, prev, next, first, last, theme) |
$page->config = [
'header' => '',
];
// %STATUS% 會被替換為 ' active' (當前頁) 或空字串
urlencode() 處理中文/空格/符號,Page 類內部會自動 urldecode 還原。p,若專案使用 page,需設定 $page->p = 'page'; 或修改類常數。search_token=abc123。$page->show() 產生的連結需攜帶 data-page 屬性,前端 JS 攔截點擊發送 AJAX 請求,局部更新列表。<!-- 列表容器 -->
<div id="article-list">...</div>
<!-- 分頁容器 -->
<div id="pagination">{$page}</div>
<script>
$('#pagination').on('click', 'a', function(e) {
e.preventDefault();
const url = $(this).attr('href');
$.get(url, function(html) {
// 假設回傳 JSON: {list: '...', page: '...'}
$('#article-list').html(html.list);
$('#pagination').html(html.page);
}, 'json');
});
</script>
// 控制器 AJAX 判斷
if (IS_AJAX) {
$this->ajaxReturn([
'list' => $this->fetch('Article/list_items'), // 區域模板
'page' => $page->show(),
]);
}