重写分页器 CLinkPager

1、自定义的分页器类放在哪里?
有两个位置可以放,
第一种是放在 protected/extensions 中,在使用是import进来,或在config文件中import进来;
第二种是放在 protected/components 中,作为组件存在,不需要import

2、用派生方式是最好的
class MyPager extends CLinkPager
入口函数是:public function run() ,当显示分页器时run()被调用,里面的输出就会显示在相应位置;
其他的完全自定义,如果你不知道上一页、下一页、首页、尾页、总页数、当前页码等信息,可以参考CLinkPager的源码,yii/frameworks/web/widgets/pagers/CLinkPager.php

<?php

class MyPager extends CLinkPager
{
    const CSS_FIRST_PAGE='first';
    const CSS_LAST_PAGE='last';
    const CSS_PREVIOUS_PAGE='previous';
    const CSS_NEXT_PAGE='next';
    const CSS_INTERNAL_PAGE='page';
    const CSS_HIDDEN_PAGE='hidden';
    const CSS_SELECTED_PAGE='selected';

    /**
     * @var string the CSS class for the first page button. Defaults to 'first'.
     * @since 1.1.11
     */
    public $firstPageCssClass=self::CSS_FIRST_PAGE;
    /**
     * @var string the CSS class for the last page button. Defaults to 'last'.
     * @since 1.1.11
     */
    public $lastPageCssClass=self::CSS_LAST_PAGE;
    /**
     * @var string the CSS class for the previous page button. Defaults to 'previous'.
     * @since 1.1.11
     */
    public $previousPageCssClass=self::CSS_PREVIOUS_PAGE;
    /**
     * @var string the CSS class for the next page button. Defaults to 'next'.
     * @since 1.1.11
     */
    public $nextPageCssClass=self::CSS_NEXT_PAGE;
    /**
     * @var string the CSS class for the internal page buttons. Defaults to 'page'.
     * @since 1.1.11
     */
    public $internalPageCssClass=self::CSS_INTERNAL_PAGE;
    /**
     * @var string the CSS class for the hidden page buttons. Defaults to 'hidden'.
     * @since 1.1.11
     */
    public $hiddenPageCssClass=self::CSS_HIDDEN_PAGE;
    /**
     * @var string the CSS class for the selected page buttons. Defaults to 'selected'.
     * @since 1.1.11
     */
    public $selectedPageCssClass=self::CSS_SELECTED_PAGE;
    /**
     * @var integer maximum number of page buttons that can be displayed. Defaults to 10.
     */
    public $maxButtonCount=10;
    /**
     * @var string the text label for the next page button. Defaults to 'Next >'.
     */
    public $nextPageLabel;
    /**
     * @var string the text label for the previous page button. Defaults to '< Previous'.
     */
    public $prevPageLabel;
    /**
     * @var string the text label for the first page button. Defaults to '<< First'.
     */
    public $firstPageLabel;
    /**
     * @var string the text label for the last page button. Defaults to 'Last >>'.
     */
    public $lastPageLabel;
    /**
     * @var string the text shown before page buttons. Defaults to 'Go to page: '.
     */
    public $header;
    /**
     * @var string the text shown after page buttons.
     */
    public $footer='';
    /**
     * @var mixed the CSS file used for the widget. Defaults to null, meaning
     * using the default CSS file included together with the widget.
     * If false, no CSS file will be used. Otherwise, the specified CSS file
     * will be included when using this widget.
     */
    public $cssFile;
    /**
     * @var array HTML attributes for the pager container tag.
     */
    public $htmlOptions=array();

    /**
     * Initializes the pager by setting some default property values.
     */
    public function init()
    {
        if($this->nextPageLabel===null)
            $this->nextPageLabel=Yii::t('yii','Next >');
        if($this->prevPageLabel===null)
            $this->prevPageLabel=Yii::t('yii','< Previous');
        //if($this->firstPageLabel===null)
        //  $this->firstPageLabel=Yii::t('yii','<< First');
        //if($this->lastPageLabel===null)
        //  $this->lastPageLabel=Yii::t('yii','Last >>');
        if($this->header===null)
            $this->header=Yii::t('yii','Go to page: ');

        if(!isset($this->htmlOptions['id']))
            $this->htmlOptions['id']=$this->getId();
        if(!isset($this->htmlOptions['class']))
            $this->htmlOptions['class']='yiiPager';
    }

    /**
     * Executes the widget.
     * This overrides the parent implementation by displaying the generated page buttons.
     */
    public function run()
    {
        $this->registerClientScript();
        $buttons=$this->createPageButtons();
        if(empty($buttons))
            return;
        echo $this->header;
//      echo CHtml::tag('ul',$this->htmlOptions,implode("\n",$buttons));
        echo implode("\n",$buttons);
        echo $this->footer;
    }

