Bonjour à tous,
Je tiens à vous remercier pour cette jolie communauté d'aides et de tutos !
Je suis en plein apprentissage de cakePHP et je n'arrive pas à afficher mes posts de la page 2 en fonction de la pagination.

Sur ma page dont l'url est monsite/calendrier, les 10 posts "dates s'affichent", la pagination est de 5 pages.
Dès que je clique sur la pagination 2 , la page recharge, l'url change monsite/calendrier/2 mais le contenu est le même, le bouton de la pagination reste sur le 1.

J'ai vraiment besoin de vos lumière car je ne sais pas d'où peut venir mon problème et je bloque complètement.
voici le <?php debug($this->params'paging']); ?>

\app\View\Elements\calendrier.ctp (line 1)
array(
    'Post' => array(
        'page' => (int) 1,
        'current' => (int) 10,
        'count' => (int) 46,
        'prevPage' => false,
        'nextPage' => true,
        'pageCount' => (int) 5,
        'order' => 'Post.created DESC',
        'limit' => (int) 10,
        'options' => array(),
        'paramType' => 'named'
    )
)

voici le <?php debug($this->request->params); ?>

\app\View\Elements\calendrier.ctp (line 2)
array(
    'plugin' => null,
    'controller' => 'pages',
    'action' => 'index',
    'named' => array(),
    'pass' => array(
        (int) 0 => 'calendrier',
        (int) 1 => '2'
    ),
    'slug' => 'calendrier',
    'page' => '2',
    'paging' => array(
        'Post' => array(
            'page' => (int) 1,
            'current' => (int) 10,
            'count' => (int) 46,
            'prevPage' => false,
            'nextPage' => true,
            'pageCount' => (int) 5,
            'order' => 'Post.created DESC',
            'limit' => (int) 10,
            'options' => array(),
            'paramType' => 'named'
        )
    ),

Je passe par mon PagesController pour afficher mes Posts :

App::uses('AppController', 'Controller');
class PagesController extends AppController {
    public $uses = array('Page'); 
    public function index($slug = null) {
        $this->loadModel('Post'); 
        $page = $this->Page->find('first', array(
        'conditions' => array('Page.slug' => $slug, 'Page.online' => true)
    ));
    if (empty($page)) {
        throw new NotFoundException("Cette Page n'existe pas !");
    }
    if ($slug != $page'Page']'slug']) {
        $this->redirect($page'Page']'link'], 301);
    }
    $date = date('Y-m-d G:i:s');
    $this->loadModel('post'); 
    $this->paginate = array(
        'conditions' => array('parent_id'=>$page'Page']'id'], 'start_date >= CURDATE()', 'online' => true),
        'order' => 'Post.start_date asc',
        'limit'=> 3
    );
    $d'dates'] = $this->Paginate('Post');
        $this->paginate = array(
        'conditions' => array('parent_id' => $page'Page']'id'], 'online' => true), /*!!! ATTENTION PARENT_ID DOIT ETRE VARIABLE !!!*/
        'order' => 'Post.created DESC',
        'limit'=> 10
    );      
    $d'galeries']=$this->Paginate('Post');
        $d'page'] = $page; 
    $this->set($d);
    }

Dans ma page calendrier j'affiche le contenu de mes pages et celui de mes posts :

<?php if (!empty($page)): ?>
    <div class="grid_4">
        <h1 class="title"><?php echo $page'Page']'name']; ?></h1>
        <p><?php echo $page'Page']'content']; ?></p> 
    </div><!--Fin de grid_4-->
<?php endif ?>
<div><?php foreach ($dates as $k => $v): $v = current($v); ?>
    <div class="content">
        <strong class="title"><?php echo $v'title']; ?></strong>
    <?php if (!empty($v'content'])): ?>
            <p><?php echo $this->Text->truncate($v'content'], 110, array('html' => true)); ?></p>
    <?php endif ?>
    <?php echo $this->Html->link("En savoir plus »", $v'link'], array('escape'=>false, 'class'=>'btn more')); ?>
</div>
<?php endforeach ?>
<div class="paging">
    <?php $this->Paginator->options(array('url'=> array('controller' => 'pages', 'action' => 'index', 'slug' => $this->params'pass'][0]))); ?>
    <?php echo $this->Paginator->counter(array('format' => __('Page {:page} of {:pages}')));
    echo $this->Paginator->prev('«', array(), null, array('class' => 'prev disabled'));
    echo $this->Paginator->numbers(array('separator' => ''));
    echo $this->Paginator->next('»', array(), null, array('class' => 'next disabled')) ?>
</div>

Mon modèle Page :

