当前位置: 网站首页 - 北京网站建设

简单php分页类Pager

admin 2022-02-25

<?php
/**

 * 分页类待完善

* 首发及维护izoe.cc 

*20220225

 */
class Pager
{
public $curPage = 1;
    public $pageSize = 10;
    public $totalItems;
    public $url_format;
    public $totalPages;
    public $startPage;
    public $endPage;
public $baseUrl='?';

    protected $_format = array(
        'preNums'         => 2,
        'nextNums'         => 7,
        'showSinglePage'   => false,
        'start'           => '<style type="text/css">.pages{font-size:12px;clear:both;} .pages *{border:1px solid #E6E7E1;height:24px;line-height:24px;padding:3px 6px;margin:1px;color:#0099CC;} .pages b{background-color:#0099CC;border-color:#0099CC;color:#FFFFFF;} .pages a {text-decoration:none;} .pages a:hover{border-color:#0099CC;} .pn{border-color:#0099CC;}</style><div class="pages">',
        'pre'             => '<a class="pn" href="%link%">&lt;&lt;</a>',
        'next'             => '<a class="pn" href="%link%">&gt;&gt;</a>',  
'first'             => '<a class="pn" href="%link%">first</a>',
        'last'             => '<a class="pn" href="%link%">last</a>',  
        'current'          => '<b>%page%</b>',
        'page'             => '<a href="%link%">%page%</a>',
        'end'           => '</div>',
'info'    => "<li><span class="pageinfo">共 <strong>%totalPages%</strong>页<strong>%totalItems%</strong>条</span></li>rn",
    );

    /**
     * Constructor
     * 
     * 配置翻页类
     *
     * @param int $curPage
     * @param int $pageSize
     * @param int $totalItems
     * @param string $url
     */
    public function __construct($totalItems, $pageSize = 20,  $url_format = '')
    {
        $this->curPage      = abs(intval($_GET['page']));
        $this->pageSize     = abs(intval($pageSize));
        $this->totalItems   = abs(intval($totalItems));
        $this->url_format   = $url_format;

$this->init();
    }
/**
     * Init Pager
     * 初始化pager
     * 
     * 翻页算法
     */
    public function init()
    {
        //计算总页数
        $this->totalPages = ceil($this->totalItems / $this->pageSize);
//算开始页数
        $this->startPage = $this->curPage - $this->_format['preNums'];
        if (1 > $this->startPage) $this->startPage = 1;

        //算结束页数
        $this->endPage = $this->curPage + $this->_format['nextNums'];
        //超出部分,显示最新的一页
        if ($this->endPage > $this->totalPages) $this->endPage = $this->totalPages;
}

  /**
     *start,end HTML
     * @param string $parts[start,end]
     * @param string $format
     * @return string
     */
    public function wrap($parts,$format = null)
    {
        if (is_null($format)) $format = $this->_format[$parts];

        return $this->page(null, $format);
    }

