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 = $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进行初始化。