zend framework 分页显示 Zend_Paginator的使用

时间:2021-12-29 11:09:31

zend framework 提供了一个分页类Zend_Paginator,Zend_Paginator强大的地方在自动分页和导航面板。 构造Zend_Paginator需要提供一个adapter,在手册上提供了五种选择 Adapter:Array,Zend_Db_Select,Zend_Db_Table_Select,Iterator,Null。

如果我们从数据库取得数据,在分页可以使用 Zend_DB_Select或则Zend_Db_Table_Select。

 1 class Draft extends Zend_Db_Table_Abstract
 2 {
 3     protected $_name = 'draft';
 4     protected $_primary = 'id';
 5 }   
 6  
 7 $draft = new Draft();
 8 $select = $draft->select(); //Zend_DB_Select对象
 9 $select->order("id desc"); //设置Zend_DB_Select对象的属性
10 $paginator = new Zend_Paginator(new Zend_Paginator_Adapter_DbTableSelect($select));
11 $paginator->setItemCountPerPage($this->page->per); //设置每页的条数
12 $paginator->setPageRange($this->page->range); //设置导航栏显示页码的个数   
13 $paginator->setCurrentPageNumber(0); //设置当前页码
14 echo count($paginator)."<br>";//页面数
15 foreach ($paginator as $items) {
16 echo $items->id;//轮训取出内容
17 }

通常的使用方法是将paginator传递给view, $this->view->items = $paginator。在view页面中使用如下的代码:

 1 <?php
 2 if(count($this->items)>1)
 3 {
 4     echo $this->paginationControl($this->items,'Sliding','partials/pagination-control.phtml');                
 5 }
 6 
 7 ?>
 8 <?php foreach ($this->itmes as $item) {
 9     echo "<div class='draftlist'>";
10     $content = $item['content'];//轮训取出每一条内容
11     echo "</div>";
12 }?>

$this->paginationControl($paginator,'Sliding','pagination.phtml');会加载一个类 Zend_Paginator_ScrollingStyle_Sliding。导航栏的样式如图:

 zend framework 分页显示 Zend_Paginator的使用

zend framework 分页显示 Zend_Paginator的使用

标签页的总数为5个,标签页会自动移动到合适的位置上,并且会判断首页、末页、上一页、下一页链接是否生效。判断当前页号在导航条的位置是调用了Zend_Paginator的_createPages()方法,其中用了一些数学方法计算,感兴趣的可以简单推算一下。

如果这样使用Paginator已经非常方便了,但是有一个问题:

select就必须查询全部数据。

因为我们只需要当前分页里面的数据,所以查询全部数据显然是浪费空间的。

重新写一个分页类当然可以,如果还想用Zend提供的类,作者想到一个方法,用较少空间,用Array构造Paginator。代码如下

 1 controller:
 2 class Draft extends Zend_Db_Table_Abstract
 3 {
 4     protected $_name = 'draft';
 5     protected $_primary = 'id';
 6 }   
 7  
 8 $draft = new Draft();
 9 $db = $draft->getAdapter();
10 $query = "select count(*) from draft";
11 $total = $db->fetchOne($query);
12 
13 $begin = $pageNum*$perPage;
14 $select->limit($perPage,$begin);
15 $array = $db->fetchAll($select);
16 
17 $paginator = new Zend_Paginator(new Zend_Paginator_Adapter_Array(range(1,$total))); 18 $paginator->setItemCountPerPage($this->page->per); //设置每页的条数
19 $paginator->setPageRange($this->page->range); //设置导航栏显示页码的个数   
20 $paginator->setCurrentPageNumber(0); //设置当前页码
21 
22 $this->view->items = $paginator; 23 $this->view->array = $array
24 }
25 view:
26 <?php
27 if(count($this->items)>1)
28 {
29     echo $this->paginationControl($this->items,'Sliding','partials/pagination-control.phtml');                
30 }
31 ?>
32 <?php foreach ($this->array as $item) {
33     echo "<div class='draftlist'>";
34     $content = $item['content'];//轮训取出每一条内容
35     echo "</div>";
36 }?>

经过这样的修改,即可以使用导航条,每次取出的数据也仅仅是当前页面的数据,只是生成了一个数组对Paginator进行初始化。