本文介绍的分页样式效果描述如下:
只显示第一页,最后页,当前页,及当前页的前两页,当前页的后两页导航,中间用..代替
例:假设总页数为20
当前页是10,则显示如下:
1..8 9 10 11 12..20
当前页18,显示为:
1..16 17 18 19 20
当前为第2页,显示为:
1 2 3 4..20
实现方法:
$pages = 20; //总页数 $cpage = 10; //当前页 foreach(range(1,$pages) as $v){ if($v!=1 && $v<=$cpage-3) $pager[] = 0; elseif($v!=$pages && $v>$cpage+2) $pager[] = '-'; else $pager[] = $v; } $pager = array_unique($pager); |
上述代码返回一个数组$pager,该数组保存了要显示的页码数字,而要省略的则用0和'-'代替,之后,便可直接循环显示结果或使用模板引擎来解析显示出实际效果,下面用smarty演示:
{foreach item=item from=$pager}
{if $item eq 0 || $item eq '-'}..
{else}
{$item}
{/if}
{/foreach}
当然,你也可以使用自定义的样式去美化显示结果
关于分页的几点注意:
1)分页的处理最后与数据库处理分离,分页操作只接受必要的参数:如总页数(或总纪录数),当前页等.
2)如果是对查询搜索等的结果分页,要注意post变量的再传递,否则,翻页后,查询结果会丢失
修改:
经实践测试,上述的方法由于循环了所有页码,当页数很大时,效率有时显的下降,改成下面的方法,效率不错,而且不受页数的影响:
$pager[] = 1; if($cpage > 4) $pager[] = '-'; foreach(range($cpage-2,$cpage+2) as $v){ if($v>1 && $v < $pages) $pager[] = $v; } if($cpage < $pages-3) $pager[] = '-'; $pager[] = $pages; |
阅读(1319) | 评论(0) | 转发(0) |