2010-12-14 103 views
0

Je ne peux pas paginer mes résultats si j'y accède à partir d'une URL routée. Ce sont les routes que j'utilise:Problème de pagination + Routes dans CakePHP 1.3.6

// NEWS 
Router::connect('/news.rss', array('controller' => 'posts', 'action' => 'index', 'ext' => 'rss')); 
Router::connect('/news/*', array('controller' => 'posts', 'action' => 'index')); 
Router::connect('/:lang/posts/*', array('controller' => 'posts', 'action' => 'index')); 

Je sais que dans la dernière route que je ne suis pas passer le: paramètre lang, mais si je le passe:

Router::connect('/:lang/news/*', array('controller' => 'posts', 'action' => 'index'), array('lang' => $regex['lang'], 'pass' => array('lang'))); 

Il n'a pas d' travailler soit.

Si j'essaie d'accéder à l'url/news/page: 2 il me montrera les résultats de la première page. J'ai imprimé $ this-> params pour voir si elle prend le numéro de page correctement, et, en premier lieu, il fait:

Array 
(
[lang] => ca 
[named] => Array 
    (
     [page] => 2 
    ) 

[pass] => Array 
    (
    ) 

[controller] => posts 
[action] => index 
[plugin] => 
[url] => Array 
    (
     [ext] => html 
     [url] => ca/posts/page:2 
    ) 

[form] => Array 
    (
    ) 
[...] 
) 

Cette partie du tableau (je l'ai ommited certaines parties que je vais montrer plus tard) est le même si j'accéder à/nouvelles/page: 2 et/messages/index/page: 2, mais si vous jetez un oeil à cette partie:

Array 
(
[...] 
[paging] => Array 
    (
     [Post] => Array 
      (
       [page] => 1 
       [current] => 3 
       [count] => 3 
       [prevPage] => 
       [nextPage] => 
       [pageCount] => 1 
       [defaults] => Array 
        (
         [limit] => 3 
         [step] => 1 
         [order] => Post.created DESC 
         [conditions] => Array 
          (
           [Post.active] => 1 
           [Post.page] => 
           [0] => Post.public_date <= NOW() 
          ) 

        ) 

       [options] => Array 
        (
         [page] => 1 
         [limit] => 3 
         [order] => Post.created DESC 
         [conditions] => Array 
          (
           [Post.active] => 1 
           [Post.page] => 
           [0] => Post.public_date <= NOW() 
          ) 

        ) 

      ) 

    ) 

vous pouvez voir qu'il n » t prenez le numéro de page correctement. Mais si j'accède depuis/posts/index/page: 2 cela prend bien le numéro et la pagination fonctionne.

Si seulement les jolis URLs ne me dérangeaient pas, mais vu que le site est multilingue, j'ai besoin au moins de ça si j'accède à/fr/posts/index/page: 2 (ou/fr/news/page : 2) ...

Voici mon fichier complet routes.php:

http://pastebin.com/th4hLZNz

Tout le monde a une idée de ce qui se passe?

Merci à l'avance

Répondre

0

Enfin j'ai trouvé la solution. En fait c'était facile et le plus gros problème était que je ne l'ai pas focalisé correctement. Je me suis concentré sur les routes en pensant que j'avais fait quelque chose de mal, mais le problème était le contrôleur.

Voici était le problème:

$this->paginate['conditions'] = array(
    'Post.active' => true, 
    'Post.page' => $page, 
    'Post.public_date <= NOW()'); 

$this->paginate['group'] = 'Post.id'; 

Le groupe (en convination les conditions) ne permet pas la fonction de paginateCount pour compter les résultats bien. J'ai donc créé ma propre fonction paginateCount sur le modèle Post manquant la condition du groupe:

/** 
* This method fixes the count query 
* when there's a GROUP BY on it 
* 
* @return integer 
*/ 
public function paginateCount($conditions = null, $recursive = 0, $extra = array()) 
{ 
    $parameters = compact('conditions', 'recursive'); 
    $params = array(); 
    if (isset($extra['group'])) 
    { 
     $params = array_merge(array(
      'fields' => array(
       'COUNT(DISTINCT(' . $this->alias . '.' . $this->primaryKey . ')) AS `count`' 
      ) 
     ), $parameters); 
    } 
    else 
    { 
     $params = array_merge($parameters, $extra); 
    } 
    return $this->find('count', $params); 
} 

Et maintenant, il semble bien fonctionner