Multiple pagination dans un model

120 views
Skip to first unread message

Takumi

unread,
Jul 19, 2009, 7:17:03 PM7/19/09
to Cakephp-fr
Bonsoir,

J'ai débuté depuis peu avec cakephp et mon manque de connaissance sur
ce framework me bloque assez souvent. Il se trouve donc que j'ai un
petit problème que je n'arrive pas à résoudre. Je dispose sur mon site
de news qui sont relié à une catégorie. Dans mon controller news j'ai
deux méthode pour le moment index qui permet d'afficher toutes les
news et une autre qui permet d'afficher les news selon la catégorie
passé en paramètre. Je voudrais que ces deux méthode me renvois un
résultat paginé. Cependant je voudrais que pour une méthode ma
pagination dispose de certaine règle et pour l'autre méthode d'autre
règle. Par exemple je voudrais que ma méthode index me renvoi 15 news
mais que l'autre méthode m'en renvois 25. Donc je voulais savoir
comment faire pour arriver à un tel résultat. Je vous montre mon
controller à l'heure actuelle.

<?php
class ArticlesController extends AppController
{
var $paginate = array(
'Article' => array(
'limit' => 15,
'order' => array(
'Article.date_parution' => 'asc'
)
)
);

function showArticleByCat($nom)
{
$liste_article = $this->paginate(array('Category.nom' => $nom));
$this->set('article',$liste_article);
}

function index()
{
$liste_article = $this->paginate();
$this->set('article',$liste_article);
}
}
?>

Je vous remercie d'avance

Pierre MARTIN

unread,
Jul 20, 2009, 1:41:50 AM7/20/09
to Cakephp-fr
Bonjour,

Il te suffit de modifier l'attribut "$paginate" de ta classe
ArticlesController au sein de chaque méthode.

function showArticleByCat($nom)
{
$this->paginate['order'] = [...];
$liste_article = $this->paginate(array('Category.nom'
=> $nom));
$this->set('article',$liste_article);
}

Pierre
PS : Il y a désormais un forum francophone pour CakePHP à l'adresse
http://forum.cakephp-fr.org ... je te recommande de poster tes
demandes là-bas car c'est beaucoup plus fréquenté qu'ici ;)

Takumi

unread,
Jul 20, 2009, 6:19:26 AM7/20/09
to Cakephp-fr
D'accord pour le forum je note.

Mais j'ai encore une question par rapport à l'exemple que tu m'as
donné. Que signifie le ['order'] dans $this->paginate['order']. Quel
valeur doit-je mettre dedans?

Sinon est ce que l'exemple qui suit te parait correct pour que
j'arrive à mes fins et respecte ce que tu m'as dit de faire? Je peux
pas tester pour le moment afin de voir si cela marche donc je me
contente d'écrire le code et d'y réfléchir....

<?php
class ArticlesController extends AppController
{
function showArticleByCat($nom)
{
$this->paginate = array(
'Article' => array(
'limit' => 15,
'order' => array(
'Article.date_parution' => 'asc'
)
)
);
$liste_article = $this->paginate(array('Category.nom'
=> $nom));
$this->set('article',$liste_article);
}

function index()
{
$this->paginate = array(
'Article' => array(
'limit' => 35,
'order' => array(
'Article.date_parution' => 'desc'
)
)
);
$liste_article = $this->paginate();
$this->set('article',$liste_article);
}
}
?>

Je te remercie d'avance.

Pierre MARTIN

unread,
Jul 20, 2009, 6:56:38 AM7/20/09
to Cakephp-fr
A priori c'est ok !

L'exemple que je t'ai donné ($this->paginate['order']) était dans le
cas où tu ne souhaitais modifier qu'un seul des paramètres du tableau
(ici l'ordre) dans ton action. C'est plus propre de factoriser la
partie commune dans la déclaration de l'attribut et de ne redéclarer
les différences ausein de chaque fonction ... en espérant être assez
clair :o)

Bonne journée,
Pierre

Takumi

unread,
Jul 20, 2009, 1:31:54 PM7/20/09
to Cakephp-fr
Ta réponse est claire mais j'ai encore une question.

Donc avec le cas que tu me présente je peux par exemple changer
l'ordre dans ma méthode en écrivant de cette manière $this->paginate
['order'] =...
Mais si dans ma méthode je souhaite modifier l'ordre et le nombre
d'élément à recupérer je doit faire comme ceci:

$this->paginate['order'] = ... ;
$this->paginate['limit'] = ... ;

Ou existe t-il une méthode afin de pouvoir fait ça plus vite dans ma
méthode?

Pierre MARTIN

unread,
Jul 21, 2009, 6:01:34 AM7/21/09
to Cakephp-fr
Bonjour,

Ta question relève plus du PHP que du CakePHP ... l'essentiel est que
au final l'attribut $paginate contienne les infos que tu souhaites.
Que tu déclares tout dans la méthode, que tu surcharges juste les clés
ou bien même que tu utilises array_merge() pour fusionner tes
configurations (le plus propre) le résultat sera le même.

C'est juste une question de goût ;)
Pierre

Takumi

unread,
Jul 21, 2009, 3:22:25 PM7/21/09
to Cakephp-fr
Bonsoir,

Oui tu as raison c'est une question de goût et j'ai tendance à
préférer tout faire d'un coup, les fusionner comme tu dits. Je ne
connais pas array_merge(), je vais me renseigner la dessus mais
pourrait tu eventuellement me donner un exemple concret.

Je te remercie beaucoup pour ton aide.

Takumi

unread,
Jul 21, 2009, 6:48:38 PM7/21/09
to Cakephp-fr
J'ai trouvé ce que je cherchais et ça marche nickel.


Encore merci.
Reply all
Reply to author
Forward
0 new messages