2013-04-13 15 views
6

Mam 6 rekordów w kwerendzie i ten kod poprawnie wyświetlić je na 3 stronach:ZF2 paginator nie pokazują ostatnią stronę

(action) 
    public function listAction() 
     { 
      $page = (int) $this->params()->fromRoute('id', 0); 
      $posts = $this->getPagesTable()->selectPages(); 
      $paginator = new Paginator(new PaginatorIterator($posts)); 
      $paginator->setCurrentPageNumber($page) 
         ->setItemCountPerPage(2) 
         ->setPageRange(7); 
      return new ViewModel(array(
        'paginator' => $paginator, 
        )); 
     } 
(view) 
    <?php foreach ($paginator as $post) : ?> 
     <h2><?php echo $this->escapeHtml($post->id); ?></h2> 
     <div><?php echo $this->escapeHtml($post->name);?> 
    <?php endforeach; ?> 

ale kiedy dodać pętlę foreach w akcji:

public function listAction() 
{ 
    $page = (int) $this->params()->fromRoute('id', 0); 
    $posts = $this->getPagesTable()->selectPages(); 
    $paginator = new Paginator(new PaginatorIterator($posts)); 
    $paginator->setCurrentPageNumber($page) 
       ->setItemCountPerPage(2) 
       ->setPageRange(7); 
    foreach ($paginator as $post) { 
     // some code or empty foreach 
    }; 
    return new ViewModel(array(
      'paginator' => $paginator, 
      )); 
} 

paginator nie wyświetla ostatniej (3) strony (poprawnie wyświetlają się 1 i 2 strony). Dlaczego? Dziękujemy!


Jeśli dodać $ paginator-> getIterator() -> zwijanie po foreach() {} paginator Pokaż tylko pierwszą stronę i nie wykazują drugiej i trzeciej stronie.

+1

dziwny problem ale dlaczego w Akcji masz nawet puste foreach? Jeśli usunąłeś kod, aby zmniejszyć ten przykład, mógłbyś usunąć problem! także pomyślałbym, że przejście przez kolejne posty byłoby bardziej efektywne? – CodeMonkey

+0

W rzeczywistym projekcie foreach zawiera kod. – morin

+0

@KodeMonkey '$ posts' zawiera wszystkie wiersze, w których' $ paginator' ma ograniczone pozycje (które będą wyświetlane na stronie). Aby uzyskać te elementy w "Akcji" przed wysłaniem do widoku, potrzebujesz takiej pętli (jak próbkowano powyżej jako pusta pętla lub '$ paginator-> getCurrentItems()' lub ''$ paginator-> getItemsByPage ($ strona)'), która daje wynik w pustych elementach '$ paginator'. – webcoder

Odpowiedz

0

Wzorzec iteratora jest jak wskaźnik, po zakończeniu iteracji należy go zresetować.

+0

Jak zresetować iterator? – morin

+0

@morin spróbuj tego: '$ paginator-> getIterator() -> rewind()' –

+0

jeśli dodasz $ paginator-> getIterator() -> rewind() po foreach {}, paginator pokaż tylko pierwszą stronę i nie wyświetlaj druga i trzecia strona. – morin

0

I również w obliczu sam problem

Ale teraz jestem rozwiązany

i am using iterator_to_array($userList); 

w widoku strony po usunięciu tej linii to działa dobrze może być to pomocne Ci