分頁元件的核心難點在於「當前頁附近顯示固定數量頁碼,且首尾頁永遠可見」的滑動窗口邏輯。本文深度解析兩種實現思路,附完整代碼與視覺效果示意。
_totalPages_totalShowPagesprotected function _getShowPageNumber() {
$pageHtml = '';
// 1. 計算起始頁 $start
if ($this->_curPage - 2 > 1) {
$start = $this->_curPage - 2; // 當前頁置中顯示(前後各2頁)
} else {
$start = 1; // 靠近首頁時貼齊左側
}
// 2. 計算結束頁 $end
$end = $start + $this->_totalShowPages;
if ($end >= $this->_totalPages) {
$end = $this->_totalPages;
$start = $end - $this->_totalShowPages; // 靠近尾頁時貼齊右側
}
// 3. 輸出首頁 + 省略號
if ($start != 1) {
$pageHtml .= $this->_getPageHtml(1);
$preMore = max(1, $this->_curPage - $this->_totalShowPages);
$pageHtml .= $this->_getMorePageHtml($preMore);
}
// 4. 輸出中間連續頁碼
for ($page = $start; $page < $end; $page++) {
$pageHtml .= $this->_getPageHtml($page);
}
// 5. 輸出尾頁 + 省略號
if ($end != $this->_totalPages) {
$pageHtml .= $this->_getMorePageHtml($end);
}
$pageHtml .= $this->_getNormalPageHtml($this->_totalPages);
return $pageHtml;
}
protected function _getShowPageNumberTwo() {
if ($this->_curPage < $this->_totalShowPages) {
// 當前頁在前段:直接輸出 1 ~ _totalShowPages
for ($page = 1; $page < $this->_totalShowPages; $page++) { ... }
$pageHtml .= $this->_getMorePageHtml($this->_totalShowPages);
$pageHtml .= $this->_getNormalPageHtml($this->_totalPages);
} else {
// 當前頁在中後段
$pageHtml .= $this->_getNormalPageHtml(1);
$morePos = ($this->_curPage == $this->_totalShowPages) ? 1 : $this->_curPage - $this->_totalShowPages;
$pageHtml .= $this->_getMorePageHtml($morePos);
if ($this->_curPage + $this->_totalShowPages >= $this->_totalPages) {
// 靠近尾頁
for ($page = $this->_totalPages - $this->_totalShowPages; $page <= $this->_totalPages; $page++) { ... }
} else {
// 中間區域
$start = $this->_curPage - 2;
$end = $this->_curPage + $this->_totalShowPages - 2;
for ($page = $start; $page < $end; $page++) { ... }
$pageHtml .= $this->_getMorePageHtml($this->_curPage + $this->_totalShowPages - 2);
$pageHtml .= $this->_getNormalPageHtml($this->_totalPages);
}
}
return $pageHtml;
}



_getPageHtml($page):生成單個頁碼 <a href="?page=3">3</a>_getMorePageHtml($page):生成省略號 <span class="more">...</span> 或跳轉鏈接_getNormalPageHtml($page):生成首/尾頁固定鏈接prev/next、first/last 導航按鈕/page/3)與查詢字串保留