Problème pagination Knp Bundle

Signaler
-
Messages postés
32178
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
26 avril 2021
-
Bonjour,
J'essaie de mettre en place une pagination dans le cadre de mon projet PHP/Symfony et en utilisant KNP Bundle. Problème : alors qu'il ne devrait y avoir qu'un post par page, je vois la totalité des posts sur chaque page.

TacheController :

  @Route("/accueil", name="accueil")

public function liste(TacheRepository $tacheRepository, CategorieRepository $categorieRepository, Request $request,
                      PaginatorInterface $paginator): Response
{
    $tache = new Tache();
    $form = $this->createForm(FiltreFormType::class, $tache);
    $form->handleRequest($request);

    if ($form->isSubmitted() && $form->isValid()) {
        if (!empty($form['q']->getData())) {
            $tache->setTitre($form['q']->getData());
        }

        if (!empty($form['categories']->getData()->getValues())) {
            foreach ($form['categories']->getData() as $categorie) {
                $tache->addCategory($categorie);
            }
        }
    }

    isset($_POST['datedecroissante']) ? $tri = false : isset($_POST['datecroissante']) ? $tri = true : $tri = false;

    $taches = $tacheRepository->rechercherTache($tache, $tri);

    $pagination = $paginator->paginate(
        $taches,
        $request->query->getInt('page', 1),
        1
    );

    return $this->render('main/accueil.html.twig', ['taches' => $taches,
        'categories' => $categorieRepository->findAll(), 'form' => $form->createView(), 'pagination' => $pagination]);
}


TacheRepository :

public function rechercherTache(Tache $tache, $tri)
{

    $qb = $this->createQueryBuilder('t')
        ->select('t', 'c')
        ->join('t.categories', 'c');


    if (!empty($tache->getTitre())) {
        $qb = $qb->andWhere('t.titre LIKE :q')
            ->setParameter('q', "%{$tache->getTitre()}%");
    }

    if (!empty($tache->getCategories()->getValues())) {
        $qb = $qb->andWhere('c.id IN (:categories)')
            ->setParameter('categories', $tache->getCategories());
    }

    if ($tri == false) {
        $qb = $qb->orderBy('t.date_creation', 'DESC');
    } else {
        $qb = $qb->orderBy('t.date_creation', 'ASC');
    }


    return $qb->getQuery()->getResult();
}



Knp_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: page                 # 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 parameter name
  template:
    pagination: '@KnpPaginator/Pagination/twitter_bootstrap_v4_pagination.html.twig'     # sliding pagination controls template
    sortable: '@KnpPaginator/Pagination/sortable_link.html.twig' # sort link template
    filtration: '@KnpPaginator/Pagination/filtration.html.twig'  # filters template


EDIT : Correction des ballises de code. Ajout du LANGAGE pour avoir la COLORATION SYNTAXIQUE

3 réponses

Messages postés
32178
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
26 avril 2021
3 426
Bonjour,
Il semble que tu n'aies pas renseigné le yaml .
Il faut remplacer les valeurs par ce que tu souhaites non ?

Bonjour,

Je ne vois pas ce qu'il y a à remplacer pour afficher un post par page ?
Messages postés
32178
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
26 avril 2021
3 426
Pourtant tu te marquer en commentaire à côté de chaque ligne de code
Oui mais a aucun endroit de ce fichier on indique qu'il faut 1 post par page.
Messages postés
32178
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
26 avril 2021
3 426
Ah non. En effet.
Alors la... Bonne question
Messages postés
32178
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
26 avril 2021
3 426 >
Messages postés
32178
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
26 avril 2021

Au niveau du controller tu sembles bien avoir mis les bons paramètres pourtant sauf pour le premier paramètre...
Il faut mettre la requête sql .. pas le résultat de la requête
 $pagination = $paginator->paginate(
        $query, /* query NOT result */
        $request->query->getInt('page', 1), /*page number*/
        1 /*limit per page*/
    );



Dans la doc tu as un exemple
public function listAction(EntityManagerInterface $em, PaginatorInterface $paginator, Request $request)
{
    $dql   = "SELECT a FROM AcmeMainBundle:Article a";
    $query = $em->createQuery($dql);

    $pagination = $paginator->paginate(
        $query, /* query NOT result */
        $request->query->getInt('page', 1), /*page number*/
        10 /*limit per page*/
    );

    // parameters to template
    return $this->render('article/list.html.twig', ['pagination' => $pagination]);
}