如果我从路由网址访问它们,我无法对结果进行分页。这些是我正在使用的路线:
// 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文件:
任何人都知道发生了什么?
提前致谢
答案 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);
}
现在它似乎运作良好