public function afterFind($data, $primary = false){
    foreach ($data as $k => $d) {
        if (!empty($d$this->alias]'name'])) {
        $slug = strtolower(Inflector::slug($d$this->alias]'name'], '-')); 
    }
    if (isset($slug) && isset($d$this->alias]'id'])) {
        $d$this->alias]'slug'] = $slug; 
        $d$this->alias]'link'] = array(
            'controller' => 'pages', 
        'action' => 'index', 
        'slug' => $slug,
        'admin' => false
        );
    }
    $data$k] = $d; 
    }
    return $data; 
}

Mon route :

Router::connect('/:slug-:id', array('controller' => 'posts', 'action' => 'index'), array('pass' => array('id', 'slug'), 'id' => '[0-9]+', 'slug' => '[a-z0-9\-]+')); 
Router::connect('/:slug/:page', array( 'controller' => 'pages','action' => 'index'),array('pass'=>array('slug','page'),'slug'=>'[a-zA-Z\-]+','page'=>'[0-9]+'));
Router::connect('/:slug', array('controller' => 'pages', 'action' => 'index'), array('pass' => array('slug'), 'slug' => '[a-z0-9\-]+')); 
Router::connect('/', array('controller' => 'pages', 'action' => 'index', 'slug'=>'accueil'), array('pass' => array('slug'), 'slug' => '[a-z0-9\-]+'));

5 réponses


Ciloe
Réponse acceptée

Je viens d'avoir le même problème...

Voilà ma solution (qui marche chez moi):

Dans ta vue: dans les options de pagination:

<?php $this->Paginator->options(array('url' => $this->passedArgs)); ?>

En suite dans ton fichier route: tu enlève ton tableau de pass:

Router::connect('/:slug/:page', array( 'controller' => 'pages','action' => 'index'),array('slug'=>'[a-zA-Z\-]+','page'=>'[0-9]+'));

Enfin dans ton controller tu ajoute ça: au début de ta fonction index:

if(!empty($this->request->params'page'])){
  $this->request->params'named']'page'] = $this->request->params'page'];
}
if(!empty($this->request->params'slug'])){
  $this->request->params'named']'slug'] = $this->request->params'slug'];
}
$slug = $this->request->params'slug'];

Normalement ça doit marcher...

Explication: Ta pagination passe et récupère les paramètres de pagination par le champ named... Bien sur ça ne lui plait pas autrement, donc il faut ruser. Cependant, pass ne doit plus rien contenir pour que ça marche... donc on l'enlève de la route.

Perso j'ai pas essayé avec le slug. Par contre sur que ça marche avec seulement la page.

Essaye et dis moi se que ça donne (fais un debug de $this->request->params et de $this->passedArgs)

Gwy2
Auteur
Réponse acceptée

M.E.R.C.I.
Par contre ça n'a pas fonctionné immédiatement j'ai dû faire quelques tests :
Avec ta solution à l'identique, le code ci-dessous :

<?php $this->Paginator->options(array('url' => $this->passedArgs)); ?>

me donne une url de la forme calendrier/page:2 et lorsque je suis sur la page 2, l'url redirige vers : calendrier/2/page:3. Dans tous les cas je me retrouve avec une erreur "Cette Page n'existe pas" donc j'ai laissé :

<?php $this->Paginator->options(array('url'=> array('controller' => 'pages', 'action' => 'index', 'slug' => $this->params'pass'][0]))); ?>

Avec ton router, le premier lien redirige bien vers calendrier/2, mais dès qu'on est sur calendrier/2 le lien redirige vers /page/index/page:2
J'ai donc remis mon router :

Router::connect('/:slug/:page', array( 'controller' => 'pages','action' => 'index'),array('pass'=>array('slug','page'),'slug'=>'[a-zA-Z\-]+','page'=>'[0-9]+'));

et tout a fonctionné correctement.

Le problème était qu'il me manquait dans mon controller :

if(!empty($this->request->params'page'])){
  $this->request->params'named']'page'] = $this->request->params'page'];
}
if(!empty($this->request->params'slug'])){
  $this->request->params'named']'slug'] = $this->request->params'slug'];
}
$slug = $this->request->params'slug'];

Merci en tout cas, car sans ton aide, je serais encore bloqué !

Gwy2
Auteur

Merci Ciloe, j'essaie ta solution dès que je rentre du boulot.

Gwy2
Auteur

Par contre je constate que j'ai le même nombre de page peut importe mes rubriques. Sur calendrier j'ai 5 pages et la 4ème et 5ème sont vides. Dans News j'ai 5 pages complètes...

Mon paginate prend tout mes posts dans le compte, mais affiche bien les posts correspondant à l'id de la pageles bons posts.

$this->paginate = array(
    'conditions' => array('parent_id'=>$page'Page']'id'], 'start_date >= CURDATE()', 'online' => true),
    'order' => 'Post.start_date asc',
    'limit'=> 3
);
$d'dates'] = $this->Paginate('Post');

Est il possible de changer le nombre de posts trouvé dans la pagination ?

Héhé pas de problèmes :)