在 Web 應用開發中,分頁是處理大量數據展示的基礎功能。Yii 框架通過 CPagination 類與 CLinkPager 控件的配合,提供了靈活且強大的分頁解決方案。本文將通過實戰代碼示例,詳細講解如何在控制器與視圖層實現完整的分頁功能。
在控制器中,我們需要完成數據查詢條件構建、總記錄數統計、分頁對象初始化以及數據獲取等核心步驟:
public function actionTest() {
// 建立查詢條件,按 ID 降序排列
$criteria = new CDbCriteria();
$criteria->order = 'id DESC';
// 統計符合條件的總記錄數
$count = User::model()->count($criteria);
// 實例化分頁對象,傳入總記錄數
$pager = new CPagination($count);
// 設置每頁顯示 10 條記錄
$pager->pageSize = 10;
// 將分頁限制應用到查詢條件中
$pager->applyLimit($criteria);
// 執行查詢獲取當前頁數據
$userList = User::model()->findAll($criteria);
// 渲染視圖,傳遞數據列表與分頁對象
$this->render('test', array(
'list' => $userList,
'pages' => $pager
));
}
視圖文件中遍歷數據列表並調用 CLinkPager 控件生成分頁導航:
<?php foreach ($list as $user) { ?>
<div class="user-item">
<span class="username"><?php echo CHtml::encode($user->username); ?></span>
<span class="user-id">ID: <?php echo $user->id; ?></span>
</div>
<?php } ?>
<?php
$this->widget('CLinkPager', array(
'header' => '',
'firstPageLabel' => '首頁',
'lastPageLabel' => '末頁',
'prevPageLabel' => '上一頁',
'nextPageLabel' => '下一頁',
'pages' => $pages,
'maxButtonCount' => 13,
'cssFile' => false, // 禁用默認 CSS,便於自定義樣式
'htmlOptions' => array('class' => 'pagination')
));
?>
通過配置 urlManager 可實現更友好的分頁 URL:
'urlManager' => array(
'urlFormat' => 'path',
'showScriptName' => false,
'rules' => array(
'user/list/page/' => 'user/list',
),
),
結合 CLinkPager 的 ajaxUpdate 參數可實現局部刷新:
$this->widget('CLinkPager', array(
'pages' => $pages,
'ajaxUpdate' => '#user-list-container', // 目標容器 ID
'beforeAjaxUpdate' => 'js:function(id, options) { $("#loading").show(); }',
'afterAjaxUpdate' => 'js:function(id, data) { $("#loading").hide(); }',
));
count(*) 統計全表,可維護單獨的計數表或使用緩存rel="prev/next" 標籤,避免內容重複收錄Yii 的分頁機制通過 CPagination 處理邏輯計算,CLinkPager 負責視圖渲染,職責分離清晰。掌握核心參數配置與進階用法,能滿足絕大多數業務場景的分頁需求。實際項目中建議封裝基礎分頁組件,統一風格並減少重複代碼。