    /**
     * Creates the page buttons.
     * @return array a list of page buttons (in HTML code).
     */
    protected function createPageButtons()
    {
        if(($pageCount=$this->getPageCount())<=1)
            return array();

        list($beginPage,$endPage,$ellipsis)=$this->getPageRange();

        $currentPage=$this->getCurrentPage(false); // currentPage is calculated in getPageRange()
        $buttons=array();

        // first page
        //$buttons[]=$this->createPageButton($this->firstPageLabel,0,$this->firstPageCssClass,$currentPage<=0,false);

        // prev page
        if(($page=$currentPage-1)<0)
            $page=0;
        if($currentPage == 0){
            $buttons[] = "<span style='background:#a3a3a3'><上一頁</span>";
        }else{
            $buttons[]=$this->createPageButton($this->prevPageLabel,$page,$this->previousPageCssClass,$currentPage<=0,false);
        }
        // internal pages start
        // first
        $buttons[]=$this->createPageButton(1,0,$this->internalPageCssClass,false,$i==$currentPage);
        //middle
        if($ellipsis == 'both'){
            $buttons[] = "<span style='background:#a3a3a3'>...</span>";
        }
        for($i=$beginPage;$i<=$endPage;++$i){
            if($ellipsis == 'left' && $i == $beginPage){
                $buttons[] = "<span style='background:#a3a3a3'>...</span>";
            }
            $buttons[]=$this->createPageButton($i+1,$i,$this->internalPageCssClass,false,$i==$currentPage);
            if($ellipsis == 'right' && $i == $endPage){
                $buttons[] = "<span style='background:#a3a3a3'>...</span>";
            }
        }   
        if($ellipsis == 'both'){
            $buttons[] = "<span style='background:#a3a3a3'>...</span>";
        }
        // last
        $buttons[]=$this->createPageButton($pageCount,$pageCount - 1,$this->internalPageCssClass,false,$i==$currentPage);
        // internal pages end
        // next page
        if(($page=$currentPage+1)>=$pageCount-1)
            $page=$pageCount-1;
        if($currentPage == ($pageCount-1)){
            $buttons[] = "<span style='background:#a3a3a3'>下一頁></span>";
        }else{
            $buttons[]=$this->createPageButton($this->nextPageLabel,$page,$this->nextPageCssClass,$currentPage>=$pageCount-1,false);
        }
        // last page
        //$buttons[]=$this->createPageButton($this->lastPageLabel,$pageCount-1,$this->lastPageCssClass,$currentPage>=$pageCount-1,false);

        return $buttons;
    }

    /**
     * Creates a page button.
     * You may override this method to customize the page buttons.
     * @param string $label the text label for the button
     * @param integer $page the page number
     * @param string $class the CSS class for the page button.
     * @param boolean $hidden whether this page button is visible
     * @param boolean $selected whether this page button is selected
     * @return string the generated button
     */
    protected function createPageButton($label,$page,$class,$hidden,$selected)
    {
        if($hidden || $selected)
            $class.=' '.($hidden ? $this->hiddenPageCssClass : $this->selectedPageCssClass);
        if ($selected) {
            $result = "<span>" . ++$page . "</span>";
        } else {
            $result = CHtml::link($label,$this->createPageUrl($page));
        }
        return $result;
    }

    /**
     * @return array the begin and end pages that need to be displayed.
     */
    protected function getPageRange()
    {
        $currentPage=$this->getCurrentPage();
        $pageCount=$this->getPageCount();
        /*$beginPage=max(0, $currentPage-(int)($this->maxButtonCount/2));
        if(($endPage=$beginPage+$this->maxButtonCount-1)>=$pageCount)
        {
            $endPage=$pageCount-1;
            $beginPage=max(0,$endPage-$this->maxButtonCount+1);
        }*/
        if($pageCount > $this->maxButtonCount){
            if($currentPage > 4 && $currentPage < ($pageCount - 4)){
                // print_r('a');
                $beginPage = $currentPage - 2;
                $endPage = $currentPage + 2;
                $ellipsis = 'both';
            }else{
                $beginPage=max(1, $currentPage-(int)($this->maxButtonCount/2));
                if($beginPage == 1){
                    $ellipsis = 'right';
                }else{
                    $ellipsis = 'left';
                }
                if(($endPage=$beginPage+$this->maxButtonCount-1)>=$pageCount)
                {
                    // print_r('b');
                    $endPage=$pageCount-2;
                    $beginPage=max(1,$endPage-$this->maxButtonCount+1);
                }elseif(($endPage=$beginPage+$this->maxButtonCount-1)>=$pageCount-2){
                    // print_r('c');
                    $endPage=$pageCount-2;
                }

            }
        }else{
            $beginPage=max(1, $currentPage-(int)($this->maxButtonCount/2));
            if(($endPage=$beginPage+$this->maxButtonCount-1)>=$pageCount)
            {
                $endPage=$pageCount-2;
                $beginPage=max(1,$endPage-$this->maxButtonCount+1);
            }
        }

        return array($beginPage,$endPage, $ellipsis);
    }

    /**
     * Registers the needed client scripts (mainly CSS file).
     */
    public function registerClientScript()
    {
        if($this->cssFile!==false)
            self::registerCssFile($this->cssFile);
    }

    /**
     * Registers the needed CSS file.
     * @param string $url the CSS URL. If null, a default CSS URL will be used.
     */
    public static function registerCssFile($url=null)
    {
        if($url===null)
            $url=CHtml::asset(Yii::getPathOfAlias('system.web.widgets.pagers.pager').'.css');
        Yii::app()->getClientScript()->registerCssFile($url);
    }
}

3、调用方式
在View里的相应widget,定义pager的class为自定义的分页器类名即可,参考:

$this->widget('zii.widgets.CListView', array(
    'dataProvider'=>$dataProvider,
    'itemView'=>'_view_t',
    'pager'=>array(
    'class'=>'MyPager',
 )
));
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值