YII CLinkPager 分页类扩展:显示共多少页
默认情况下,YII 的 CLinkPager 组件不包含显示总页数的功能。通过将原生分页器继承并扩展为 MLinkPager,可以新增 mCountPage 和 forceTotalPage 参数,从而轻松在分页控件末尾添加“共 X 页”提示,且无需修改大量底层逻辑。
默认与扩展后的效果对比
在使用 YII 进行列表展示时,通常通过调用 CWidget 来渲染分页按钮。默认的配置如下:
<?php $this->widget('CLinkPager',array(
'header' => '',
'firstPageLabel' => '首页',
'lastPageLabel' => '尾页',
'prevPageLabel' => '<',
'nextPageLabel' => '>',
'pages' => $pages,
'maxButtonCount'=>5,
'htmlOptions' => array('class' => 'page-link'),
)); ?>
上述代码生成的分页栏仅包含跳转链接,缺少对总页数的直观展示。我们需要一个更人性化的版本,即在链接右侧显示“共 10 页”之类的信息。
第1步:创建 MLinkPager 扩展类
核心思路是新建一个 PHP 文件(建议命名为 MlinkPager.php),将其放置在应用的 components 目录下,该类继承自 CLinkPager。
该扩展类主要增加了两个公共属性来控制总数显示:
$mCountPage:true时显示总页数;false时隐藏。受当前页码范围限制。$forceTotalPage:true时强制显示总页数,无论是否有当前页码数据(常用于空数据兜底场景);优先级高于$mCountPage。
<?php
class MLinkPager extends CLinkPager
{
// 设置为 true 时,满足条件则显示共X页
public $mCountPage = false;
// 是否强制显示共x页,设置为true时,$mCountPage 和 getPageRange() 失效
public $forceTotalPage = false;
public function init()
{
parent::init();
}
public function run()
{
$this->registerClientScript();
$buttons = $this->createPageButtons();
list($beginPage, $endPage) = $this->getPageRange();
// 判断是否添加“共X页”元素
if ($this->forceTotalPage)
{
$buttons[] = CHtml::tag('li', array('class'=>'totle'),'共'.$this->getPageCount().'页');
}
else
{
if ($this->mCountPage && $endPage > 0)
{
$buttons[] = CHtml::tag('li', array('class'=>'totle'),'共'.$this->getPageCount().'页');
}
}
if(empty($buttons)) return;
echo $this->header;
echo CHtml::tag('div',$this->htmlOptions,implode("\n",$buttons));
echo $this->footer;
}
}
第2步:在视图中使用扩展类
将 MLinkPager 放入 components 目录后,在视图文件(View)中替换原本的 CLinkPager 调用方式。
<div class="page-tab-tog">
<?php $this->widget('MLinkPager',array(
'header' => '',
'firstPageLabel' => '首页',
'lastPageLabel' => '尾页',
'prevPageLabel' => '<',
'nextPageLabel' => '>',
'pages' => $pages,
'maxButtonCount'=>5,
'mCountPage' => true, // 开启显示总页数
'htmlOptions' => array('class' => 'page-tab-tog'),
)); ?>
</div>
设置 'mCountPage' => true 后即可看到分页列表中多出了一项显示总页数。
第3步:处理无数据时的边缘情况
如果列表中没有数据,YII 默认可能不会渲染分页按钮或隐藏页码。若业务要求即使为空也要显示“共 0 页”,需将配置项改为:
'forceTotalPage' => true
此时 mCountPage 的设置将被忽略,系统会强制生成包含总页数的 Li 标签。
附录:YII 标准分页逻辑简述
为了更好理解分页原理,以下是控制器中使用 CPagination 的标准写法:
1. 计算总数与设置偏移量
$criteria = new CDbCriteria();
$criteria->order = 'id ASC';
$criteria->addCondition('status=1');
$count = Exchange::model()->count($criteria);
$pager = new CPagination($count);
$pager->pageSize = 30;
$pager->applyLimit($criteria);
$exchangeInfo = Exchange::model()->findAll($criteria);
2. 传递参数至视图
$this->render('index', array(
"pages" => $pager
));
以上就是 YII CLinkPager 分页类扩展增加显示共多少页的详细内容,更多关于 YII 分页开发的资料请关注本站其它相关文章!本站声明
本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。













