Jak dodać paginację w Symfony4 za pomocą KnpPaginatorBundle?

Do stworzenia paginacji wykorzystałem KnpPaginatorBundle ponieważ bardzo łatwo jest go podpiąć z Doctrine, a przy wyświetlaniu np. wpisów z bloga to bardzo przydatne rozwiązanie.

Co musimy zrobić? Po pierwsze musimy dodać komponent do naszego projektu Symfony. Aby to zrobić wykorzystamy composera, używając następującego polecenia:

composer require knplabs/knp-paginator-bundle

Po zainstalowaniu pakietu wystarczy utworzyć plik konfiguracyjny paginatora w katalogu app/config/packages. Nazwijmy go paginator.yaml. W ten plik musimy wkleić poniższy kod:

# config/packages/paginator.yaml
knp_paginator:
    page_range: 5                       # number of links showed in the pagination menu (e.g: you have 10 pages, a page_range of 3, on the 5th page you'll see links to page 4, 5, 6)
    default_options:
        page_name: strona               # page query parameter name
        sort_field_name: sort           # sort field query parameter name
        sort_direction_name: direction  # sort direction query parameter name
        distinct: true                  # ensure distinct results, useful when ORM queries are using GROUP BY statements
        filter_field_name: filterField  # filter field query parameter name
        filter_value_name: filterValue  # filter value query paameter name
    template:
        pagination: '@KnpPaginator/Pagination/sliding.html.twig'     # sliding pagination controls template
        sortable: '@KnpPaginator/Pagination/sortable_link.html.twig' # sort link template
        filtration: '@KnpPaginator/Pagination/filtration.html.twig'  # filters template

W tym pliku puki co interesują nas dwa ustawienia:
page_range – określa ile numerów ma być wyświetlonych w paginacji
page_name – nazwa wykorzystywana przy tworzeniu linku paginacji, np. www.mojastrona.pl/wpisy?strona=1

Musimy jeszcze zmodyfikować plik twig.yaml dodając kod:

paths:
        '%kernel.project_dir%/vendor/knplabs/knp-paginator-bundle/templates': KnpPaginator

Ok, teraz musimy dodać w naszym kontrolerze linie:

use Knp\Component\Pager\PaginatorInterface;

Następnie zajmijmy się właściwym wyciągnięciem informacji. Tworzymy sobie zapytanie do bazy w którym chcemy wyciągnąć wszystkie wpisy danego użytkownika i sortujemy je po id. Następnie tworzymy zapytanie obsługujące paginację. Items per page to jak nazwa wskazuje liczba wpisów wyświetlanych na danej podstronie, tutaj są to dwa wpisy.

$moje_wpisy= $entityManager->getRepository(OsiagnieciaStatus::class)->findBy(
			array('idUzytkownika' => $id_uzytkownika),
			array('id' => 'DESC')
		);
		
		// Paginate the results of the query
		$appointments = $paginator->paginate(
			// Doctrine Query, not results
			$moje_wpisy,
			// Define the page parameter
			$request->query->getInt('strona', 1),
			// Items per page
			2
		);

Nie zapnijmy o przesłaniu naszej zmiennej appointments do szablonu 😉
Na koniec w naszym szablonie twig dodajemy wyświetlanie paginacji.

<div class="navigation">
	{{ knp_pagination_render(appointments) }}
</div>

W kolejnym wpisie opisze jak podpiąć do tego wyświetlanie z bootstrapa.

Dodaj komentarz

Twój adres email nie zostanie opublikowany. Pola, których wypełnienie jest wymagane, są oznaczone symbolem *