在開發 Zend Framework 專案時,分頁功能是不可或缺的元件。本文分享一個功能完整、易於客製化的分頁類 Zend_Pagination,支援頁碼導航、首尾頁跳轉、下拉式頁碼選擇等功能,CSS 樣式可自由調整以符合網站設計風格。
class IndexController extends Zend_Controller_Action
{
protected $_curPage = 1; // 預設第一頁
const PERPAGENUM = 4; // 每頁顯示筆數
public function indexAction()
{
// 取得總資料筆數
$totalRows = $this->_blogModel->getTotalRows();
// 接收 URL 傳遞的 page 參數
if ($pageNum = $this->getRequest()->getParam('page')) {
$this->_curPage = (int)$pageNum;
}
// 取得當頁資料(配合 LIMIT offset, count)
$this->view->blogInfo = $this->_blogModel->getBlogInfo(
self::PERPAGENUM,
($this->_curPage - 1) * self::PERPAGENUM
);
// 實例化分頁類並傳給視圖
$this->view->pagebar = $this->displayPageBar($totalRows);
}
private function displayPageBar($totalRows)
{
$pager = new Zend_Pagination($totalRows, self::PERPAGENUM);
return $pager->getNavigation();
}
}
class Blog extends Zend_Db_Table_Abstract
{
protected $_name = 'blog';
public function getBlogInfo($perPageNum = null, $limit = null)
{
return $this->fetchAll('1=1', 'blog_id DESC', $perPageNum, $limit)->toArray();
}
public function getTotalRows($where = '1=1')
{
return $this->fetchAll($where)->count();
}
}
<div class="page">
<?php echo $this->pagebar; ?>
</div>
完整的 Zend_Pagination 類別包含以下關鍵邏輯:
分頁查詢核心在於 LIMIT offset, count 或 LIMIT count OFFSET offset:
-- 假設每頁 4 筆,第 3 頁(_curPage=3)
SELECT * FROM blog LIMIT 8, 4; -- offset=8, 取 4 筆
SELECT * FROM blog LIMIT 4 OFFSET 8; -- 相同效果
-- 對應 PHP 寫法
$offset = ($this->_curPage - 1) * self::PERPAGENUM;
$sql = "SELECT * FROM blog LIMIT {$offset}, " . self::PERPAGENUM;
$_firstPageString、$_previousPageString 等屬性更換顯示文字(如改為圖示)$_navigationItemCount 控制一次顯示幾個頁碼.pagecss、.page 樣式getNavigation() 回傳 JSON 格式createHref() 中模組/控制器/動作名稱是否正確createHref() 的 foreach 迴圈有正確排除 page 參數並保留其他參數if ($this->_pageCount == 0) $this->_pageCount = 1; 防止除以零