Использование Zend_Paginator без выбора адаптера - PullRequest
2 голосов
/ 01 октября 2010

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

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

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

Ответы [ 2 ]

3 голосов
/ 01 октября 2010

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

Основные цели разработки Zend_Paginator заключаются в следующем:

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

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

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

$paginator = new Zend_Paginator(new Zend_Paginator_Adapter_Array($array));
2 голосов
/ 26 апреля 2013

У меня была та же проблема, мои 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()

Итак, теперь вы должны убедиться, что вы перехватили параметр 'page' и вычислили LIMIT для текущей страницы, которую нужно добавить в ваш 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);

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

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

...