Проблема пагинации + маршрутов в CakePHP 1.3.6 - PullRequest
0 голосов
/ 15 декабря 2010

Я не могу разбить на страницы свои результаты, если я получаю к ним доступ через перенаправленный URL. Вот маршруты, которые я использую:

// 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'));

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

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

Эта часть массива (я пропустил некоторые части, которые я покажу вам позже) будет такой же, если я получу доступ к / news / page: 2 и / posts / index / page: 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()
                            )

                    )

            )

    )

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

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

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

http://pastebin.com/th4hLZNz

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

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

1 Ответ

0 голосов
/ 06 января 2011

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

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

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

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

Группа (в соответствии с условиями) не позволяет функции 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);
}

А теперь, похоже, хорошо работает

...