2013-04-09 15 views
17

Od razu powiedziałbym, że przeczytałem to pytanie Doctrine2 Paginator, ale to nie daje mi wystarczających informacji dotyczących tytułu mojego pytania.Doctrine2 Paginator uzyskując pełne wyniki

Kiedy użyłem Doctrine1 byłem coraz wynik z takiego kodu na przykład:

$list = $this->query 
    ->addSelect('SQL_CALC_FOUND_ROWS *') 
    ->offset(($this->currentPage - 1) * $this->perPage) 
    ->limit($this->perPage) 
    ->execute(array(), \Doctrine_Core::HYDRATE_ARRAY_SHALLOW); 

$totalRecords  = SqlCalcFoundRowsEventListener::getFoundRowsCount(); 
$this->totalPages = ceil($totalRecords/$this->perPage); 

i było wspaniale.

Teraz, kiedy używam Doctrine2, jestem zdezorientowany, w jaki sposób powinienem uzyskać całkowitą ilość rekordów z tym samym zapytaniem, co ograniczony wynik dla bieżącej strony.

Każda pomoc/porada byłaby bardzo doceniana.

+1

ostatecznie odpowiedzieć na jutro - na razie prosimy sprawdzić testy dla paginator na https: // github. com/doctrine/doctrine2/blob/master/tests/Doctrine/Tests/ORM/Functional/PaginationTest.php – Ocramius

+0

Sprawdzono testy, ale nie ma testów, które ustawiają ograniczenie do zapytania przed przekazaniem go do paginatora. Może coś źle zrozumiałem. – Eugene

Odpowiedz

38

Użytkowanie zgodne paginator jest następujący:

$paginator = new \Doctrine\ORM\Tools\Pagination\Paginator($query); 

$totalItems = count($paginator); 
$pagesCount = ceil($totalItems/$pageSize); 

// now get one page's items: 
$paginator 
    ->getQuery() 
    ->setFirstResult($pageSize * ($currentPage-1)) // set the offset 
    ->setMaxResults($pageSize); // set the limit 

foreach ($paginator as $pageItem) { 
    echo "<li>" . $pageItem->getName() . "</li>"; 
} 
+6

btw, nie musisz 'count()' '$ paginator' PRZED ustawieniem limitu i offsetu. Możesz ustawić limit i offset przed inicjalizacją paginatora, a on będzie działał zgodnie z oczekiwaniami. –

+1

Przykład z 'count()' jest po prostu pokazaniem, że jest to 'Countable' – Ocramius

+2

Nie widzę użyteczności tej klasy Paginatora, nie dodaję niczego, mogę uzyskać tę samą funkcjonalność z domyślnym wynikiem obiektu –

0

Albo jakaś inna pętla:

for ($i=0; $i < $pagesCount; $i++) { 
     if ($currentPage == ($i+1)) { 
      $pagination1 .= '<li class="active"><a href="'.\URL::current().'?pagina='.($i+1).'" title="">'.($i+1).'</a></li>'; 
     }else{ 
      $pagination1 .= '<li><a href="'.\URL::current().'?pagina='.($i+1).'">'.($i+1).'</a></li>'; 
     } 
    } 
+0

Witamy w Stackoverflow i dzięki za poświęcenie czasu na odpowiedź! Odpowiedź powinna zawierać nie tylko blok kodu, ale należy również dodać opisowy tekst opisujący rozwiązanie. –