首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 網頁程式設計 >> PHP 程式設計 >> PHP 相關知識

Zend Framework 實用分頁類完整教學與程式碼範例

     編輯:PHP 相關知識

前言

在開發 Zend Framework 專案時,分頁功能是不可或缺的元件。本文分享一個功能完整、易於客製化的分頁類 Zend_Pagination,支援頁碼導航、首尾頁跳轉、下拉式頁碼選擇等功能,CSS 樣式可自由調整以符合網站設計風格。

核心功能特色

  • 自動計算總頁數、當前頁碼
  • 支援自訂每頁筆數、導航顯示筆數
  • 內建首頁、上一頁、下一頁、尾頁快捷鍵
  • 提供下拉選單快速跳轉指定頁面
  • 自動保留其他 URL 參數(如搜尋條件、排序欄位)

快速上手:三步驟整合

1. 控制器層

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();
    }
}

2. 模型層

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();
    }
}

3. 視圖層

<div class="page">
    <?php echo $this->pagebar; ?>
</div>

分頁類核心程式碼解析

完整的 Zend_Pagination 類別包含以下關鍵邏輯:

  • 建構子:初始化總筆數、每頁筆數、計算總頁數、解析當前頁碼參數
  • createHref():動態產生分頁連結,自動保留模組/控制器/動作及其他查詢參數
  • getNavigation():組裝 HTML 導航列,包含統計資訊、數字頁碼、首尾頁、上下頁、下拉跳轉選單
  • Setter 方法:可自訂顯示文字(首頁、上一頁等)、分隔符號、對齊方式、導航顯示筆數

MySQL LIMIT 用法補充說明

分頁查詢核心在於 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;

客製化建議

  1. 修改 $_firstPageString、$_previousPageString 等屬性更換顯示文字(如改為圖示)
  2. 調整 $_navigationItemCount 控制一次顯示幾個頁碼
  3. 搭配 CSS 美化 .pagecss、.page 樣式
  4. 若需 AJAX 分頁,可修改 getNavigation() 回傳 JSON 格式

常見問題排查

  • 頁碼連結錯誤:檢查 createHref() 中模組/控制器/動作名稱是否正確
  • 參數遺失:確認 createHref() 的 foreach 迴圈有正確排除 page 參數並保留其他參數
  • 總筆數為 0 時異常:建構子建議加入 if ($this->_pageCount == 0) $this->_pageCount = 1; 防止除以零
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved