Voici mon probleme : je sais recupérer la liste des articles lié à un utilisateur qui les a postés, mais je n'arrive pas à paginer cette liste.
Dans mon controller User, j'ai l'action View :

function view($id = null) {
        $this->layout = 'profil';
        if (!$id) {
            $this->Session->setFlash(__('Invalid user', true));
            $this->redirect(array('action' => 'index'));
        }
        $this->set('user', $this->User->read(null, $id));
    }

Lorsque je me rend sur cette action ( exemple : monsite/user/view/10 ) , il m'affiche bien les informations de l'utilisateur 10 et me liste les articles lié, mais je n'arrive pas à paginer cette liste d'articles.
Quelle pourrait être la méthode pour paginer cette liste ?

Merci

8 réponses


il te faut une variable $paginate dans le controleur (tout en haut, avec la variable $name) et dans ton action, tu fais $this->set('user', $this->paginate('user'));

regarde cette parite de la doc et tout sera plus clair :)

neoris
Auteur

j'ai bien ma variable $paginate en haut de mon controlleur User :

var $paginate = array('Post' => array('limit' => 5, 'order' => array('Post.created' => 'desc')));

le truc c'est que je veu paginer des données venant d'un autre model ( Post ) dans le controller Users du model User , est-ce possible ?

si je comprenais la question déja ^^
si je fais avec ce que je comprends, tu veux paginer des données appartenant au modele User et pas au modele Post ? si c'est bien ca, il suffit, dans ta variable paginate, de rajouter le modele, ta variable paginate serait comme ceci au final :

var $paginate = array('Post' => array('limit' => 5, 'order' => array('Post.created' => 'desc')),
                      'User' => array('limit' => 5, 'prder' => array('User.date_inscription' => 'desc')));
// tu peux modifier à souhait la requete pour le modele user, c'est un exemple que j'ai donné

et dans ton action, tu fais :

$this->set('pages', $this->User->Paginate('User'));

et enfin, dans ta vue tu procède de la meme maniere qu'avant :)

neoris
Auteur

Enfaite c'est l'inverse, je veux paginer des données appartenant au modele Post dans le controlleur Users.
En gros, j'ai utilisateur , cette utilisateur a posté des articles.
Lorsque je me rend sur monsite.fr/users/view/10 par exemple , je vois les informations de l'utilisateur 10 ( Nom, Prenom ...) et la liste des articles qu'il a posté.
C'est cette liste d'articles que je voudrai paginer.
( Pour faire compliqué : Paginer une liste d'articles présent dans la vue d'une action d'un controlleur ayant un modele différent que le modele Post ! lol )

Action view du controlleur Users :

function view($id = null) {
        $this->layout = 'profil';
        //recuperation categories
        $c = $this->Category->find('list', array('recursive' => -1, 'fields' => array('id', 'titre')));
        $this->set('cats', $c);

        if (!$id) {
            $this->Session->setFlash(__('Invalid user', true));
            $this->redirect(array('action' => 'index'));
        }
        $this->set('user', $this->User->read(null, $id));
    }

Aperçu du view.ctp de l'action view du controlleur User:

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

le principe est le meme, il faut penser à la variable $uses aussi pour lu dire quels modeles tu utilises, dans ce cas c'est User et Post, sous forme de array :

var $uses = array('Posts', 'Users');
neoris
Auteur

ça ne marche tjs pas ! ce que je veu faire est surement pas possible sans bidouillage !

mh étrange parce que d'apres ce que tu me décris et ce que j'ai compris, la technique devrait marcher... si tu as fait copié collé de ce que j'ai fait cela peut ne pas marcher parce que je n'ai peut etre pas mis exactement les memes noms que toi ("s" en plus ou en moins)

a moins qu'il manque un élément dans la description de ton probleme : est ce que tu cherches à afficher les pages ? (les numéros : 1 - 2 - ...) ou les données paginées ? (titre, contenu, commentaire... de Post)

neoris
Auteur

je cherche à paginer les données des articles , imaginons qu'un utilisateur a posté 20 articles, je voudrai qu'on puisse voir uniquement les 5 premiers, et avoir accès aux autres avec la pagination.