zoukankan      html  css  js  c++  java
  • 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 = $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进行初始化。

  • 相关阅读:
    暑假第二十七测
    暑假第二十七测
    【真题解】牛宫
    【伪题解】牛宫
    最优贸易
    跳马问题
    求和问题
    【题解】山区建小学
    OpenStack之虚机冷迁移代码简析
    OpenStack之虚机热迁移代码解析
  • 原文地址:https://www.cnblogs.com/birdskyws/p/3922432.html
Copyright © 2011-2022 走看看