php overrides an instance of pager CLinkPager

  • 2021-08-12 02:09:42
  • OfStack

php overrides an instance of pager CLinkPager

1. Where is the custom pager class?

There are two places to put it,

The first one is placed in protected/extensions, and import comes in when using it, or import comes in in config file;

The second is placed in protected/components, which exists as a component and does not require import

2. Derivation is the best way


class MyPager extends CLinkPager 

The entry function is: public function run (). When the pager is displayed, run () is called, and the output inside will be displayed in the corresponding position;

Other completely customized, if you do not know the first page, the next page, the first page, the last page, the total number of pages, the current page number and other information, you can refer to the source code of 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'>< Upper 1 In fact, in fact, the </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'> Under 1 In fact, in fact, the ></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. Call mode

In the corresponding widget of View, class of pager is defined as the custom pager class name. Refer to:


$this->widget('zii.widgets.CListView', array(
  'dataProvider'=>$dataProvider,
  'itemView'=>'_view_t',
  'pager'=>array(
  'class'=>'MyPager',
 )
));

If you have any questions, please leave a message or go to this site community to exchange and discuss, thank you for reading, hope to help everyone, thank you for your support to this site!


Related articles: