在我的路线configuratoin中,我只使用自定义路线。现在我在分页问题上遇到了问题。
路线:
// view all posts by year and month
Router::connect('/blog/:year/:month/*', array(
'controller' => 'posts',
'action' => 'index',
'month' => null
), array(
'pass' => array(
'year',
'month'
),
'year' => '[12][0-9]{3}',
'month' => '0[1-9]|1[012]'
));
这应该执行以下操作:/ blog / 2012 /应列出2012年的所有帖子,而月份则不相关。 / blog / 2012/05 /应该列出2012年5月,月份相关的所有帖子。我在最后添加/ *使用/ blog / 2012/05 / page:2,现在工作正常。但是,/ blog / 2012 / page:2不起作用,页面:2假定为一个月,并且由于不匹配的正则表达式,转换为'',因此数据库查询查找一个月''。
我可能在某种程度上没有完全掌握路由,以及如何声明可传递且无法传递的变量,但是如何重写此配置以使其工作,而不是从根本上改变它?我真的认为这是一个配置问题。 感谢。
答案 0 :(得分:1)
如果您禁用了所有默认的Cake路由,它将停止分页工作,您只能通过添加以下内容来获取用于分页的路由:
Router::connectNamed(false, array('default' => true));
http://book.cakephp.org/2.0/en/development/routing.html#controlling-named-parameters
答案 1 :(得分:0)
为了以务实而又不那么优雅的方式解决这个问题,我提出了以下建议。首先,我连接了名为parameter的页面:
Router::connectNamed(array('page' => '[\d]+'), array(
'default' => false,
'greedy' => false
));
according to the cookbook,这只会启用名为parameter的页面并禁用所有其他页面,并且它只接受数值。
我不确定这是否与我的具体问题特别相关。
其次,我重读了食谱,看到here,routes.php中的连接顺序真的很重要。即,当必须路由URL时,文件顶部的连接优先于底部的连接。因此,我想出了这个配置顺序:
// view all posts by year and month
Router::connect('/blog/:year/:month/*', array(
'controller' => 'posts',
'action' => 'index'
), array(
'year' => '[12][0-9]{3}',
'month' => '0[1-9]|1[012]'
));
// view all posts by year
Router::connect('/blog/:year/*', array(
'controller' => 'posts',
'action' => 'index'
), array('year' => '[12][0-9]{3}'));
// view all posts
Router::connect('/blog/*', array(
'controller' => 'posts',
'action' => 'index'
));
之前,它被颠倒了,即/ blog / *首先连接。由于这个贪婪的明星,这个“吞噬”了一切,也像/ blog / 2012 /,其中2012年只是作为一个论点传递。而现在,我可以提出/ blog / 2012 / page:2,/ blog / 2012/05 / page:2,像/ blog / 2012 / 5ssfd / page:2的“假”网址将映射到/ blog / 2012 / page:2,即在这种情况下,第一个连接不匹配,因此它跳转到第二个连接。我这样做的原因是我无法做像/ blog /:year /:month / page:page这样的东西,从而避免贪婪的明星(也许有人知道如何做到这一点)。