刚完成一个分页的功能,在这里记述一下,顺便理一理自己的思路。把最后演示的结果上传到优酷了,还在审核,稍后会加超链接的。
Part1 分页原理
这里我不打算直接贴代码,因为当我火急火燎的找原理的时候,你居然给我看代码,我只能说一句:妈卖批。。。。。。
1.1 原理
其实从本质上来讲分页的原理就是:
- 当前页数:$currentPage
- 每页显示的数据条数:$count
这两个数字是我们唯一需要知道的,接着就是借助数据库的limit了,看下面的页数对应数据库中记录数的表。
假设每页显示5条记录
页数($currentPage) | 记录数(假设id为主键,自增,起始为1) |
---|---|
1 | 1,2,3,4,5 |
2 | 6,7,8,9,10 |
3 | 11,12,13,14,15 |
假设我现在要查询某一页的数据(对应于其中的一行记录),那么我设置sql的limit(‘偏移量’,’查询条数’),中的偏移量和查询条数怎么设置?
- 偏移量:($currentPage-1)*$count
- 查询条数:$count
按照这条规律再来看上面的表:
$currentPage | 偏移量 | 查询条数 | 结果 |
---|---|---|---|
1 | 0 | 5 | 1,2,3,4,5 |
2 | 5 | 5 | 6,7,8,9,10 |
3 | 10 | 5 | 11,12,13,14,15 |
所以我们只需要从前端得到当前的页数,也就是我们最下面看见的那一排数字。再来结合上面的公式,从数据库中使用limit就可以得出所有所需的数据了。
1.2 优化页数显示(可选页面数确定)
了解上面的分页原理之后,接着就是稍微麻烦一点的,怎么确定显示哪几个页?如果一个数据需要100页显示,那么怎么显示呢?我不可能把1-100的超链接全部放在页面中,这样很占空间,而且显示很丑,所以我们需要先显示一些备选项,再加一个下拉菜单,在这个下拉菜单中显示全部可选值。那么现在的问题就是怎么确定这些备选项??
下面是我从别人那里借鉴的一种解决办法,虽然他严正声明了转载他的内容要声明,但是我关掉页面后就找不到了,所以只能叫他雷锋了。。。。。。貌似我怎么废话越来越多了,哎,老了。
这里先设置一个值,叫做$showPage,这个值的功能就是表示总共显示的可选页面数为2*$showPage+1,怎么得到这个值呢?看下面的计算方法:
- 起始页面值:当前页面数-$showPage
- 结尾页面值:当前页面数+$showPage
那么全部的可选页面数量就是:
结尾页面值-其实页面值+1=2*$showPage+1
这个说明什么呢?看下面的实例:
- $showPage=5
- $currentPage=55
- 总页面数为100
那么显示在页面上的可选页面数量就是:
50 51 52 53 54 55 56 57 58 59 60
55为当前页面数量。
原理是这样,但是总有一些例外情况需要考虑,比如,$currentPage-$showPage时小于0,$currentPage+$showPage大于总页面数,那么这样的页面超链接是没有意义的,所以我们需要进行判断,如果$currentPage-$showPage小于0,则起始页面值等于1,如果$currentPage+$showPage大于总记录数,则结尾页面值等于总页面数。
到这里其实我们就是确定了一个区间,也就是可选页面的范围,而其范围就是一个连续的,步进为1的数组。我们要这么一个区间干什么呢?这里就需要结合代码来考虑了。
Part 2 代码展示
先从简单的开始,就是我们上面判断可选页面数的过程,我是专门写成了一个函数,顺便说一句,用php写的。
/**
* @param $currentPage 当前页面值
* @param $countPage 总页面数量
* @return array
*/
function setGoodsPages($currentPage,$countPage){
// 显示可选页面的数量,正常情况下为2*$showPage+1
$showPage=C('SHOW_PAGES');
// 设置其实页面值
$myde_i=$currentPage-$showPage;
// 设置结尾页面值
$myde_en=$currentPage+$showPage;
// 例外情况
if($myde_i<=0){
$myde_i=1;
}
if($myde_en>$countPage){
$myde_en=$countPage;
}
// 得到全部可选页面区间
$demon=range($myde_i,$myde_en);
return $demon;
}
最后返回的结果就是我们1.2讨论的结果,接着就是如何显示在前台了。
这里我使用的是thinkphp的内置标签来进行批量增加的:
<foreach name='pages' item='pages'>
<a href="{:U('goods/lst',array('page'=>$pages))}">$pages</a>
</foreach>
可以看到我们每次会传一个page的参数传回后台,就是我们调用setGoodsPages时所设置的$currentPage,同时这个值也是调用sql的limit时一个关键的参数,就是1.1中展现的那样。
可能有点乱,但是我尽力了。。。。。。
这里介绍一个插件:jquery.pagination.js,使用这个插件就可以简单一点。