php 重写分页器 CLinkPager的实例
1、自定义的分页器类放在哪里?
 有两个位置可以放, 
第一种是放在 protected/extensions 中,在使用是import进来,或在config文件中import进来; 
 
第二种是放在 protected/components 中,作为组件存在,不需要import 
2、用派生方式是最好的 
入口函数是:public function run() ,当显示分页器时run()被调用,里面的输出就会显示在相应位置; 
 
其他的完全自定义,如果你不知道上一页、下一页、首页、尾页、总页数、当前页码等信息,可以参考CLinkPager的源码,yii/frameworks/web/widgets/pagers/CLinkPager.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,$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,false);
}
// internal pages start
// first
$buttons[]=$this->createPageButton(1,$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,$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,$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,$this->nextPageCssClass,$currentPage>=$pageCount-1,false);
}
// last page
//$buttons[]=$this->createPageButton($this->lastPageLabel,$pageCount-1,$this->lastPageCssClass,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,$class,$hidden,$selected) 
{ 
if($hidden || $selected) 
$class.=' '.($hidden ? $this->hiddenPageCssClass : $this->selectedPageCssClass); 
if ($selected) { 
$result = "" . ++$page . ""; 
} 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; 
} 
                        (编辑:莱芜站长网) 
【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! 
                       |