搜尋結果頁面的總筆數、總頁數永遠顯示為一個固定的錯誤數字。禁用自定義模組、切換核心主題 Bartik 後問題依舊,僅切換到其他主題(如 Zen)時復現,極具迷惑性。
$pager_total_items 在某區塊渲染後被竄改Drupal 所有分頁器基於 4 個全域陣列變數,以 Pager ID 為索引區分多個分頁器:
$pager_page_array — 當前頁碼$pager_total — 總頁數$pager_total_items — 總記錄數$pager_limits — 每頁筆數Entity/Node 列表模組會自動遞增 Pager ID,但 Views 分頁器預設 ID = 0。當頁面同時存在:
後渲染的區塊視圖會覆蓋全域 $pager_total_items[0],導致主內容讀取到錯誤的總筆數。
100、999、12345
| 分頁器類型 | 建議 ID 範圍 | 說明 |
|---|---|---|
| 主內容(搜尋、列表、分類) | 0 (預設) | 核心模組自動使用 0 |
| Views 區塊視圖 | 100~999 | 每個區塊唯一,建議按區域編碼:側邊欄 100+, 頁尾 200+ |
| Views 頁面視圖(獨立 URL) | 0 | 單一分頁器無衝突 |
| 自定義模組分頁器 | 1000+ | 手動指定 pager_find_page() 參數 |
<?php
// 手動建立分頁器時指定 ID
$pager_id = 123;
$per_page = 10;
$current_page = pager_find_page($pager_id); // 自動從 $_GET['page'] 讀取
$total_items = $query->count()->execute();
pager_default_initialize($total_items, $per_page, $pager_id);
$results = $query->range($current_page * $per_page, $per_page)->execute();
// 主題輸出
$output = theme('pager', ['tags' => [], 'element' => $pager_id, 'parameters' => []]);
Drupal 分頁器衝突是「隱形殺手」:症狀極具誤導性(總筆數錯誤),實則源於 全域陣列索引碰撞。鐵律:頁面上每個分頁器必須擁有唯一 Pager ID。Views 區塊視圖嵌入頁面時,務必手動設定 Pager ID ≥ 100。這個 30 秒的配置,能省下數小時的排查人生。