Paginacja lub stronicowanie służy do dzielenia treści (np. listy artykułów) na podstrony. Do przechodzenia pomiędzy poszczególnymi stronami służy pasek z numeracją i/lub przyciski nawigacyjne typu: ‹ poprzednia strona | następna strona ›. W Symfony mamy do tego gotowy moduł KnpPaginatorBundle.

Instalacja bundla:
1 |
$ composer require knplabs/knp-paginator-bundle |
Konfiguracja (config/packages/paginator.yaml):
1 2 3 4 5 6 7 8 9 10 11 12 13 |
knp_paginator: page_range: 10 # liczba linków w numeracji stron default_options: page_name: page # nazwa zmiennej w adresie Url, np: ?page=1 sort_field_name: sort sort_direction_name: direction distinct: true filter_field_name: filterField filter_value_name: filterValue template: pagination: '@KnpPaginator/Pagination/sliding.html.twig' sortable: '@KnpPaginator/Pagination/sortable_link.html.twig' filtration: '@KnpPaginator/Pagination/filtration.html.twig' |
Do kontrolera dodajemy metodę paginate według schematu:
1 |
$paginator->paginate($repository,$page_number,$limit_per_page) |
Przykładowy kontroler:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 |
<?php // src/Controller/BlogController.php namespace App\Controller; use Symfony\Bundle\FrameworkBundle\Controller\AbstractController; use Symfony\Component\Routing\Annotation\Route; use Symfony\Component\HttpFoundation\Request; use Knp\Component\Pager\PaginatorInterface; use App\Entity\Blog; class BlogController extends AbstractController { /** * @Route("/blog", name="blog_list") */ public function blogList(PaginatorInterface $paginator, Request $request) { $repository = $this->getDoctrine()->getRepository(Blog::class); return $this->render('blog/list.html.twig', [ 'pagination' => $paginator->paginate( $repository->findAll(),$request->query->getInt('page', 1),10) ]); } // ... } |
- $repository – zbiór wyników zapytania z bazy np: $repository->findAll(); jeśli nie znasz Doktryny ORM to przeczytasz o tym tutaj
- $page_number – numer strony; za pomocą $request->query->getInt(’page’) odczytujemy wartość tej zmiennej z globalnej tablicy
- $limit_per_page – limit pobranych rekordów np: 10
W szablonie list.html.twig (templates/blog/list.html.twig) renderujemy paginację za pomocą metody knp_pagination_render(pagination):
1 2 3 4 5 6 7 8 9 10 11 12 |
{% extends 'base.html.twig' %} {% block section %} {% for row in pagination %} <article><a href="#">{{ row.title }}</a></article> {% endfor %} <div class="navigation"> {{ knp_pagination_render(pagination) }} </div> {% endblock %} |
I to wszystko.
Do następnego –>