2012-09-10 17 views
8

Przeczytałem, że Pagerfanta jest wtyczką do paginacji z wyboru dla Symfony2, ale mam pewne problemy z jej poprawnym działaniem. Pobrałem kod dla pagerfanta i PagerfantaBundle i zainstalowałem je zgodnie z opisem w WhiteOctober Github readme file i this tutorial. Jestem pewien, że kod w moim kontrolerze jest w porządku, ale coś jest nie tak z moim plikiem szablonu.Jaki jest poprawny sposób użycia pagera w paginacji w Symfony2

Moje kod kontrolera:

public function indexAction($page = null) 
{ 
    ... 
    $query = $em->createQuery('SELECT something FROM some_table'); 
    $adapter = new DoctrineORMAdapter($query); 
    $pager = new Pagerfanta($adapter); 
    $pager->setMaxPerPage(10); 
    if (!$page) $page = 1; 
    try { 
     $pager->setCurrentPage($page); 
    } 
    catch(NotValidCurrentPageException $e) { 
     throw new NotFoundHttpException('Illegal page'); 
    } 
    return $this->render('MyBundle:MyEntity:index.html.twig', array(
     'pager' => $pager, 
    )); 
} 

W moim szablonu:

... 
<table> 
    {% for object in pager.currentPageResults %} 
    <tr> 
     <td>{{ object.attribute1 }}</td> 
     <td>{{ object.attribute2 }}</td> 
     <td>{{ object.attribute3 }}</td> 
    </tr> 
    {% endfor %} 
</table> 

{% if pager.haveToPaginate %} 
    {{ pagerfanta(pager) }} 
{% endif %} 

Kiedy idę do strony, dostaję listę pierwszych 10 obiektów. Jednak renderowanie pager'a jest po prostu PreviousNext jako jedno słowo (nie łączy i nie ma stron 1, 2, 3 itd.).

Jeśli dodaję ?page=2 do adresu URL, nie wyświetli kolejnych 10 pozycji na liście.

nie zmienić trasę od tego, co było przed I dodaje kod paginacji ponieważ dokumentacja mówi:

Trasy są generowane automatycznie na aktualnej trasie za pomocą zmiennej „stronę”, aby propagować numer strony.

... ale zastanawiam się, czy nieprawidłowe trasowanie jest częścią problemu. Zakładając, że tak jest, nie jestem pewien, jak to zrobić.

Nie mogę znaleźć instrukcji innych źródeł, z którymi się łączyłem, więc byłoby wspaniale, gdyby ktoś, kto wdrożył to pomyślnie, mógł podzielić się szczegółami, jak to zrobili.

+0

Czy ty wzór trasa zawierać atrybut strony? ie '/ articles/{page}' – AdrienBrault

+0

Aktualizacja: Wydaje się, że istnieje problem z kontrolerem. W szczególności DocrtineORMAdapter nie działa poprawnie (np. '$ Pagerfanta-> getNbResults()' zwraca 0 - stąd brak stron między Prevous i Next). Dokumentacja stwierdza, że ​​parametr przekazany do konstruktora może być Query lub QueryBuilder, ale podejrzewam, że tylko ten drugi jest poprawny. Kiedy zmienię na '$ pagerfanta = new Pagerfanta (new ArrayAdapter ($ query-> getResult())' zwraca poprawną liczbę wyników. @AdrienBrault - Wprowadziłem zmianę, którą zasugerowałeś do wzoru trasy i teraz działa, ale nie powinno być potrzebne –

+0

Tak więc nadal pozostaję z pytaniami, dlaczego?page = nie jest automatycznie dodawany do trasy zgodnie z dokumentacją i dlaczego css nie jest stosowana (obecnie paginator wygląda Poprzednia123Następna, bez spacji lub formatowania) –

Odpowiedz

6

Myślę, że aplikacja nie wie, jak przeanalizować ?page=2 do działania kontrolera.

Dołącza {strona} na swojej trasie (tak, jak odpowiedział @AdrienBrault), którą chcesz podzielić na strony.

tak:

my_index: 
    pattern: /{page} 
    defaults: { _controller: MyTestBundle:Object:index, page: 1 } 
    requirements: 
    _method: GET 
    page: \d+ 

PagerFantaBundle będzie (chyba) spróbować odgadnąć prawidłową drogę.

Pracowałem dla mnie.

+0

To działa, ale w rzeczywistości może to być zrobione z parametrami zapytania, zapytał OP. Wystarczy dodać 'Zapytanie $ request' do działania i dostać' $ page' z '$ request-> get ('stronie', 1)' 'metoda GET' – xPheRe

+0

życzenie idzie przez cały (zapytanie, atrybuty i parametry życzenie). Oficjalnie zaleca się go unikać, gdy wiesz, skąd pochodzi parametr: w tym przypadku musisz raczej użyć '$ request-> query-> get ('page', 1)'. –

1

musiałem użyć „currenPage” zamiast „fo” stronie w moim routingu i znalazłem sposób, aby to zrobić:

{{ pagerfanta(pager, 'my_pager_view', {'pageParameter':'[currentPage]'}) }}

Powiązane problemy