YII CLinkPager 分页类扩展:显示共多少页

Elena
Elena
发布时间:2026-10-13 | 2人浏览过
原创

默认情况下,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 分页开发的资料请关注本站其它相关文章!
相关标签:

本站声明

本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。

Python 相关产品和应用

全部下载

专题列表