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
<?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',
)
));
以上就是php重写分页器clinkpager的示例代码分享的详细内容。