Chinaunix首页 | 论坛 | 博客
  • 博客访问: 601104
  • 博文数量: 129
  • 博客积分: 8026
  • 博客等级: 中将
  • 技术积分: 1300
  • 用 户 组: 普通用户
  • 注册时间: 2006-02-21 14:39
文章分类

全部博文(129)

文章存档

2011年(1)

2007年(26)

2006年(102)

我的朋友

分类:

2006-07-22 13:15:31

本文介绍的分页样式效果描述如下:
只显示第一页,最后页,当前页,及当前页的前两页,当前页的后两页导航,中间用..代替
例:假设总页数为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!=&& $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>&& $v $pages$pager[] = $v
}

if(
$cpage $pages-3$pager[] = '-'
;
$pager[] = $pages;

阅读(1298) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~