Cakephp 指定页码时找不到分页器
我在Usergals控制器中手动设置CakePHP分页值,就像这样,以便在Usergal视图上对相关模型(TreasuresUsergal)进行分页。以下是UsergalController中的简化代码段:Cakephp 指定页码时找不到分页器,cakephp,pagination,Cakephp,Pagination,我在Usergals控制器中手动设置CakePHP分页值,就像这样,以便在Usergal视图上对相关模型(TreasuresUsergal)进行分页。以下是UsergalController中的简化代码段: public function view($id = null) { $this->loadModel('TreasuresUsergal'); $options['joins'] = array( array('table' => 'treasures',
public function view($id = null) {
$this->loadModel('TreasuresUsergal');
$options['joins'] = array(
array('table' => 'treasures',
'alias' => 'Treasure2',
'type' => 'LEFT',
'conditions' => array(
'Treasure2.id = TreasuresUsergal.treasure_id',
)
)
);
$options['conditions']=array('TreasuresUsergal.usergal_id'=>$id);
$options['fields']=array('Treasure2.*','TreasuresUsergal.ord','TreasuresUsergal.comments');
$options['order']=array('TreasuresUsergal.ord'=>'asc');
$options['limit']=$limit;
$this->Paginator->settings = $options;
$treasures=$this->Paginator->paginate('TreasuresUsergal');
$this->set('treasures',$treasures);
}
因此,在上面的示例中,$id是从URL传递给view函数的值。这里有一个活生生的例子:
正如您所看到的,它只适用于单个页面。但是,今天我在视图中测试了分页器,发现“下一步”按钮不起作用。计数器、排序和页码都正确加载-但只要传递实际命名参数“Page:n”(当n大于1时),我就会得到一个未找到的页面,并出现以下错误:
Not Found
Error: The requested address '/usergals/view/20/page:2?url=%2Fusergals%2Fview%2F20' was not found on this server.
我一定错过了一些简单的东西——我已经尝试过一些路线,但还没能弄明白。或者我缺少一些分页器选项?或者,当它不是的时候,它是否认为它超出了边界
更新/解决方案
经过一番周折,我想出了这个解决办法。虽然没有我想的那么好,但这里是基本的想法(可以添加错误处理等)
首先,我在beforeFilter中添加了一个检查,以查看是否设置了页面参数。如果是这样,我将其更改为“p”参数并重定向
我在这里这样做是因为在其他方面,我遇到了NotFound异常的问题(参见底部的注释)。因此,在beforeFilter中:
if (isset($this->params['named']['page'])){
$newurl=$this->params['named'];
$pg=$newurl['page'];
unset($newurl['page']);
$newurl['p']=$pg;
$this->redirect(array('action' => 'view/'.$this->params['pass'][0])+$newurl);
}
然后,在同一控制器的“查看”功能中,我添加了此选项以及其他分页器选项:
if (isset($this->params['named']['p'])) $options['page']=$this->params['named']['p'];
这样,标准分页器行为在视图中似乎可以正常工作。上一个、下一个等
如果有人有更好的建议,我很乐意听。我不喜欢必须重定向的想法,但它现在起作用了
值得注意的是,添加此代码(甚至只是为了实验)导致我的所有分页计数停止工作。调试中的查询正确,但显示的计数错误:
try {
$this->Paginator->paginate();
} catch (NotFoundException $e) {
}
这美元限额是从哪里来的?此外,我也不确定这是否是一个好的方式:“宝库2.*”您是否尝试过编写每个宝库2。语句,我知道这会很费时,但只是为了确保(*)字符没有在您的查询周围混乱。谢谢您的评论。我应该提到我把$limit硬编码为100——我只是计划有一天它会成为一个变量,所以我就这样做了。查看我的更新以了解我一直在策划的解决方案。