CakePHP 1.3.6中的分页+路由问题

时间:2010-12-14 21:55:31

标签: cakephp pagination routes cakephp-1.3

如果我从路由网址访问它们,我无法对结果进行分页。这些是我正在使用的路线:

// 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访问它,那么数字很好并且分页有效。

如果它只是漂亮的网址不打扰我,但考虑到该网站是多语言的,如果我访问/ en / posts / index / page:2(或/ en / news / page: 2)...

这是我的完整routes.php文件:

http://pastebin.com/th4hLZNz

任何人都知道发生了什么?

提前致谢

1 个答案:

答案 0 :(得分:0)

最后我找到了解决方案。实际上它很容易,最大的问题是我没有正确地关注它。我专注于认为我做错了什么的路线,但问题是控制器。

问题在于:

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

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

该组(在符合条件的情况下)不允许paginateCount函数很好地计算结果。所以我在Post的Model上创建了我自己的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);
}

现在它似乎运作良好