Yii 1.x 內置 CLinkPager 預設不顯示總頁數,產品要求在分頁條右側顯示「共 15 頁」等信息。通過繼承 CLinkPager 並覆寫 run() 方法,可在零侵入業務代碼的情況下實現該需求。
保存為 protected/components/MLinkPager.php
registerClientScript();
$buttons = $this->createPageButtons();
list($beginPage, $endPage) = $this->getPageRange();
// 決定是否追加總頁數按鈕
if ($this->forceTotalPage) {
$buttons[] = CHtml::tag('li', ['class' => 'total'], '共 ' . $this->getPageCount() . ' 頁');
} elseif ($this->mCountPage && $endPage > 0) {
$buttons[] = CHtml::tag('li', ['class' => 'total'], '共 ' . $this->getPageCount() . ' 頁');
}
if (empty($buttons)) return;
echo $this->header;
echo CHtml::tag('div', $this->htmlOptions, implode("\n", $buttons));
echo $this->footer;
}
}
<div class="page-tab-tog">
widget('MLinkPager', [
'header' => '',
'firstPageLabel' => '首頁',
'lastPageLabel' => '尾頁',
'prevPageLabel' => '<',
'nextPageLabel' => '>',
'pages' => $pages,
'maxButtonCount' => 5,
'mCountPage' => true, // 關鍵:啟用總頁數顯示
'htmlOptions' => ['class' => 'page-tab-tog'],
]); ?>
</div>
設置 'forceTotalPage' => true,此時 mCountPage 失效,無論 $pages->getItemCount() 是否為 0 都會輸出總頁數標籤。
.page-tab-tog .total {
background: #f5f5f5;
color: #666;
padding: 4px 8px;
border-radius: 2px;
margin-left: 8px;
font-weight: normal;
}
$criteria = new CDbCriteria();
$criteria->order = 'id DESC';
$count = Post::model()->count($criteria);
$pager = new CPagination($count);
$pager->pageSize = 20;
$pager->applyLimit($criteria);
$posts = Post::model()->findAll($criteria);
$this->render('index', ['posts' => $posts, 'pages' => $pager]);
$pages 傳給 CLinkPager 或擴展類。| 現象 | 原因 | 解決 |
|---|---|---|
| 總頁數不顯示 | $pages->getPageCount() 為 0 | 檢查 CPagination::pageSize 是否設置,itemCount 是否正確 |
| 分頁鏈接錯誤 | URL 規則未配置 | 在 urlManager 中配置 ' |
| 樣式亂掉 | htmlOptions class 衝突 | 自定義 CSS 覆蓋 .pager .selected .hidden 等類 |
Yii 2 使用 yii\widgets\LinkPager,擴展方式改為覆寫 renderPageButtons(),並通過 options、linkOptions 配置樣式,核心思想一致。
通過繼承 CLinkPager 並覆寫 run(),僅需 20 行代碼即可優雅實現「共 X 頁」功能,保持視圖代碼整潔,符合開閉原則。建議將擴展類放入 components 目錄並配置 import,實現項目級復用。