这篇文章主要介绍了php 重写分页器 CLinkPager的实例的相关资料,希望通过本文能帮助到大家,让大家实现这样的功能,需要的朋友可以参考下
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
<?phpclass 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 pageif(($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);//middleif($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 pageif(($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);}}
调用方式在View里的相应widget,定义pager的class为自定义的分页器类名即可,参考:
$this->widget('zii.widgets.CListView', array('dataProvider'=>$dataProvider,'itemView'=>'_view_t','pager'=>array('class'=>'MyPager',)));
相关推荐
© 2020 asciim码
人生就是一场修行