2010-10-01 2 views
2

Я хочу использовать Zend_Paginator, но Zend_Paginator требует Zend_Db_Select в качестве входного параметра.Использование Zend_Paginator без выбора адаптера

Мой SQL-запрос - это немного сложный процесс, который так сложно реализовать с помощью Zend_Db_Select.

Могу ли я использовать Zend_Paginator с простым SQL-запросом?

ответ

2

Я была такая же проблема, мой SQL запросы немного сложный и работающий с Zend_Db_Select, он очень сложный, но я получил одно решение с помощью Zend_Paginator_Adapter_Interface, что легко.

//$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() 

Итак, теперь вы должны убедиться, что вы ловите параметр «Страница» и рассчитали LIMIT для текущей страницы, чтобы добавить в ваш запрос, например:

$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); 

И как в моем case, у меня есть около тридцати переменных, чтобы сделать 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; ?> 

И это все, он отлично работает!
Я надеюсь, что это кому-то полезно
Приветствия.

3

Да, вы можете, Из документов ZF:

Цели в первичный дизайн Zend_Paginator являются следующие:

  • постраничной произвольные данные, а не только реляционных баз данных
  • затягивая пара Zend_Paginator другим компонентам Zend Framework, так что пользователи, которые хотят использовать его самостоятельно Zend_View, Zend_Db и т. д. могут это сделать

This page дает примеры вида различных адаптеров, доступных Zend_Paginator.

Например, чтобы создать Paginator, используя массив (который может быть результат базы данных набором), вы можете использовать адаптер массива:

$paginator = new Zend_Paginator(new Zend_Paginator_Adapter_Array($array)); 
+0

Если я использую его с адаптером Array, я должен извлечь все результаты из базы данных, что не является хорошим подходом. –

+0

, конечно, я просто предоставлял пример гибкости. – robjmills

+0

, поэтому для моей ситуации нет адаптера. й? –

Смежные вопросы