Zend_Paginator/Доктрина 2

Я использую Doctrine 2 с приложением Zend Framework, и типичный результат запроса может дать миллион (или более) результатов поиска.

Я хочу использовать Zend_Paginator в соответствии с этим набором результатов. Однако я не хочу возвращать все результаты в виде массива и использовать адаптер массива, так как это было бы неэффективно, вместо этого я хотел бы предоставить paginator общее количество строк и массив результатов на основе сумм лимита/смещения .

Это выполнимо с помощью адаптера массива или мне нужно будет создать свой собственный адаптер разбивки на страницы?


person Kevin    schedule 02.03.2011    source источник


Ответы (3)


Вам придется расширить свой собственный адаптер. Адаптер Array работает так, как вам не хочется — он получает массив и возвращает его часть на основе текущих настроек. Вам понадобится новый адаптер, который примет состояние DQL и установит предел/смещение.

person Tomáš Fejfar    schedule 02.03.2011


Вам не нужно реализовывать Zend_Paginator_Adapter_Interface, поскольку он уже реализован в Zend_Paginator_Adapter_Iterator.

Вместо этого можно просто передать Paginator Doctrine в Zend_Paginator_Adapter_Iterator следующим образом:

use Doctrine\ORM\Tools\Pagination as Paginator; // goes at top of file

SomeController::someAction() 
{
 $dql = "SELECT s, c FROM Square\Entity\StampItem s JOIN s.country c ".' ORDER BY '.  $orderBy . ' ' . $dir;
 
 $query = $this->getEntityManager()->createQuery($dql);
 $d2_paginator = new Paginator($query); 
 
 $d2_paginator_iter = $d2_paginator->getIterator(); // returns \ArrayIterator object
 
 $adapter =  new \Zend_Paginator_Adapter_Iterator($d2_paginator_iter);
  
 $zend_paginator = new \Zend_Paginator($adapter);          
                       
 $zend_paginator->setItemCountPerPage($perPage)
            ->setCurrentPageNumber($current_page);

 $this->view->paginator = $zend_paginator; 
}
 

Затем вы используете paginator в сценарии просмотра, как обычно.

Объяснение:

Конструктор Zend_Paginator может принимать Zend_Paginator_Adapter_Interface, который реализует Zend_Paginator_Adpater_Iterator. Теперь конструктор Zend_Paginator_Adapter_Iterator использует интерфейс \Iterator. Этот \Iterator также должен реализовывать \Countable (как вы можете видеть, взглянув на конструктор Zend_Paginator_Adapter_Iterator). Поскольку метод Paginator::getIterator() возвращает \ArrayIterator, он по определению отвечает всем требованиям (поскольку \ArrayIterator реализует как \Iterator и \Countable).

См. этот перенос с Doctrine 1 на Doctrine 2 кода Zend Framework: Руководство для начинающих с Doctrine 1 на Doctrine: https://github.com/kkruecke/zf-beginners-doctrine2. Он включает код для разбиения на страницы с помощью Zend_Paginator с использованием Zend_Paginator_Adapter_Iterator с Doctrine 2' Doctrine\ORM\Tools\Pagination\Paginator.

person Kurt Krueckeberg    schedule 20.02.2012