首页 > 代码库 > zend framework 分页显示 Zend_Paginator的使用

zend framework 分页显示 Zend_Paginator的使用

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。导航栏的样式如图:

 

标签页的总数为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 = $array24 }25 view:26 <?php27 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进行初始化。