Bonjour à tous.

Je reviens sur le sujet de la pagination de cakephp.
Elle fonctionne très bien, mais je bloque sur un point :

voici l'url de mon projet :
http://127.0.0.1/Projet/article

lorsque je clique sur les pages suivantes l'url est la suivante :
http://127.0.0.1/Projet/posts/index/article/page:2

dans routes.php

Router::connect('/:Group', array('controller'=>'posts', 'action' => 'index'),
                    array('pass' => array('Group')));

au niveau de ma vue :

<?php echo $this->Paginator->numbers(); ?>

je souhaiterais que les Urls soit de la forme :
http://127.0.0.1/Projet/article?page:2 ou http://127.0.0.1/Projet/article?page=2 peu importe

Merci à tous

11 réponses


philieric
Auteur
Réponse acceptée

J'ai trouvé :

au niveau de ma vue :

echo $this->Paginator->numbers(array('url'=> array( 'controller'=>'posts', 
                                                        'action'=>'index',
                                                        'Group'=> $group )));

cela m'affiche bien :
http://127.0.0.1/Projet/article?page=2
au lieu de
http://127.0.0.1/Projet/ posts/index /article?page=2

ce qui m'a aidé c'est le paramètre : 'paramType'=> 'querystring' dans le controller.
sans ce paramètre cela ne fonctionnait pas

Yop !

Je n'ai pas trop compris le problème/la question.
Tu veux changer les routes ? Ou bien les routes sont changés, mais quand tu cliques sur un n# de page il prend la route par défaut ?

Sinon pour des URL plus sexy et SEO je pense que ceci est plus approprié que article?page=2.

<?php
Router::connect('/article/page/:page',
    array('controller' => 'posts', 'action' => 'index'),
    array('pass' => array('page'), 'page' => '[0-9]+')
);
?>

/!\ J'ai écrit ceci comme ça, je n'ai pas testé.
Logiquement ça donnera ceci : /article/page/2

La réécriture des urls fonctionne très bien sauf lors de la pagination, et là, je ne comprends pas. il revient sur les urls par défaut de cakephp http://127.0.0.1/Projet/posts/index/article/page:2) au lieu de m'afficher : http://127.0.0.1/Projet/article/page:2

J'ai essayé ce que tu m'as indiqué, cela ne change rien merci...

Salut philieric

J'ai eu le même problème récemment et j'ai "fixé" le souci de manière fonctionnelle et si je trouve un jour une solution "propre" je changerai mais pour l'instant ça me va.
Voilà ce que j'ai fais :

Router::connect('/category/:slug-:id/*',
    array('controller' => 'products', 'action' => 'view'),
    array('pass' => array('id', 'slug'), 'id' => '[0-9]+', 'slug' => '[a-z0-9\-]+')
    );

En gros dans mon cas mon url est construite en utilisant le slug et l'id. Ensuite l'astérisque permet de dire à l'url d'afficher tout ce qui suit. Par exemple la route ci-dessus va créer la route ci-dessous lorsque je suis en page 2 dans mes produits :

http://localhost/cake/category/accessoires-cheveux/page:2

Le dernier paramètre "page:2", c'est cake qui le met tout seul grâce au component paginate. Voilà pour mon système mais si quelqu'un connait la "bonne" façon de faire, on est 2 intéressés ^^

dans votre controller tu doit ajouter ca dans votre paginator le type de parametre en query string

$this->paginate = array(
        'limit' => 6,
        'order' => 'created DESC',
        'paramType'=> 'querystring'
    );

votre URL ça ressemble à ça :
http://127.0.0/Projet/?page=1

Merci pour la réponse voici l'url : http://127.0.0.1/Projet/posts/index/article?page=1 qui est générée par cakephp, merci pour la solution avec querystring, je ne la connaissait pas.

par contre dans l'url j'ai toujours posts/index/ qui apparait, la réécriture fonctionne parfaitement sur tous mon projet sauf sur les urls de la pagination.

lorsque je clique sur page 2 par exemple, je voudrais : http://127.0.0.1/Projet/article?page=2 mais j'ai http://127.0.0.1/Projet/ posts/index /article?page=2

si quelqu'un a une explication ? Elle serait la bienvenue.

dans votre route.php tu met :

Router::connect('/article', array('controller' => 'votreController', 'action' => 'index'));

est ca va marcher ^^

dans routes.php j'ai ce qui suit

Router::connect('/:Group', array('controller'=>'posts', 'action' => 'index'),
                    array('pass' => array('Group')));

Group etant une une variable, je disais que tous le site fonctionne tres bien avec ce systeme sauf pour la pagination

si Group est string :

Router::connect('/:Group', array('controller'=>'posts', 'action' => 'index'),
                    array('pass' => array('Group'), 'Group'=> '[a-z0-9_\-]+'));

si entier :

Router::connect('/:Group', array('controller'=>'posts', 'action' => 'index'),
                    array('pass' => array('Group'), 'Group'=> '[0-9]+'));

j'ai deja essayer! c'est la meme chose, seul les liens de la pagination ajoute /posts/index/ dans l'url

merci @philieric je la cherche moi aussi ^^