2010-12-14 3 views
0

Я не могу разбивать свои результаты, если я обращаюсь к ним с помощью маршрутизируемого URL. Эти маршруты, которые я использую:Pagination + Проблема с маршрутами в 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')); 

Я знаю, что в последнем маршруте я не передавая: параметр языки, но если я передаю его:

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

Это не работайте.

Если я попытаюсь получить доступ к url ​​/ news/page: 2, он покажет мне результаты с первой страницы. Я распечатал $ this-> Params, чтобы увидеть, если она принимает номер страницы правильно, и, в первую очередь, это делает:

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 
    (
    ) 
[...] 
) 

Эта часть массива (я опущен некоторые части, которые я буду показать позже) то же самое, если я достигаю/новости/страница: 2 и/сообщений/индекс/страница: 2, но если вы посмотрите на эту часть:

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() 
          ) 

        ) 

      ) 

    ) 

вы можете видеть, что это Безразлично» t правильно введите номер страницы. Но если я получаю доступ с/posts/index/page: 2, то число и нумерация страниц будут работать хорошо.

Если бы это были красивые URL-адреса, не беспокоить меня, но, учитывая, что сайт многоязычен, мне нужно, по крайней мере, работать, если я получаю доступ к/en/posts/index/page: 2 (или/en/news/page : 2) ...

Вот мой полный routes.php файл:

http://pastebin.com/th4hLZNz

Кто-нибудь имеет представление о том, что происходит?

Заранее спасибо

ответ

0

Наконец я нашел решение. На самом деле это было легко, и самая большая проблема заключалась в том, что я не фокусировал ее должным образом. Я сосредоточился на маршрутах, думая, что я сделал что-то неправильно, но проблема была в контролере.

Здесь была проблема:

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

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

группа (в convination с условиями) не позволяет функция paginateCount для подсчета результатов хорошо. Таким образом, я создал свою собственную функцию paginateCount на модели Поста недостающее условие группы:

/** 
* 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); 
} 

И теперь, кажется, работает хорошо

Смежные вопросы