代码之家  ›  专栏  ›  技术社区  ›  rahim asgari

在没有选择适配器的情况下使用Zendèu Paginator

  •  2
  • rahim asgari  · 技术社区  · 14 年前

    Zend_Paginator 但是 Zendèu分页器 Zend_Db_Select 作为输入参数。

    我的SQL查询有点复杂,很难实现 Zend\u Db\u选择

    我能用吗 使用纯SQL查询?

    2 回复  |  直到 14 年前
        1
  •  2
  •   jortsc    12 年前

    我也遇到过同样的问题,我的SQL查询有点复杂,使用Zend\u Db\u Select时非常复杂,但是我通过实现Zend\u Paginator\u Adapter\u接口得到了一个解决方案,很简单。

    //$data, has a $rowSet() and a counter variable with the result of ('SELECT FOUND_ROWS() as count')
    //rowSet come from  $rowSet = $this->_db->fetchAll($sql);//Default adapter
    
    $adapter   = new Fidelizacion_Model_AdapterVisitasClientes($data);
    $this->_clientePager =  new Zend_Paginator($adapter);
    
    
    //My own adapter
    
    /**
     * @author Jose
     */
    class Fidelizacion_Model_PaginatorVisitasClientes implements Zend_Paginator_Adapter_Interface
    {
        /**
         * Array
         *
         * @var array
         */
        protected $_array = null;
    
        /**
         * Item count
         *
         * @var integer
         */
        protected $_count = null;
    
        /**
         * Constructor.
         *
         * @param array $array Array to paginate
         */
        public function __construct($array)
        {
            $this->_array = $array['rowSet'];
            $this->_count = $array['count'];
        }
    
        public function getItems($offset, $itemCountPerPage)
        {
            $clientes = array();
                if($this->_array){
                    foreach ($this->_array as $row) { 
                        $clpo = new Clientes_Model_ClienteMin();
                        $clpo->setId($row['id']);
                        $clpo->setNombre($row['nombre']);
                        $clpo->setNumeroDocumento($row['numero_documento']);
                        $clpo->setTelefonoContacto($row['telefono_contacto']);
                        $clpo->setLocalidad($row['localidad']);
                        $clpo->setPersonaContacto($row['nombre_corto']);
                        $clientes[] = $clpo;
                        $clpo = null;
                    }
               }   
            return $clientes;
        }
        /**
         * Returns the total number of rows in the array.
         *
         * @return integer
         */
        public function count()
        {
            return $this->_count;
        }
    }
    
    //As you can see with that you can encapsulate in objects and set the conunt() method with the value of FOUND_ROWS()
    

    因此,现在您必须确保捕获“page”参数并计算当前页的限制,以便添加到SQL查询中,如:

    $sql .= ' LIMIT '.(((ITEMS_PER_PAGE * (int)$this->_getParam('page',1)) - ITEMS_PER_PAGE)).','.(ITEMS_PER_PAGE);
    $set = $this->_getClientesDao()->getClientesFiltroVisitas($sql);
    $paginator = $this->_getClientesPager($set);//returns the pager instantie with my own adapter
    $paginator->setCurrentPageNumber($this->_getParam('page'));    
    $paginator->setItemCountPerPage(ITEMS_PER_PAGE);
    $paginator->setPageRange(5);
    

    在我的例子中,我有大约30个变量来生成SQL。我通过GET传递这些,然后我的导航控件如下所示:

    <?php if ($this->pageCount): ?>
        <div class="pagination_control">
            <a class="ends rounded" href="<?php echo $this->url() . '?' . $_SERVER['QUERY_STRING'] . '&page=' . $this->first ;?>">
               Primero
            </a>
            <?php if (isset($this->previous)): ?>
            <a class="movement rounded" href="<?php echo $this->url() . '?' . $_SERVER['QUERY_STRING'] . '&page=' . $this->previous; ?>">
                  &lt;Anterior
              </a> 
            <?php else: ?>
              <span class="disabled rounded">&lt; Previous</span>
            <?php endif; ?>
            <?php foreach ($this->pagesInRange as $page): ?>
                <?php if ($page != $this->current): ?>
                    <a class="page square rounded" href="<?php echo $this->url() . '?' . $_SERVER['QUERY_STRING'] . '&page=' .$page; ?>">
                          <?php echo $page; ?>
                    </a> 
                <?php else: ?>
                     <?php echo "<span class='current square rounded'>$page</span>" ?>
                <?php endif; ?>
            <?php endforeach; ?>
            <?php if (isset($this->next)): ?>
            <a class="movement rounded" href="<?php echo $this->url() . '?' . $_SERVER['QUERY_STRING'] . '&page=' . $this->next;?>">
                Siguiente&gt;
              </a>
            <?php else: ?>
              <span class="disabled rounded">Next &gt;</span>
            <?php endif; ?>
            <a class="ends rounded" href="<?php echo $this->url() . '?' . $_SERVER['QUERY_STRING'] . '&page=' .$this->last; ?>">
                Ùltimo
            </a>
            <span class="pagecount">
                Página <?php echo $this->current; ?> de <?php echo $this->pageCount; ?>
            </span>
        </div>
    <?php endif; ?>
    


    我希望这对某人有用
    问候语。

        2
  •  3
  •   robjmills    14 年前

    是的,您可以从ZF文件:

    主要设计目标 Zendèu Paginator如下:

    • 分页任意数据,而不仅仅是关系数据库
    • 将Zendèu Paginator松散地耦合到另一个 Zend框架组件 希望独立使用的用户 Zend_View、Zend_Db等都可以这样做

    This page Zend_Paginator .

    例如,要使用数组(可以是数据库结果集)创建分页器,可以使用数组适配器:

    $paginator = new Zend_Paginator(new Zend_Paginator_Adapter_Array($array));
    
    推荐文章