- 加入我的QQ群
- 关注我的百家号
扫描下面的二维码,“关注”我的百家号。
在前一篇分享一个简单实用的PHP列表分页类里,我们介绍了一个PHP列表分页类,实现了一个简单而实用的PHP分页。但美中不足的是:如果我们的网站的列表页有成千上万个分页,那在页面就会出面成千上万个分页的页码吗(如下图)?这样,虽然分页功能实现了,但是页面上确实不美观。
能不能只让页面上只显示10个分页页码按钮,而在进入不同的分页页面时,这10个分页页码会相应地发生变化,如:在第1页到第5页时,就显示 【1 2 3 4 5 6 7 8 9 10】这10个页码,在第6页时,就显示【2 3 4 5 6 7 8 9 10 11】,在第7页时,就显示【3 4 5 6 7 8 9 10 11 12】这几个页码,以此类推,效果如下图。
其实实现起来也不难,我们只需在这个分页类的代码中加入几个参数和一些判断,如下:
//设置每页显示的页码的数量
$maxPageCount = ($maxPageCount>$num) ? $num : $maxPageCount; //如果限制页码数 > 总页数
$buffCount=5; //初始限制数
$startPage=1; //开始的页码if($page< $buffCount){ //如果页码 < 5 时,
$startPage=1; //for循环起始页为1
$endPage=$startPage+$maxPageCount-1; //for循环结束页为 (起始页 + 每页显示页码数 -1)
}else if($page>=$buffCount and $page<($total-$maxPageCount) ){
//如果页码 > 5 并且 页码 < (总页数 - 每页显示页码数)
$startPage=$page-$buffCount+1; //for循环起始页为 (当前页 - 初始限制数 + 1)
$endPage=$startPage+$maxPageCount-1; //for循环结束页为 (起始页 + 每页显示页码数 -1)
}else{ //否则
$startPage=$total-$maxPageCount; //for循环起始页为 (总页数 - 每页显示页码数)
$endPage=$startPage+$maxPageCount; //for循环结束页为 (起始页 + 每页显示页码数)
}
这里我们加了4个参数:$maxPageCount每页页码数量,$buffCount初始限制数,$startPage循环开始的页码,$endPage循环结束的页码。然后进行判断。for循环语句中要用到$startPage和$endPage,代码如下:
for($i=$startPage; $i<=$endPage; $i++){
if($i==$page){ //如果是当前页面,就添加class='cur'
$pages .= '<span class="page_now">'.$i.'</span> ';
}else{
$pages .= '<a href="'.$url2.'page='.$i.'" >'.$i.'</a> ';
}
}
全部代码如下:
class PageTool{
/*显示分页
$total 总条数(文章总条数)
$perpage 每页显示多少条
$page 当前页面的页码
$maxPageCount 显示分页页码数量,如:有100个分页,我只想让页面显示10个分页按钮
例: index.php?cat_id=3&act=del&page=1
*/
public function show($total,$perpage=10,$page=1,$maxPageCount=10){//获取页面URL前置
$url = $_SERVER['REQUEST_URI'];
$url_arr = parse_url($url);//获取URL后置参数,分解成数组
$query = array();
if(isset($url_arr['query'])){
parse_str($url_arr['query'],$query);
}//销毁 $query['page'],因为page会变化,
//而 分类ID号 在分页页面 是不会变的。所以作为固定前置
if(isset($query['page'])){
unset($query['page']);
}//组合后置参数为字符串
$afterparam = !empty($query) ? http_build_query($query).'&' : '';//组合 固定URL前置
$url2 = $url_arr['path'].'?'.$afterparam;//显示分页
$num = ceil($total/$perpage); //总页数//设置每页显示的页码的数量
$maxPageCount = ($maxPageCount>$num) ? $num : $maxPageCount; //如果限制页码数 > 总页数
$buffCount=5; //初始限制数
$startPage=1; //开始的页码
if($page< $buffCount){ //如果页码 < 5 时,
$startPage=1; //for循环起始页为1
$endPage=$startPage+$maxPageCount-1; //for循环结束页为 (起始页 + 每页显示页码数 -1)
}else if($page>=$buffCount and $page<($total-$maxPageCount) ){
//如果页码 > 5 并且 页码 < (总页数 - 每页显示页码数)
$startPage=$page-$buffCount+1; //for循环起始页为 (当前页 - 初始限制数 + 1)
$endPage=$startPage+$maxPageCount-1; //for循环结束页为 (起始页 + 每页显示页码数 -1)
}else{ //否则
$startPage=$total-$maxPageCount; //for循环起始页为 (总页数 - 每页显示页码数)
$endPage=$startPage+$maxPageCount; //for循环结束页为 (起始页 + 每页显示页码数)
}//把分页 页码按钮放到 字符串中
$pages = '<span style="margin-right:10px;" class="f_l f6">总计 <b>'.$total.'</b> 个记录<b>'.$num.'</b>页</span>';
//如果当前页面不是首页,就显示首页链接
if( $page > 1){
$pages .= '<a href="'.$url2.'page=1" >首页</a> <a href="'.$url2.'page='.($page-1).'" >上一页</a> ';
}
//for($i=1; $i<=$num; $i++){
for($i=$startPage; $i<=$endPage; $i++){
if($i==$page){ //如果是当前页面,就添加class='cur'
$pages .= '<span class="page_now">'.$i.'</span> ';
}else{
$pages .= '<a href="'.$url2.'page='.$i.'" >'.$i.'</a> ';
}}
//如果当前页面不是尾页,就显示尾页链接
if( $page < $num){
$pages .= '<a href="'.$url2.'page='.($page+1).'" >下一页</a> <a href="'.$url2.'page='.$num.'" >尾页</a>';
}
return $pages;
}}
好了,这个PHP分页类就比较完善了,在使用上就更加完美了。如果大家喜欢,就拿去用用看吧。呵呵