учение 2 и зенд пагинатор - PullRequest
6 голосов
/ 09 июля 2011

я хочу использовать учение с zend_paginator

вот пример запроса:

$ allArticleObj = $ Это -> _ em-> getRepository ( 'Статьи'); $ qb = $ this -> _ em-> createQueryBuilder ();

    $qb->add('select', 'a')
            ->add('from', 'Articles a')
            ->setFirstResult(0)
            ->setMaxResults(5);

есть ли пример кода, показывающий, что мы можем написать адаптер zend_paginator для построителя запросов doctrine 2?

Ответы [ 4 ]

8 голосов
/ 17 февраля 2012

Вам не нужно реализовывать Zend_Paginator_Adapter_Interface . Это уже реализовано Zend_Paginator_Adapter_Iterator .

Вы можете просто передать Doctrines Paginator в Zend_Paginator_Adapter_Iterator , который вы передадите в Zend_Paginator . Затем вы вызываете Zend_Paginator :: setItemCountPerPage ($ perPage) и Zend_Paginator :: setCurrentPageNumber ($ current_page) . Как это:

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; //Then in your view, use it just like your currently use     
}

Затем вы используете 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 и \ Счетный ).

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

Код здесь (хотя он может работать не с последней версией DoctrineORM 2.2), но пример действителен: https://github.com/kkruecke/zf-beginners-doctrine2/tree/master/ch7

2 голосов
/ 15 июня 2015

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

Моя душа использует Doctrine\ORM\Tools\Pagination\Paginatorиз Доктрины 2.2 точно так же как ответ @ Курта;однако разница в том, что это вернет доктрина-пагинатор (который сам по себе \Iterator) из getItems без гидратации всех результатов запроса.

use Doctrine\ORM\Tools\Pagination\Paginator as DoctrinePaginator;
use Doctrine\ORM\Query;

class DoctrinePaginatorAdapter implements \Zend_Paginator_Adapter_Interface
{
    protected $query;

    public function __construct(Query $query)
    {
        $this->query = $query;
    }

    public function count()
    {
        return $this->createDoctrinePaginator($this->query)->count();
    }

    public function getItems($offset, $itemCountPerPage)
    {
        $this->query->setFirstResult($offset)
                    ->setMaxResults($itemCountPerPage);

        return $this->createDoctrinePaginator($this->query);
    }

    protected function createDoctrinePaginator(Query $query, $isFetchJoinQuery = true)
    {
        return new DoctrinePaginator($query, $isFetchJoinQuery);
    }

} 
1 голос
/ 29 февраля 2012

Пожалуйста, измените

use Doctrine\ORM\Tools\Pagination as Paginator;

на

use Doctrine\ORM\Tools\Pagination\Paginator as Paginator;
1 голос
/ 10 июля 2011

В результате, конечно, вы должны реализовать Zend_Paginator_Adapter_Interface, что по сути означает реализацию двух методов:

count()

getItems($offset, $perPage)

Ваш адаптер будет принимать запрос Doctrine в качестве аргумента конструктора.

В принципе, часть getItems() на самом деле проста.Просто добавьте ограничения $offset и $perPage к запросу - как вы делаете в своем примере - и выполните запрос.

На практике это дело count(), которое может быть сложным.Я бы последовал примеру Zend_Paginator_Adapter_DbSelect, заменив операции Zend_Db их Doctrine аналогами.

...