zend的paginator组件旨在提供一个通用的分页模块供php项目使用。
经源码分析,其提供一个类供继承Zend_Paginator_Adapter_DbSelect
需要重写count方法,和getItems($offset, $itemCountPerPage)方法。
分页的基本原理是查两遍,先查总数,再查某一页的数据。在一些需要并发较大程序的场合,可以在count函数中加入缓存机制。
在第一个示例中,显示了最简单的情况。
但是,事实上,这个最简单的情况组件是做了处理的,自动加上了limit,所以传入的select对象中不应有limit,组件对该select对象做解析,分析出从哪里截断等,所以不如下面的示例2和示例3那样,干脆都由自己定义好,
第二个示例展示了使用sql做查询的情况,此时必须写一个查询类充当适配器。
提供的附件中是
class SqlDemo extends Zend_Paginator_Adapter_DbSelect
该类必须有count方法和getItem方法的实现,就是用limit,很简单
第三个示例展示了使用select做查询的情况。此时,count方法可以固定,所以加了一个类。
好处是可以充分使用select的强大组合功能
在使用了分页组件后,分页模板中的各个属性都由paginator定义好了,这就是好处,能统一接口。
这是一个smarty模板文件
paginator_demo.tpl
以下是demo.php
经源码分析,其提供一个类供继承Zend_Paginator_Adapter_DbSelect
需要重写count方法,和getItems($offset, $itemCountPerPage)方法。
分页的基本原理是查两遍,先查总数,再查某一页的数据。在一些需要并发较大程序的场合,可以在count函数中加入缓存机制。
在第一个示例中,显示了最简单的情况。
但是,事实上,这个最简单的情况组件是做了处理的,自动加上了limit,所以传入的select对象中不应有limit,组件对该select对象做解析,分析出从哪里截断等,所以不如下面的示例2和示例3那样,干脆都由自己定义好,
第二个示例展示了使用sql做查询的情况,此时必须写一个查询类充当适配器。
提供的附件中是
class SqlDemo extends Zend_Paginator_Adapter_DbSelect
该类必须有count方法和getItem方法的实现,就是用limit,很简单
第三个示例展示了使用select做查询的情况。此时,count方法可以固定,所以加了一个类。
好处是可以充分使用select的强大组合功能
在使用了分页组件后,分页模板中的各个属性都由paginator定义好了,这就是好处,能统一接口。
这是一个smarty模板文件
paginator_demo.tpl
- {if $pageinfo->totalItemCount }
- <div class="paginationControl">
- <!-- Previous page link -->
- { if $pageinfo->previous }
- <a href="{$urlhelp->url($pageinfo->previous)}">
- < Previous
- </a> |
- {else}
- <span class="disabled">< Previous</span> |
- {/if}
- {foreach from=$pageinfo->pagesInRange item=page }
- {if ($page != $pageinfo->current)}
- <a href="{$urlhelp->url($page)}">{$page}</a> |
- {else}
- {$page} |
- {/if}
- {/foreach}
- {if $pageinfo->next}
- <a href="{$urlhelp->url($pageinfo->next)}">
- Next >
- </a>
- {else}
- <span class="disabled">Next ></span>
- {/if}
- </div>
- {/if}
{if $pageinfo->totalItemCount }
<div class="paginationControl">
<!-- Previous page link -->
{ if $pageinfo->previous }
<a href="{$urlhelp->url($pageinfo->previous)}">
< Previous
</a> |
{else}
<span class="disabled">< Previous</span> |
{/if}
{foreach from=$pageinfo->pagesInRange item=page }
{if ($page != $pageinfo->current)}
<a href="{$urlhelp->url($page)}">{$page}</a> |
{else}
{$page} |
{/if}
{/foreach}
{if $pageinfo->next}
<a href="{$urlhelp->url($pageinfo->next)}">
Next >
</a>
{else}
<span class="disabled">Next ></span>
{/if}
</div>
{/if}
以下是demo.php
- <?php
- /**
- * 加载一些公共类,如db对象,也要加载zend的类自动载入方法, 该公共类需要自己写
- *
- * 这只是一个代码示例,运行还需要smarty和zend环境
- *
- * 还建用户表member
- * 字段
- * id 自增主键
- * name 用户名
- * member_type_id 用户类型id
- *
- */
- include_once('public.php');
- //定义smarty对象
- $smarty = new Smarty(); // 需要先加载smarty
- //定义一个url类,用于在分页html中显示页码的链接
- class url_help{
- public function url($page){
- return '/command/paginator_demo/1.php?page=' . intval($page);
- }
- }
- $url_obj = new url_help();
- function echobr(){
- echo "<br>--------------------------------------------------------------------------";
- }
- echo "演示zend组件Pagintator的用法" . $_SERVER['REQUEST_URI'];
- /**
- * 用法一,最简单,直接用select对象
- */
- echo "<br>用法一,最简单,直接用select对象,";
- $db = Sys::getdb();
- $select = $db->select();
- $select->from('member','*')
- ->order('id desc');
- $paginator = Zend_Paginator::factory($select);
- $paginator->setCurrentPageNumber(isset($_REQUEST['page']) ? $_REQUEST['page'] : 2); //设置当前页数2
- $paginator->setItemCountPerPage(2); //设置每页的条数
- $paginator->setPageRange(5); //设置显示几个链接
- //echo $paginator->count();
- $arr = $paginator->getIterator();
- //赋值
- $smarty->assign("pageinfo",$paginator->getPages()); //默认Sliding
- $smarty->assign("urlhelp",$url_obj);
- //引用模板文件
- $smarty->display('paginator_demo.tpl');
- var_dump($arr);
- echobr();
- echobr();
- /**
- * 用法二,继承性质的使用,与select类无关,直接使用sql语句
- */
- echo "<br>用法二,继承性质的使用,与select类无关,直接使用sql语句";
- $adapter = new SqlDemo(); //定义适配器
- $paginator = new Zend_Paginator($adapter);
- $paginator->setCurrentPageNumber(isset($_REQUEST['page']) ? $_REQUEST['page'] : 2); //设置当前页数
- $paginator->setItemCountPerPage(3); //设置每页的条数
- $paginator->setPageRange(4); //设置显示几个链接
- $arr = $paginator->getIterator();
- //赋值
- $smarty->assign("pageinfo",$paginator->getPages()); //默认Sliding
- $smarty->assign("urlhelp",$url_obj);
- //引用模板文件
- $smarty->display('paginator_demo.tpl');
- var_dump($arr);
- echobr();
- echobr();
- /**
- * 用法三,继承性质的使用,与select类无关,直接使用sql语句
- */
- echo "<br>用法三,继承性质的使用,使用select类";
- $adapter = new MemberDemo(); //定义适配器
- $paginator = new Zend_Paginator($adapter);
- $paginator->setCurrentPageNumber(isset($_REQUEST['page']) ? $_REQUEST['page'] : 2); //设置当前页数
- $paginator->setItemCountPerPage(3); //设置每页的条数
- $paginator->setPageRange(6); //设置显示几个链接
- $arr = $paginator->getIterator();
- echo "<br>总页数". $paginator->count();
- //赋值
- $smarty->assign("pageinfo",$paginator->getPages()); //默认Sliding
- $smarty->assign("urlhelp",$url_obj);
- //引用模板文件
- $smarty->display('paginator_demo.tpl');
- var_dump($arr);
- echobr();
- echobr();
- exit;
- ?>