Zend_Paginator / Doctrine 2 - PullRequest
       41

Zend_Paginator / Doctrine 2

3 голосов
/ 02 марта 2011

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

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

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

Ответы [ 3 ]

3 голосов
/ 02 марта 2011

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

0 голосов
/ 20 февраля 2012

Вам не нужно реализовывать 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 в скрипте вида, как обычноdo.

Объяснение:

Конструктор 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 ).

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

.
0 голосов
/ 21 мая 2011
...