    /**
     * Current page HTML
     * 当前页配置
     * @param string $format
     * @return string
     */
    public function current($format = null)
    {
        if (is_null($format)) $format = $this->_format['current'];

        return $this->page($this->curPage, $format);

    }
public function isLast(){
return $this->curPage==$this->totalPages;
}
public function isFirst(){
return $this->curPage==1;
}
    /**
     * Page HTML
     * 
     * 字符串替换
     *
     * @param int $page
     * @param string $format
     * @return string
     */
    public function page($page, $format = null)
    {
if (is_null($format)&&is_string($page))$format = $this->_format[$page];
if (is_null($format)&&is_numeric($page)) $format = $this->_format['page'];

if(in_array($page,['pre','first'])&&$this->isFirst())
{
$format = $this->_format['current'];
}
if(in_array($page,['next','last'])&&$this->isLast())
{
$format = $this->_format['current'];
}
if($page===$this->curPage)
$format = $this->_format['current'];

        $p = array(
            '%link%'        => $this->page_url($page),
            '%curPage%'     => $this->curPage,
            '%pageSize%'    => $this->pageSize,
            '%totalItems%'  => $this->totalItems,
            '%totalPages%'  => $this->totalPages,
            '%startPage%'     => $this->startPage,
            '%endPage%'     => $this->endPage,
            '%page%'        => $this->page_text($page),
        );
        return str_replace(array_keys($p), $p, $format);
    }
public function page_text($page){
//if(!is_numeric($page))return $_Lang['pagelist_'.$page];
return $page;
}
public function page_url($page){
$p=['pre'=>$this->curPage-1,'next'=>$this->curPage+1,'first'=>1,'last'=>$this->totalPages];
$url=$this->baseUrl."page={page}";
if(!is_numeric($page))return str_replace('{page}',$p[$page],$url);
return str_replace('{page}',$page,$url);
}
    /**
     * Pages HTML
     * 处理替换
     * @return string
     */
public function fill($list_len,$listitem){
if($this->totalPages<=1 )
{
return "<li><span class="pageinfo">共 <strong>1</strong>页<strong>".$this->totalItems."</strong>条记录</span></li>rn";
}
$plist = '';
$plist.=$this->wrap('start');
if (1 == $this->startPage - 1) {
            $plist .= $this->page(1);
        } elseif (1 < $this->startPage - 1) {
            $plist .= $this->page('first');
$plist .=$this->page('pre');
        }

for ($i = $this->startPage; $i <= $this->endPage; $i++) {
            $plist .= ($i == $this->curPage ? $this->current() : $this->page($i));
        }

        if (1 == $this->totalPages - $this->endPage ) {
            $plist .= $this->page($this->totalPages);
        } elseif (1 < $this->totalPages - $this->endPage ) {
$plist .=$this->page('next');
            $plist .= $this->page('last');
        }

        if(preg_match('/index/i', $listitem)) $plist .= $this->page('first');
        if(preg_match('/pre/i', $listitem)) $plist .= $this->page('pre');
        if(preg_match('/pageno/i', $listitem)) $plist .= $this->pageno($list_len);
        if(preg_match('/next/i', $listitem)) $plist .= $this->page('next');
        if(preg_match('/end/i', $listitem)) $plist .= $this->page('last');
        if(preg_match('/option/i', $listitem)) $plist .= $this->options();
        if(preg_match('/info/i', $listitem)) $plist .= $this->page('info');
$plist.=$this->wrap('end');

        return $plist;
}
public function options(){
//option链接
        $optionlist = '';$url=$this->baseUrl."page={page}";
        $optionlen = strlen($this->totalPages);
        $optionlen = $optionlen*12 + 18;
        if($optionlen < 36) $optionlen = 36;
        if($optionlen > 100) $optionlen = 100;
        $optionlist = "<li><select name='sldd' style='width:{$optionlen}px' onchange='location.href=this.options[this.selectedIndex].value;'>rn";
        for($mjj=1;$mjj<=$this->totalPages;$mjj++)
        {
            if($mjj==$this->curPage)
            {
                $optionlist .= "<option value='".str_replace("{page}",$mjj,$url)."' selected>$mjj</option>rn";
            }
            else
            {
                $optionlist .= "<option value='".str_replace("{page}",$mjj,$url)."'>$mjj</option>rn";
            }
        }
        return $optionlist .= "</select></li>rn";
}

public function pagerule(){
if(URL_MODEL=="rewrite"){
return  $this->baseurl."page/{page}";
}
else{ return  $this->baseurl."&page={page}"; }

}
public function pageno($list_len){
if($list_len=='' || preg_match("/[^0-9]/", $list_len))
        {
            $list_len=3;
        }
$url=$this->baseUrl."page={page}";
//获得数字链接
        $listdd="";
        $total_list = $list_len * 2 + 1;
#计算列表开始结束位置
        if($this->curPage >= $total_list)
        {
            $j = $this->curPage-$list_len;
            $total_list = $this->curPage+$list_len;
            if($total_list>$this->totalPages)
            {
                $total_list=$this->totalPages;
            }
        }
        else
        {
            $j=1;
            if($total_list>$this->totalPages)
            {
                $total_list=$this->totalPages;
            }
        }
        for($j;$j<=$total_list;$j++)
        {
            if($j==$this->curPage)
            {
                $listdd.= $this->current();
            }
            else
            {
                $listdd.=$this->page($j);
            }
        }
return $listdd;
}
/**
     *  获取静态的分页列表
     *
     * @access    public
     * @param     string  $list_len  列表宽度
     * @param     string  $list_len  列表样式
     * @return    string
     */

    function GetPageListST($list_len,$listitem="info,index,end,pre,next,pageno,option")
    {
        echo  $this->fill($list_len,$listitem);
    }
   
}


(new Pager(4410))->GetPageListST(5);