Bonjour tout le monde !
J'ai un petit souci avec mon blog que je dev avec Cake, dans la page index des différents posts, j'ai une barre qui me permet de choisir la catégorie des posts à afficher.
Je vous met un aperçu :
Une fois que je clique sur une catégorie j'ai une URL de ce genre :
local.dev/posts/graphics
Mon problème survient quand une catégorie contient suffisemment de posts pour être "paginée", et que je clique sur le boutton "Next Page" l'URL devient ainsi :
local.dev/posts?page=2
Au lieu de :
local.dev/posts/graphics?page=2
J'ai beau chercher je ne vois pas d'où cela pourrait venir, j'ai checké au niveau des routes, je pense les avoir bien configurés, j'ai essayé de voir du côté du Paginate et du Paginator...
Je vous mets les bouts de codes concernés :
routes.php
Router::scope('/posts', function($routes) {
$slug = '[0-9a-z\-]+';
$routes->connect('/:category', ['controller' => 'Posts', 'action' => 'index'], ['category' => '[a-z]+']);
$routes->connect('/:slug', ['controller' => 'Posts', 'action' => 'view'], ['slug' => $slug]);
});
PostsController.php
public function index()
{
$category = $this->request->param('category');
if( $category )
$this->paginate['conditions'] = ['Categories.slug' => $category];
$this->set('posts', $this->paginate($this->Posts));
$this->set('_serialize', ['posts']);
}
pagination.ctp ( J'ai crée la partie pagination en tant qu'element )
<center>
<nav>
<ul class="pagination">
<?= $this->Paginator->prev('< ' . __('previous')) ?>
<?= $this->Paginator->numbers() ?>
<?= $this->Paginator->next(__('next') . ' >') ?>
</ul>
</nav>
<?= $this->Paginator->counter(['format' => 'Page {{page}} of {{pages}}, showing {{current}} records out of
{{count}} total, starting on record {{start}}, ending on {{end}}']) ?>
</center>
Voila j'espère que vous pourrez me venir en aide :P
Merci d'avance et bonne journée !
Bonjour.
Essaies tout simplement d'ajouter ceci : /*
dans le routing, exemple :
$routes->connect('/:category/*', ['controller' => 'Posts', 'action' => 'index'], ['category' => '[a-z]+']);
Par contre, tes deux routes sont un peu trop similaire je trouve, ou alors, il vaut mieux que tu fasse en sorte qu'aucun titre de tes posts ne puisse contenir qu'un seul mot.
Au passage, tu mets en condition Categories.slug
mais ta requête n'est pas définie pour utiliser l'association avec les catégories.
@Lartak : Merci pour ta réponse ! J'ai essayé ta technique sur les routes, mais ça n'a pas marché malheureusement, je vais continuer a creuser. En ce qui concerne la requête j'ai définit le contain un peu plus haut dans le code, je n'avais pas posté cette partie c'est tout :)
Quand tu sélectionnes une catégorie, la requête SQL prend bien en compte la condition sur celle-ci ?
@Lartak : Oui elle l'a prends bien en charge.
Voici la requête générée :
SELECT Posts.id AS `Posts__id`, Posts.created AS `Posts__created`, Posts.title AS `Posts__title`, Posts.description AS `Posts__description`, Posts.slug AS `Posts__slug`, Posts.thumbnail AS `Posts__thumbnail`, Categories.slug AS `Categories__slug` FROM posts Posts LEFT JOIN categories Categories ON Categories.id = (Posts.category_id) WHERE Categories.slug = 'graphics' ORDER BY Posts.created desc LIMIT 6 OFFSET 0
Donc, lorsqu'il y a la catégorie, les liens des url sont corrects, mais la pagination ne semble pas prendre en compte la catégorie dans ses liens générés.
Tu devrais regarder ceci : Modification des options que le Helper Paginator utilise.
Tu pourras de cette manière modifier les liens générés selon s'il y a la catégorie ou non en paramètre.
@Lartak : Merci j'avais déjà checké ça avant, mais je vais creuser encore plus ;)
Je vous tiens au courant si j'arrive a quelque chose :D