当前位置:首页 > PHP教程 > php分页 > 列表

php 重写分页器 CLinkPager的实例

发布:smiling 来源: PHP粉丝网  添加日期:2021-08-17 10:38:04 浏览: 评论:0 

这篇文章主要介绍了php 重写分页器 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

  1. <?php 
  2.  
  3. class MyPager extends CLinkPager 
  4.   const CSS_FIRST_PAGE='first'
  5.   const CSS_LAST_PAGE='last'
  6.   const CSS_PREVIOUS_PAGE='previous'
  7.   const CSS_NEXT_PAGE='next'
  8.   const CSS_INTERNAL_PAGE='page'
  9.   const CSS_HIDDEN_PAGE='hidden'
  10.   const CSS_SELECTED_PAGE='selected'
  11.  
  12.   /** 
  13.    * @var string the CSS class for the first page button. Defaults to 'first'. 
  14.    * @since 1.1.11 
  15.    */ 
  16.   public $firstPageCssClass=self::CSS_FIRST_PAGE; 
  17.   /** 
  18.    * @var string the CSS class for the last page button. Defaults to 'last'. 
  19.    * @since 1.1.11 
  20.    */ 
  21.   public $lastPageCssClass=self::CSS_LAST_PAGE; 
  22.   /** 
  23.    * @var string the CSS class for the previous page button. Defaults to 'previous'. 
  24.    * @since 1.1.11 
  25.    */ 
  26.   public $previousPageCssClass=self::CSS_PREVIOUS_PAGE; 
  27.   /** 
  28.    * @var string the CSS class for the next page button. Defaults to 'next'. 
  29.    * @since 1.1.11 
  30.    */ 
  31.   public $nextPageCssClass=self::CSS_NEXT_PAGE; 
  32.   /** 
  33.    * @var string the CSS class for the internal page buttons. Defaults to 'page'. 
  34.    * @since 1.1.11 
  35.    */ 
  36.   public $internalPageCssClass=self::CSS_INTERNAL_PAGE; 
  37.   /** 
  38.    * @var string the CSS class for the hidden page buttons. Defaults to 'hidden'. 
  39.    * @since 1.1.11 
  40.    */ 
  41.   public $hiddenPageCssClass=self::CSS_HIDDEN_PAGE; 
  42.   /** 
  43.    * @var string the CSS class for the selected page buttons. Defaults to 'selected'. 
  44.    * @since 1.1.11 
  45.    */ 
  46.   public $selectedPageCssClass=self::CSS_SELECTED_PAGE; 
  47.   /** 
  48.    * @var integer maximum number of page buttons that can be displayed. Defaults to 10. 
  49.    */ 
  50.   public $maxButtonCount=10; 
  51.   /** 
  52.    * @var string the text label for the next page button. Defaults to 'Next >'. 
  53.    */ 
  54.   public $nextPageLabel
  55.   /** 
  56.    * @var string the text label for the previous page button. Defaults to '< Previous'. 
  57.    */ 
  58.   public $prevPageLabel
  59.   /** 
  60.    * @var string the text label for the first page button. Defaults to '<< First'. 
  61.    */ 
  62.   public $firstPageLabel
  63.   /** 
  64.    * @var string the text label for the last page button. Defaults to 'Last >>'. 
  65.    */ 
  66.   public $lastPageLabel
  67.   /** 
  68.    * @var string the text shown before page buttons. Defaults to 'Go to page: '. 
  69.    */ 
  70.   public $header
  71.   /** 
  72.    * @var string the text shown after page buttons. 
  73.    */ 
  74.   public $footer=''
  75.   /** 
  76.    * @var mixed the CSS file used for the widget. Defaults to null, meaning 
  77.    * using the default CSS file included together with the widget. 
  78.    * If false, no CSS file will be used. Otherwise, the specified CSS file 
  79.    * will be included when using this widget. 
  80.    */ 
  81.   public $cssFile
  82.   /** 
  83.    * @var array HTML attributes for the pager container tag. 
  84.    */ 
  85.   public $htmlOptions=array(); 
  86.  
  87.   /** 
  88.    * Initializes the pager by setting some default property values. 
  89.    */ 
  90.   public function init() 
  91.   { 
  92.     if($this->nextPageLabel===null) 
  93.       $this->nextPageLabel=Yii::t('yii','Next >'); 
  94.     if($this->prevPageLabel===null) 
  95.       $this->prevPageLabel=Yii::t('yii','< Previous'); 
  96.     //if($this->firstPageLabel===null) 
  97.     // $this->firstPageLabel=Yii::t('yii','<< First'); 
  98.     //if($this->lastPageLabel===null) 
  99.     // $this->lastPageLabel=Yii::t('yii','Last >>'); 
  100.     if($this->header===null) 
  101.       $this->header=Yii::t('yii','Go to page: '); 
  102.  
  103.     if(!isset($this->htmlOptions['id'])) 
  104.       $this->htmlOptions['id']=$this->getId(); 
  105.     if(!isset($this->htmlOptions['class'])) 
  106.       $this->htmlOptions['class']='yiiPager'
  107.   } 
  108.  
  109.   /** 
  110.    * Executes the widget. 
  111.    * This overrides the parent implementation by displaying the generated page buttons. 
  112.    */ 
  113.   public function run() 
  114.   { 
  115.     $this->registerClientScript(); 
  116.     $buttons=$this->createPageButtons(); 
  117.     if(emptyempty($buttons)) 
  118.       return
  119.     echo $this->header; 
  120. //   echo CHtml::tag('ul',$this->htmlOptions,implode("\n",$buttons)); 
  121.     echo implode("\n",$buttons); 
  122.     echo $this->footer; 
  123.   } 
  124.  
  125.   /** 
  126.    * Creates the page buttons. 
  127.    * @return array a list of page buttons (in HTML code). 
  128.    */ 
  129.   protected function createPageButtons() 
  130.   { 
  131.     if(($pageCount=$this->getPageCount())<=1) 
  132.       return array(); 
  133.  
  134.     list($beginPage,$endPage,$ellipsis)=$this->getPageRange(); 
  135.  
  136.     $currentPage=$this->getCurrentPage(false); // currentPage is calculated in getPageRange() 
  137.     $buttons=array(); 
  138.  
  139.     // first page 
  140.     //$buttons[]=$this->createPageButton($this->firstPageLabel,0,$this->firstPageCssClass,$currentPage<=0,false); 
  141.  
  142.     // prev page 
  143.     if(($page=$currentPage-1)<0) 
  144.       $page=0; 
  145.     if($currentPage == 0){ 
  146.       $buttons[] = "<span style='background:#a3a3a3'><上一頁</span>"
  147.     }else
  148.       $buttons[]=$this->createPageButton($this->prevPageLabel,$page,$this->previousPageCssClass,$currentPage<=0,false); 
  149.     } 
  150.     // internal pages start 
  151.     // first 
  152.     $buttons[]=$this->createPageButton(1,0,$this->internalPageCssClass,false,$i==$currentPage); 
  153.     //middle 
  154.     if($ellipsis == 'both'){ 
  155.       $buttons[] = "<span style='background:#a3a3a3'>...</span>"
  156.     } 
  157.     for($i=$beginPage;$i<=$endPage;++$i){ 
  158.       if($ellipsis == 'left' && $i == $beginPage){ 
  159.         $buttons[] = "<span style='background:#a3a3a3'>...</span>"
  160.       } 
  161.       $buttons[]=$this->createPageButton($i+1,$i,$this->internalPageCssClass,false,$i==$currentPage); 
  162.       if($ellipsis == 'right' && $i == $endPage){ 
  163.         $buttons[] = "<span style='background:#a3a3a3'>...</span>"
  164.       } 
  165.     }   
  166.     if($ellipsis == 'both'){ 
  167.       $buttons[] = "<span style='background:#a3a3a3'>...</span>"
  168.     } 
  169.     // last 
  170.     $buttons[]=$this->createPageButton($pageCount,$pageCount - 1,$this->internalPageCssClass,false,$i==$currentPage); 
  171.     // internal pages end 
  172.     // next page 
  173.     if(($page=$currentPage+1)>=$pageCount-1) 
  174.       $page=$pageCount-1; 
  175.     if($currentPage == ($pageCount-1)){ 
  176.       $buttons[] = "<span style='background:#a3a3a3'>下一頁></span>"
  177.     }else
  178.       $buttons[]=$this->createPageButton($this->nextPageLabel,$page,$this->nextPageCssClass,$currentPage>=$pageCount-1,false); 
  179.     } 
  180.     // last page 
  181.     //$buttons[]=$this->createPageButton($this->lastPageLabel,$pageCount-1,$this->lastPageCssClass,$currentPage>=$pageCount-1,false); 
  182.  
  183.     return $buttons
  184.   } 
  185.  
  186.   /** 
  187.    * Creates a page button. 
  188.    * You may override this method to customize the page buttons. 
  189.    * @param string $label the text label for the button 
  190.    * @param integer $page the page number 
  191.    * @param string $class the CSS class for the page button. 
  192.    * @param boolean $hidden whether this page button is visible 
  193.    * @param boolean $selected whether this page button is selected 
  194.    * @return string the generated button 
  195.    */ 
  196.   protected function createPageButton($label,$page,$class,$hidden,$selected
  197.   { 
  198.     if($hidden || $selected
  199.       $class.=' '.($hidden ? $this->hiddenPageCssClass : $this->selectedPageCssClass); 
  200.     if ($selected) { 
  201.       $result = "<span>" . ++$page . "</span>"
  202.     } else { 
  203.       $result = CHtml::link($label,$this->createPageUrl($page)); 
  204.     } 
  205.     return $result
  206.   } 
  207.  
  208.   /** 
  209.    * @return array the begin and end pages that need to be displayed. 
  210.    */ 
  211.   protected function getPageRange() 
  212.   { 
  213.     $currentPage=$this->getCurrentPage(); 
  214.     $pageCount=$this->getPageCount(); 
  215.     /*$beginPage=max(0, $currentPage-(int)($this->maxButtonCount/2)); 
  216.     if(($endPage=$beginPage+$this->maxButtonCount-1)>=$pageCount) 
  217.     { 
  218.       $endPage=$pageCount-1; 
  219.       $beginPage=max(0,$endPage-$this->maxButtonCount+1); 
  220.     }*/ 
  221.     if($pageCount > $this->maxButtonCount){ 
  222.       if($currentPage > 4 && $currentPage < ($pageCount - 4)){ 
  223.         // print_r('a'); 
  224.         $beginPage = $currentPage - 2; 
  225.         $endPage = $currentPage + 2; 
  226.         $ellipsis = 'both'
  227.       }else
  228.         $beginPage=max(1, $currentPage-(int)($this->maxButtonCount/2)); 
  229.         if($beginPage == 1){ 
  230.           $ellipsis = 'right'
  231.         }else
  232.           $ellipsis = 'left'
  233.         } 
  234.         if(($endPage=$beginPage+$this->maxButtonCount-1)>=$pageCount
  235.         { 
  236.           // print_r('b'); 
  237.           $endPage=$pageCount-2; 
  238.           $beginPage=max(1,$endPage-$this->maxButtonCount+1); 
  239.         }elseif(($endPage=$beginPage+$this->maxButtonCount-1)>=$pageCount-2){ 
  240.           // print_r('c'); 
  241.           $endPage=$pageCount-2; 
  242.         } 
  243.  
  244.       } 
  245.     }else
  246.       $beginPage=max(1, $currentPage-(int)($this->maxButtonCount/2)); 
  247.       if(($endPage=$beginPage+$this->maxButtonCount-1)>=$pageCount
  248.       { 
  249.         $endPage=$pageCount-2; 
  250.         $beginPage=max(1,$endPage-$this->maxButtonCount+1); 
  251.       } 
  252.     } 
  253.  
  254.     return array($beginPage,$endPage$ellipsis); 
  255.   } 
  256.  
  257.   /** 
  258.    * Registers the needed client scripts (mainly CSS file). 
  259.    */ 
  260.   public function registerClientScript() 
  261.   { 
  262.     if($this->cssFile!==false) 
  263.       self::registerCssFile($this->cssFile); 
  264.   } 
  265.  
  266.   /** 
  267.    * Registers the needed CSS file. 
  268.    * @param string $url the CSS URL. If null, a default CSS URL will be used. 
  269.    */ 
  270.   public static function registerCssFile($url=null) 
  271.   { 
  272.     if($url===null) 
  273.       $url=CHtml::asset(Yii::getPathOfAlias('system.web.widgets.pagers.pager').'.css'); 
  274.     Yii::app()->getClientScript()->registerCssFile($url); 
  275.   } 

3、调用方式

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

  1. $this->widget('zii.widgets.CListView'array
  2.   'dataProvider'=>$dataProvider
  3.   'itemView'=>'_view_t'
  4.   'pager'=>array
  5.   'class'=>'MyPager'
  6.  ) 
  7. ));

Tags: php分页器 CLinkPager

分享到: