PEAR_Pager的使用

本文介绍PEAR的Pager包,包括安装、使用示例及新闻列表分页应用。探讨分页策略,对比不同方法优劣。

1. 前言

本文中,Hick 先介绍一下 PEAR 的 Pager 包。然后谈谈分页的思路,再结合实际运用,最后对它的部分方法和属性作一下介绍。

顺便提一下, Smarty 也有分页插件,比如 Smarty Pager ,看了一下,感觉在把简单的问题搞复杂化。

[声明] 转载请保留原文信息:

作者: hick<hick@163.com>
出处: http://www.hickwu.com/doc/pearPager.htm

2. 安装

如果已经安装好 PEAR 环境,常规的安装 PEAR 包的方法就可以安装最新版本:

php5>pear install Pager

之所以单独说一下安装,其实是想说 Pager 包可以单独使用,直接到官方下载到压缩包,解压缩到某目录, 并把目录名修改为 Pager, 最后把其父目录添加到 inlcude_path 中即可。

注意:由于 linux 等环境下区分大小写,不要修改目录以及文件名等。

3. 简单实例

通常以静态方法 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 元素是要分页的数据,通常它也是一个多元数组。其他参数请参考 官方参考文档

4. 应用案例

通过上面的 简单实例 的学习,会有这么一个想法:使用 PEAR Pager 来对一个新闻列表分页,可以把所有新闻的基本信息保存成一个二维数组作为 itemData ,其实还可以把新闻总数作为 totalItems 传递。考虑到当前页一般只需要显示若干条新闻,而不是全部,所以能够只查询出当前页需要显示的若干条当然更高效率。

这里顺便说一下两种分页的思路,一种是从数据库查询出所有记录,然后选择当前需要显示的若干记录;另外一种就是先算出当前页需要显示的记录范围,结合 mysql 的 limit 或者其他数据库的类似语法,查询出当前需要显示的若干记录。看上去后者比较快,但是从数据库查询的角度来说,实现后一种方法往往需要进行两次查询数据库,第一次查询总的记录数,第二次查询需要的若干条记录。第一种查询方法在处理记录数多时,会比较耗资源。一般来说,考虑到数据量的增加,用第二种方法会比较好。对查询两次数据库的劣势,可以通过在 URL 传递记录总数进行一定程度上的弥补(数据库记录变动快时不太好)。

下面介绍一下应用 PEAR Pager 于使用了 Smarty (其实跟 Smarty 也没什么关系,嘿嘿)的系统中的方法:

  1. 在获得新闻记录时,使用类封装,通过方法 getList 的参数中 $limit 参数取得当前页需要的新闻记录的范围。
  2. 如果当前 URL 中没有传递总记录数这个参数,则从数据库查询出总记录数。由于获得总记录数的查询条件(SQL 语句的 where 部分)跟 get_list 方法的查询条件是一样的,因此 Hick 的做法是在这个方法增加一个功能(参数),最后一个参数为引用传递,传递符合当前新闻列表条件的新闻总数。
  3. 根据新闻总数以及 URL 传递过来的当前页等确定分页器的相关参数。

下面的使用比较原始,还可以进一步对 Pager 进行封装::

// 获得总的新闻数
$totalItems = 
  

  

1. 前言

本文中,Hick 先介绍一下 PEAR 的 Pager 包。然后谈谈分页的思路,再结合实际运用,最后对它的部分方法和属性作一下介绍。

顺便提一下, Smarty 也有分页插件,比如 Smarty Pager ,看了一下,感觉在把简单的问题搞复杂化。

[声明] 转载请保留原文信息:

作者: hick<hick@163.com>
出处: http://www.hickwu.com/doc/pearPager.htm

2. 安装

如果已经安装好 PEAR 环境,常规的安装 PEAR 包的方法就可以安装最新版本:

php5>pear install Pager

之所以单独说一下安装,其实是想说 Pager 包可以单独使用,直接到官方下载到压缩包,解压缩到某目录, 并把目录名修改为 Pager, 最后把其父目录添加到 inlcude_path 中即可。

注意:由于 linux 等环境下区分大小写,不要修改目录以及文件名等。

3. 简单实例

通常以静态方法 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 元素是要分页的数据,通常它也是一个多元数组。其他参数请参考 官方参考文档

4. 应用案例

通过上面的 简单实例 的学习,会有这么一个想法:使用 PEAR Pager 来对一个新闻列表分页,可以把所有新闻的基本信息保存成一个二维数组作为 itemData ,其实还可以把新闻总数作为 totalItems 传递。考虑到当前页一般只需要显示若干条新闻,而不是全部,所以能够只查询出当前页需要显示的若干条当然更高效率。

这里顺便说一下两种分页的思路,一种是从数据库查询出所有记录,然后选择当前需要显示的若干记录;另外一种就是先算出当前页需要显示的记录范围,结合 mysql 的 limit 或者其他数据库的类似语法,查询出当前需要显示的若干记录。看上去后者比较快,但是从数据库查询的角度来说,实现后一种方法往往需要进行两次查询数据库,第一次查询总的记录数,第二次查询需要的若干条记录。第一种查询方法在处理记录数多时,会比较耗资源。一般来说,考虑到数据量的增加,用第二种方法会比较好。对查询两次数据库的劣势,可以通过在 URL 传递记录总数进行一定程度上的弥补(数据库记录变动快时不太好)。

下面介绍一下应用 PEAR Pager 于使用了 Smarty (其实跟 Smarty 也没什么关系,嘿嘿)的系统中的方法:

  1. 在获得新闻记录时,使用类封装,通过方法 getList 的参数中 $limit 参数取得当前页需要的新闻记录的范围。
  2. 如果当前 URL 中没有传递总记录数这个参数,则从数据库查询出总记录数。由于获得总记录数的查询条件(SQL 语句的 where 部分)跟 get_list 方法的查询条件是一样的,因此 Hick 的做法是在这个方法增加一个功能(参数),最后一个参数为引用传递,传递符合当前新闻列表条件的新闻总数。
  3. 根据新闻总数以及 URL 传递过来的当前页等确定分页器的相关参数。

下面的使用比较原始,还可以进一步对 Pager 进行封装::

___FCKpd___2

注意:以上代码修改自 Hick 在项目中实际应用的代码,跟 Hick 在实际运用中有些不同。

5. 参数摘要

这里说的参数主要是 Pager::factory 的参数,该函数的参数至少是 itemData 和 totalItem 中的一个。append 参数( 默认为 true)为 false 时,还需要指定 fileName 参数。

itemData
用来分页的数据记录数组
totalItems
用来分页的记录总数
perPage
每页显示的记录数
delta
分页器当前页的前后显示的分页链接数
mode
Jumping 和 Sliding 两中分页样式
httpMethod
允许 GET 和 POST 方式传递分页相关信息
currentPage
默认载入的页
linkClass
分页链接的 css 样式
separator
分页器之间的分隔符
spacesBeforeSeparator 和 spacesAfterSeparator
分隔符号前后的空格数
curPageLinkClassName
当前页的 css 样式名
useSessions
如果设置为 true ,则在 session 中保存每页显示的记录数

6. 方法摘要

Pager::factory()
创建一个分页器实例
Pager::getCurrentPageID()
当前页编号
Pager::getLinks
获得当前页(默认为第一页)的各种相关页链接: 前一页;后一页;所有页等等的数组
Pager::getNextPageID
下一页编号
Pager::getOffsetByPageId()
Returns offsets for given pageID.
Pager::getPageData()
以数组形式返回当前页的记录
Pager::getPageIdByOffset()
Returns the page number for the given offset
Pager::getPageRangeByPageId()
Returns offsets for given pageID.
Pager::getPreviousPageID()
返回前一页编号
Pager::getperpageselectbox()
Returns a string with a XHTML SELECT menu, to choose how many items per page should be displayed.
Pager::isFirstPage()
当前页是否第一页
Pager::isLastPage()
当前页是否最后一页
Pager::isLastPageComplete()
最后一页是否完整(complete)
Pager::numItems()
总共的记录数
Pager::numPages()
返回总共的页数
Pager::Pager()
同 factory

7. 后记

我喜欢总结自己的学习并整理成文档. 开始也只是想把自己学习 PEAR Pager 的经验总结一下, 留作以后备用. 弄完了, 感觉应该分享出来. 既然要弄出来给别人看, 读者就不一样了, 需要考虑的就多了, 要分享出个东西来也不容易啊, 嘿嘿. 差不多是第一次比较正式的写这样的东西, 感觉有点点麻烦, 以后要少考虑一点.

  GET['totalItems']; // 每页显示的新闻数 $pageSize = 10; // 当前页编号 $pageID = empty(

1. 前言

本文中,Hick 先介绍一下 PEAR 的 Pager 包。然后谈谈分页的思路,再结合实际运用,最后对它的部分方法和属性作一下介绍。

顺便提一下, Smarty 也有分页插件,比如 Smarty Pager ,看了一下,感觉在把简单的问题搞复杂化。

[声明] 转载请保留原文信息:

作者: hick<hick@163.com>
出处: http://www.hickwu.com/doc/pearPager.htm

2. 安装

如果已经安装好 PEAR 环境,常规的安装 PEAR 包的方法就可以安装最新版本:

php5>pear install Pager

之所以单独说一下安装,其实是想说 Pager 包可以单独使用,直接到官方下载到压缩包,解压缩到某目录, 并把目录名修改为 Pager, 最后把其父目录添加到 inlcude_path 中即可。

注意:由于 linux 等环境下区分大小写,不要修改目录以及文件名等。

3. 简单实例

通常以静态方法 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 元素是要分页的数据,通常它也是一个多元数组。其他参数请参考 官方参考文档

4. 应用案例

通过上面的 简单实例 的学习,会有这么一个想法:使用 PEAR Pager 来对一个新闻列表分页,可以把所有新闻的基本信息保存成一个二维数组作为 itemData ,其实还可以把新闻总数作为 totalItems 传递。考虑到当前页一般只需要显示若干条新闻,而不是全部,所以能够只查询出当前页需要显示的若干条当然更高效率。

这里顺便说一下两种分页的思路,一种是从数据库查询出所有记录,然后选择当前需要显示的若干记录;另外一种就是先算出当前页需要显示的记录范围,结合 mysql 的 limit 或者其他数据库的类似语法,查询出当前需要显示的若干记录。看上去后者比较快,但是从数据库查询的角度来说,实现后一种方法往往需要进行两次查询数据库,第一次查询总的记录数,第二次查询需要的若干条记录。第一种查询方法在处理记录数多时,会比较耗资源。一般来说,考虑到数据量的增加,用第二种方法会比较好。对查询两次数据库的劣势,可以通过在 URL 传递记录总数进行一定程度上的弥补(数据库记录变动快时不太好)。

下面介绍一下应用 PEAR Pager 于使用了 Smarty (其实跟 Smarty 也没什么关系,嘿嘿)的系统中的方法:

  1. 在获得新闻记录时,使用类封装,通过方法 getList 的参数中 $limit 参数取得当前页需要的新闻记录的范围。
  2. 如果当前 URL 中没有传递总记录数这个参数,则从数据库查询出总记录数。由于获得总记录数的查询条件(SQL 语句的 where 部分)跟 get_list 方法的查询条件是一样的,因此 Hick 的做法是在这个方法增加一个功能(参数),最后一个参数为引用传递,传递符合当前新闻列表条件的新闻总数。
  3. 根据新闻总数以及 URL 传递过来的当前页等确定分页器的相关参数。

下面的使用比较原始,还可以进一步对 Pager 进行封装::

___FCKpd___2

注意:以上代码修改自 Hick 在项目中实际应用的代码,跟 Hick 在实际运用中有些不同。

5. 参数摘要

这里说的参数主要是 Pager::factory 的参数,该函数的参数至少是 itemData 和 totalItem 中的一个。append 参数( 默认为 true)为 false 时,还需要指定 fileName 参数。

itemData
用来分页的数据记录数组
totalItems
用来分页的记录总数
perPage
每页显示的记录数
delta
分页器当前页的前后显示的分页链接数
mode
Jumping 和 Sliding 两中分页样式
httpMethod
允许 GET 和 POST 方式传递分页相关信息
currentPage
默认载入的页
linkClass
分页链接的 css 样式
separator
分页器之间的分隔符
spacesBeforeSeparator 和 spacesAfterSeparator
分隔符号前后的空格数
curPageLinkClassName
当前页的 css 样式名
useSessions
如果设置为 true ,则在 session 中保存每页显示的记录数

6. 方法摘要

Pager::factory()
创建一个分页器实例
Pager::getCurrentPageID()
当前页编号
Pager::getLinks
获得当前页(默认为第一页)的各种相关页链接: 前一页;后一页;所有页等等的数组
Pager::getNextPageID
下一页编号
Pager::getOffsetByPageId()
Returns offsets for given pageID.
Pager::getPageData()
以数组形式返回当前页的记录
Pager::getPageIdByOffset()
Returns the page number for the given offset
Pager::getPageRangeByPageId()
Returns offsets for given pageID.
Pager::getPreviousPageID()
返回前一页编号
Pager::getperpageselectbox()
Returns a string with a XHTML SELECT menu, to choose how many items per page should be displayed.
Pager::isFirstPage()
当前页是否第一页
Pager::isLastPage()
当前页是否最后一页
Pager::isLastPageComplete()
最后一页是否完整(complete)
Pager::numItems()
总共的记录数
Pager::numPages()
返回总共的页数
Pager::Pager()
同 factory

7. 后记

我喜欢总结自己的学习并整理成文档. 开始也只是想把自己学习 PEAR Pager 的经验总结一下, 留作以后备用. 弄完了, 感觉应该分享出来. 既然要弄出来给别人看, 读者就不一样了, 需要考虑的就多了, 要分享出个东西来也不容易啊, 嘿嘿. 差不多是第一次比较正式的写这样的东西, 感觉有点点麻烦, 以后要少考虑一点.

  GET['pageID']) ? 1 :

1. 前言

本文中,Hick 先介绍一下 PEAR 的 Pager 包。然后谈谈分页的思路,再结合实际运用,最后对它的部分方法和属性作一下介绍。

顺便提一下, Smarty 也有分页插件,比如 Smarty Pager ,看了一下,感觉在把简单的问题搞复杂化。

[声明] 转载请保留原文信息:

作者: hick<hick@163.com>
出处: http://www.hickwu.com/doc/pearPager.htm

2. 安装

如果已经安装好 PEAR 环境,常规的安装 PEAR 包的方法就可以安装最新版本:

php5>pear install Pager

之所以单独说一下安装,其实是想说 Pager 包可以单独使用,直接到官方下载到压缩包,解压缩到某目录, 并把目录名修改为 Pager, 最后把其父目录添加到 inlcude_path 中即可。

注意:由于 linux 等环境下区分大小写,不要修改目录以及文件名等。

3. 简单实例

通常以静态方法 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 元素是要分页的数据,通常它也是一个多元数组。其他参数请参考 官方参考文档

4. 应用案例

通过上面的 简单实例 的学习,会有这么一个想法:使用 PEAR Pager 来对一个新闻列表分页,可以把所有新闻的基本信息保存成一个二维数组作为 itemData ,其实还可以把新闻总数作为 totalItems 传递。考虑到当前页一般只需要显示若干条新闻,而不是全部,所以能够只查询出当前页需要显示的若干条当然更高效率。

这里顺便说一下两种分页的思路,一种是从数据库查询出所有记录,然后选择当前需要显示的若干记录;另外一种就是先算出当前页需要显示的记录范围,结合 mysql 的 limit 或者其他数据库的类似语法,查询出当前需要显示的若干记录。看上去后者比较快,但是从数据库查询的角度来说,实现后一种方法往往需要进行两次查询数据库,第一次查询总的记录数,第二次查询需要的若干条记录。第一种查询方法在处理记录数多时,会比较耗资源。一般来说,考虑到数据量的增加,用第二种方法会比较好。对查询两次数据库的劣势,可以通过在 URL 传递记录总数进行一定程度上的弥补(数据库记录变动快时不太好)。

下面介绍一下应用 PEAR Pager 于使用了 Smarty (其实跟 Smarty 也没什么关系,嘿嘿)的系统中的方法:

  1. 在获得新闻记录时,使用类封装,通过方法 getList 的参数中 $limit 参数取得当前页需要的新闻记录的范围。
  2. 如果当前 URL 中没有传递总记录数这个参数,则从数据库查询出总记录数。由于获得总记录数的查询条件(SQL 语句的 where 部分)跟 get_list 方法的查询条件是一样的,因此 Hick 的做法是在这个方法增加一个功能(参数),最后一个参数为引用传递,传递符合当前新闻列表条件的新闻总数。
  3. 根据新闻总数以及 URL 传递过来的当前页等确定分页器的相关参数。

下面的使用比较原始,还可以进一步对 Pager 进行封装::

___FCKpd___2

注意:以上代码修改自 Hick 在项目中实际应用的代码,跟 Hick 在实际运用中有些不同。

5. 参数摘要

这里说的参数主要是 Pager::factory 的参数,该函数的参数至少是 itemData 和 totalItem 中的一个。append 参数( 默认为 true)为 false 时,还需要指定 fileName 参数。

itemData
用来分页的数据记录数组
totalItems
用来分页的记录总数
perPage
每页显示的记录数
delta
分页器当前页的前后显示的分页链接数
mode
Jumping 和 Sliding 两中分页样式
httpMethod
允许 GET 和 POST 方式传递分页相关信息
currentPage
默认载入的页
linkClass
分页链接的 css 样式
separator
分页器之间的分隔符
spacesBeforeSeparator 和 spacesAfterSeparator
分隔符号前后的空格数
curPageLinkClassName
当前页的 css 样式名
useSessions
如果设置为 true ,则在 session 中保存每页显示的记录数

6. 方法摘要

Pager::factory()
创建一个分页器实例
Pager::getCurrentPageID()
当前页编号
Pager::getLinks
获得当前页(默认为第一页)的各种相关页链接: 前一页;后一页;所有页等等的数组
Pager::getNextPageID
下一页编号
Pager::getOffsetByPageId()
Returns offsets for given pageID.
Pager::getPageData()
以数组形式返回当前页的记录
Pager::getPageIdByOffset()
Returns the page number for the given offset
Pager::getPageRangeByPageId()
Returns offsets for given pageID.
Pager::getPreviousPageID()
返回前一页编号
Pager::getperpageselectbox()
Returns a string with a XHTML SELECT menu, to choose how many items per page should be displayed.
Pager::isFirstPage()
当前页是否第一页
Pager::isLastPage()
当前页是否最后一页
Pager::isLastPageComplete()
最后一页是否完整(complete)
Pager::numItems()
总共的记录数
Pager::numPages()
返回总共的页数
Pager::Pager()
同 factory

7. 后记

我喜欢总结自己的学习并整理成文档. 开始也只是想把自己学习 PEAR Pager 的经验总结一下, 留作以后备用. 弄完了, 感觉应该分享出来. 既然要弄出来给别人看, 读者就不一样了, 需要考虑的就多了, 要分享出个东西来也不容易啊, 嘿嘿. 差不多是第一次比较正式的写这样的东西, 感觉有点点麻烦, 以后要少考虑一点.

  GET['pageID']; // limit 子句 $limit = ($pageID - 1) * $pageSize . ", $pageSize"; // 获得新闻列表 $newsList = $news->get_list('latest', $limit, $totalItems); // 再对

1. 前言

本文中,Hick 先介绍一下 PEAR 的 Pager 包。然后谈谈分页的思路,再结合实际运用,最后对它的部分方法和属性作一下介绍。

顺便提一下, Smarty 也有分页插件,比如 Smarty Pager ,看了一下,感觉在把简单的问题搞复杂化。

[声明] 转载请保留原文信息:

作者: hick<hick@163.com>
出处: http://www.hickwu.com/doc/pearPager.htm

2. 安装

如果已经安装好 PEAR 环境,常规的安装 PEAR 包的方法就可以安装最新版本:

php5>pear install Pager

之所以单独说一下安装,其实是想说 Pager 包可以单独使用,直接到官方下载到压缩包,解压缩到某目录, 并把目录名修改为 Pager, 最后把其父目录添加到 inlcude_path 中即可。

注意:由于 linux 等环境下区分大小写,不要修改目录以及文件名等。

3. 简单实例

通常以静态方法 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 元素是要分页的数据,通常它也是一个多元数组。其他参数请参考 官方参考文档

4. 应用案例

通过上面的 简单实例 的学习,会有这么一个想法:使用 PEAR Pager 来对一个新闻列表分页,可以把所有新闻的基本信息保存成一个二维数组作为 itemData ,其实还可以把新闻总数作为 totalItems 传递。考虑到当前页一般只需要显示若干条新闻,而不是全部,所以能够只查询出当前页需要显示的若干条当然更高效率。

这里顺便说一下两种分页的思路,一种是从数据库查询出所有记录,然后选择当前需要显示的若干记录;另外一种就是先算出当前页需要显示的记录范围,结合 mysql 的 limit 或者其他数据库的类似语法,查询出当前需要显示的若干记录。看上去后者比较快,但是从数据库查询的角度来说,实现后一种方法往往需要进行两次查询数据库,第一次查询总的记录数,第二次查询需要的若干条记录。第一种查询方法在处理记录数多时,会比较耗资源。一般来说,考虑到数据量的增加,用第二种方法会比较好。对查询两次数据库的劣势,可以通过在 URL 传递记录总数进行一定程度上的弥补(数据库记录变动快时不太好)。

下面介绍一下应用 PEAR Pager 于使用了 Smarty (其实跟 Smarty 也没什么关系,嘿嘿)的系统中的方法:

  1. 在获得新闻记录时,使用类封装,通过方法 getList 的参数中 $limit 参数取得当前页需要的新闻记录的范围。
  2. 如果当前 URL 中没有传递总记录数这个参数,则从数据库查询出总记录数。由于获得总记录数的查询条件(SQL 语句的 where 部分)跟 get_list 方法的查询条件是一样的,因此 Hick 的做法是在这个方法增加一个功能(参数),最后一个参数为引用传递,传递符合当前新闻列表条件的新闻总数。
  3. 根据新闻总数以及 URL 传递过来的当前页等确定分页器的相关参数。

下面的使用比较原始,还可以进一步对 Pager 进行封装::

___FCKpd___2

注意:以上代码修改自 Hick 在项目中实际应用的代码,跟 Hick 在实际运用中有些不同。

5. 参数摘要

这里说的参数主要是 Pager::factory 的参数,该函数的参数至少是 itemData 和 totalItem 中的一个。append 参数( 默认为 true)为 false 时,还需要指定 fileName 参数。

itemData
用来分页的数据记录数组
totalItems
用来分页的记录总数
perPage
每页显示的记录数
delta
分页器当前页的前后显示的分页链接数
mode
Jumping 和 Sliding 两中分页样式
httpMethod
允许 GET 和 POST 方式传递分页相关信息
currentPage
默认载入的页
linkClass
分页链接的 css 样式
separator
分页器之间的分隔符
spacesBeforeSeparator 和 spacesAfterSeparator
分隔符号前后的空格数
curPageLinkClassName
当前页的 css 样式名
useSessions
如果设置为 true ,则在 session 中保存每页显示的记录数

6. 方法摘要

Pager::factory()
创建一个分页器实例
Pager::getCurrentPageID()
当前页编号
Pager::getLinks
获得当前页(默认为第一页)的各种相关页链接: 前一页;后一页;所有页等等的数组
Pager::getNextPageID
下一页编号
Pager::getOffsetByPageId()
Returns offsets for given pageID.
Pager::getPageData()
以数组形式返回当前页的记录
Pager::getPageIdByOffset()
Returns the page number for the given offset
Pager::getPageRangeByPageId()
Returns offsets for given pageID.
Pager::getPreviousPageID()
返回前一页编号
Pager::getperpageselectbox()
Returns a string with a XHTML SELECT menu, to choose how many items per page should be displayed.
Pager::isFirstPage()
当前页是否第一页
Pager::isLastPage()
当前页是否最后一页
Pager::isLastPageComplete()
最后一页是否完整(complete)
Pager::numItems()
总共的记录数
Pager::numPages()
返回总共的页数
Pager::Pager()
同 factory

7. 后记

我喜欢总结自己的学习并整理成文档. 开始也只是想把自己学习 PEAR Pager 的经验总结一下, 留作以后备用. 弄完了, 感觉应该分享出来. 既然要弄出来给别人看, 读者就不一样了, 需要考虑的就多了, 要分享出个东西来也不容易啊, 嘿嘿. 差不多是第一次比较正式的写这样的东西, 感觉有点点麻烦, 以后要少考虑一点.

  GET['totalItems']赋值,也是Pager自定义URL GET参数的方法

1. 前言

本文中,Hick 先介绍一下 PEAR 的 Pager 包。然后谈谈分页的思路,再结合实际运用,最后对它的部分方法和属性作一下介绍。

顺便提一下, Smarty 也有分页插件,比如 Smarty Pager ,看了一下,感觉在把简单的问题搞复杂化。

[声明] 转载请保留原文信息:

作者: hick<hick@163.com>
出处: http://www.hickwu.com/doc/pearPager.htm

2. 安装

如果已经安装好 PEAR 环境,常规的安装 PEAR 包的方法就可以安装最新版本:

php5>pear install Pager

之所以单独说一下安装,其实是想说 Pager 包可以单独使用,直接到官方下载到压缩包,解压缩到某目录, 并把目录名修改为 Pager, 最后把其父目录添加到 inlcude_path 中即可。

注意:由于 linux 等环境下区分大小写,不要修改目录以及文件名等。

3. 简单实例

通常以静态方法 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 元素是要分页的数据,通常它也是一个多元数组。其他参数请参考 官方参考文档

4. 应用案例

通过上面的 简单实例 的学习,会有这么一个想法:使用 PEAR Pager 来对一个新闻列表分页,可以把所有新闻的基本信息保存成一个二维数组作为 itemData ,其实还可以把新闻总数作为 totalItems 传递。考虑到当前页一般只需要显示若干条新闻,而不是全部,所以能够只查询出当前页需要显示的若干条当然更高效率。

这里顺便说一下两种分页的思路,一种是从数据库查询出所有记录,然后选择当前需要显示的若干记录;另外一种就是先算出当前页需要显示的记录范围,结合 mysql 的 limit 或者其他数据库的类似语法,查询出当前需要显示的若干记录。看上去后者比较快,但是从数据库查询的角度来说,实现后一种方法往往需要进行两次查询数据库,第一次查询总的记录数,第二次查询需要的若干条记录。第一种查询方法在处理记录数多时,会比较耗资源。一般来说,考虑到数据量的增加,用第二种方法会比较好。对查询两次数据库的劣势,可以通过在 URL 传递记录总数进行一定程度上的弥补(数据库记录变动快时不太好)。

下面介绍一下应用 PEAR Pager 于使用了 Smarty (其实跟 Smarty 也没什么关系,嘿嘿)的系统中的方法:

  1. 在获得新闻记录时,使用类封装,通过方法 getList 的参数中 $limit 参数取得当前页需要的新闻记录的范围。
  2. 如果当前 URL 中没有传递总记录数这个参数,则从数据库查询出总记录数。由于获得总记录数的查询条件(SQL 语句的 where 部分)跟 get_list 方法的查询条件是一样的,因此 Hick 的做法是在这个方法增加一个功能(参数),最后一个参数为引用传递,传递符合当前新闻列表条件的新闻总数。
  3. 根据新闻总数以及 URL 传递过来的当前页等确定分页器的相关参数。

下面的使用比较原始,还可以进一步对 Pager 进行封装::

___FCKpd___2

注意:以上代码修改自 Hick 在项目中实际应用的代码,跟 Hick 在实际运用中有些不同。

5. 参数摘要

这里说的参数主要是 Pager::factory 的参数,该函数的参数至少是 itemData 和 totalItem 中的一个。append 参数( 默认为 true)为 false 时,还需要指定 fileName 参数。

itemData
用来分页的数据记录数组
totalItems
用来分页的记录总数
perPage
每页显示的记录数
delta
分页器当前页的前后显示的分页链接数
mode
Jumping 和 Sliding 两中分页样式
httpMethod
允许 GET 和 POST 方式传递分页相关信息
currentPage
默认载入的页
linkClass
分页链接的 css 样式
separator
分页器之间的分隔符
spacesBeforeSeparator 和 spacesAfterSeparator
分隔符号前后的空格数
curPageLinkClassName
当前页的 css 样式名
useSessions
如果设置为 true ,则在 session 中保存每页显示的记录数

6. 方法摘要

Pager::factory()
创建一个分页器实例
Pager::getCurrentPageID()
当前页编号
Pager::getLinks
获得当前页(默认为第一页)的各种相关页链接: 前一页;后一页;所有页等等的数组
Pager::getNextPageID
下一页编号
Pager::getOffsetByPageId()
Returns offsets for given pageID.
Pager::getPageData()
以数组形式返回当前页的记录
Pager::getPageIdByOffset()
Returns the page number for the given offset
Pager::getPageRangeByPageId()
Returns offsets for given pageID.
Pager::getPreviousPageID()
返回前一页编号
Pager::getperpageselectbox()
Returns a string with a XHTML SELECT menu, to choose how many items per page should be displayed.
Pager::isFirstPage()
当前页是否第一页
Pager::isLastPage()
当前页是否最后一页
Pager::isLastPageComplete()
最后一页是否完整(complete)
Pager::numItems()
总共的记录数
Pager::numPages()
返回总共的页数
Pager::Pager()
同 factory

7. 后记

我喜欢总结自己的学习并整理成文档. 开始也只是想把自己学习 PEAR Pager 的经验总结一下, 留作以后备用. 弄完了, 感觉应该分享出来. 既然要弄出来给别人看, 读者就不一样了, 需要考虑的就多了, 要分享出个东西来也不容易啊, 嘿嘿. 差不多是第一次比较正式的写这样的东西, 感觉有点点麻烦, 以后要少考虑一点.

  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 在实际运用中有些不同。

5. 参数摘要

这里说的参数主要是 Pager::factory 的参数,该函数的参数至少是 itemData 和 totalItem 中的一个。append 参数( 默认为 true)为 false 时,还需要指定 fileName 参数。

itemData
用来分页的数据记录数组
totalItems
用来分页的记录总数
perPage
每页显示的记录数
delta
分页器当前页的前后显示的分页链接数
mode
Jumping 和 Sliding 两中分页样式
httpMethod
允许 GET 和 POST 方式传递分页相关信息
currentPage
默认载入的页
linkClass
分页链接的 css 样式
separator
分页器之间的分隔符
spacesBeforeSeparator 和 spacesAfterSeparator
分隔符号前后的空格数
curPageLinkClassName
当前页的 css 样式名
useSessions
如果设置为 true ,则在 session 中保存每页显示的记录数

6. 方法摘要

Pager::factory()
创建一个分页器实例
Pager::getCurrentPageID()
当前页编号
Pager::getLinks
获得当前页(默认为第一页)的各种相关页链接: 前一页;后一页;所有页等等的数组
Pager::getNextPageID
下一页编号
Pager::getOffsetByPageId()
Returns offsets for given pageID.
Pager::getPageData()
以数组形式返回当前页的记录
Pager::getPageIdByOffset()
Returns the page number for the given offset
Pager::getPageRangeByPageId()
Returns offsets for given pageID.
Pager::getPreviousPageID()
返回前一页编号
Pager::getperpageselectbox()
Returns a string with a XHTML SELECT menu, to choose how many items per page should be displayed.
Pager::isFirstPage()
当前页是否第一页
Pager::isLastPage()
当前页是否最后一页
Pager::isLastPageComplete()
最后一页是否完整(complete)
Pager::numItems()
总共的记录数
Pager::numPages()
返回总共的页数
Pager::Pager()
同 factory

7. 后记

我喜欢总结自己的学习并整理成文档. 开始也只是想把自己学习 PEAR Pager 的经验总结一下, 留作以后备用. 弄完了, 感觉应该分享出来. 既然要弄出来给别人看, 读者就不一样了, 需要考虑的就多了, 要分享出个东西来也不容易啊, 嘿嘿. 差不多是第一次比较正式的写这样的东西, 感觉有点点麻烦, 以后要少考虑一点.

 
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值