本文中,Hick 先介绍一下 PEAR 的 Pager 包。然后谈谈分页的思路,再结合实际运用, 最后对它的部分方法和属性作一下介绍。
顺便提一下, Smarty 也有分页插件,比如 Smarty Pager ,看了 一下,感觉在把简单的问题搞复杂化。
[声明] 转载请保留原文信息:
作者: hick<hick@163.com> 出处: http://www.hickwu.com/doc/pearPager.htm
如果已经安装好 PEAR 环境,常规的安装 PEAR 包的方法就可以安装最新版本:
之所以单独说一下安装,其实是想说 Pager 包可以单独使用,直接到官方下载到压缩包,解压缩到某目录, 并把目录名修改为 Pager, 最后把其父目录添加到 inlcude_path 中即可。
注意:由于 linux 等环境下区分大小写,不要修改目录以及文件名等。
通常以静态方法 factory 创建 Pager 类的实例。创建实例时,需要以数组的形 式传递参数,每个数组的元素是一个参数。默认情况下必须有一个参数: itemData 或者 totalItems,参见下面的实例::
require_once("Pager/Pager.php");
// 参数数组
$params = array(
// 分页模式,有两种显示模式,Jumping 和 Sliding
'mode' => 'Jumping',
// 每页记录数
'perPage' => 3,
// Jumping 模式下为可选页数,Sliding 模式下为当前页前后可选页数
'delta' => 5,
'itemData' => array(
'record01',
'record02',
'record03',
'record04',
'record05',
'record06',
'record07',
'record08',
'record09',
'record10',
'record11',
'record12',
'record13',
'record14',
'record15',
'record15',
'record15',
'record16'
)
);
// 创建 Pager 对象
$pager = Pager::factory($params);
// 获得当前页(默认为第一页)的各种相关页链接: 前一页;后一页;所有页等等
$links = $pager->getLinks();
echo $links['all'];
其中 itemData 元素是要分页的数据,通常它也是一个多元数组。其他参数请参 考 官方参考文档
通过上面的 简单实例 的学习,会有这么一个想法:使用 PEAR Pager 来对一 个新闻列表分页,可以把所有新闻的基本信息保存成一个二维数组作为 itemData ,其实还可以把新闻总数作为 totalItems 传递。考虑到当前页一般只 需要显示若干条新闻,而不是全部,所以能够只查询出当前页需要显示的若干条 当然更高效率。
这里顺便说一下两种分页的思路,一种是从数据库查询出所有记录,然后选择当 前需要显示的若干记录;另外一种就是先算出当前页需要显示的记录范围,结合 mysql 的 limit 或者其他数据库的类似语法,查询出当前需要显示的若干记录。 看上去后者比较快,但是从数据库查询的角度来说,实现后一种方法往往需要进 行两次查询数据库,第一次查询总的记录数,第二次查询需要的若干条记录。第 一种查询方法在处理记录数多时,会比较耗资源。一般来说,考虑到数据量的增 加,用第二种方法会比较好。对查询两次数据库的劣势,可以通过在 URL 传递记 录总数进行一定程度上的弥补(数据库记录变动快时不太好)。
下面介绍一下应用 PEAR Pager 于使用了 Smarty (其实跟 Smarty 也没什么关系, 嘿嘿)的系统中的方法:
下面的使用比较原始,还可以进一步对 Pager 进行封装::
// 获得总的新闻数
$totalItems = $_GET['totalItems'];
// 每页显示的新闻数
$pageSize = 10;
// 当前页编号
$pageID = empty($_GET['pageID']) ? 1 : $_GET['pageID'];
// limit 子句
$limit = ($pageID - 1) * $pageSize . ", $pageSize";
// 获得新闻列表
$newsList = $news->get_list('latest', $limit, $totalItems);
// 再对$_GET['totalItems']赋值,也是Pager自定义URL GET参数的方法
$_GET['totalItems'] = $totalItems;
// 创建 Pager 对象
$params = array(
'mode' => 'Sliding',
'perPage' => $pageSize,
'delta' => 2,
'totalItems' => $totalItems,
);
$pager = Pager::factory($params);
// 获得当前页(默认为第一页)的各种相关页链接
$links = $pager->getLinks();
// 模板赋值
$tpl->assign("pager", $links);
注意:以上代码修改自 Hick 在项目中实际应用的代码,跟 Hick 在实际运用中 有些不同。
这里说的参数主要是 Pager::factory 的参数,该函数的参数至少是 itemData 和 totalItem 中的一个。append 参数( 默认为 true)为 false 时,还需要指定 fileName 参数。
我喜欢总结自己的学习并整理成文档. 开始也只是想把自己学习 PEAR Pager 的 经验总结一下, 留作以后备用. 弄完了, 感觉应该分享出来. 既然要弄出来给别 人看, 读者就不一样了, 需要考虑的就多了, 要分享出个东西来也不容易啊, 嘿 嘿. 差不多是第一次比较正式的写这样的东西, 感觉有点点麻烦, 以后要少考虑 一点.