我正在使用CakePHP 3.2.7。在我的控制器中,我按如下方式对表进行分页:
class CollectionsController extends AppController
{
public function index()
{
$page_number = 1;
$page_size = 10;
if($this->request->query('page') !== null){
if(array_key_exists('number', $this->request->query('page'))){
$page_number = $this->request->query['page']['number'];
}
if(array_key_exists('size', $this->request->query('page'))){
$page_size = $this->request->query['page']['size'];
}
}
$this->paginate = [
'limit' => $page_size,
'page' => $page_number,
//'order' => ['Collections.id' => 'desc']
];
$collections = $this->paginate($this->Collections->find('all'));
$this->set(compact('collections'));
$this->set('_serialize', true);
}
}
分页选项limit
和order
确实有效。但是,似乎忽略了page
和offset
(未显示)选项。打印$this->request->params['paging']
的内容时(当请求页面2的大小/限制为2的表格有3行,查询如http://localhost:8765/api/collections?page[number]=2&page[size]=2
)时,我得到:
"finder": "all",
"page": 1,
"current": 2,
"count": 3,
"perPage": 2,
"prevPage": false,
"nextPage": true,
"pageCount": 2,
"sort": null,
"direction": false,
"limit": null,
"sortDefault": false,
"directionDefault": false
perPage
选项的值为2(我期望)但是page
的值为1(当它应为2时)。为什么在其他分页选项有效时忽略page
选项?
答案 0 :(得分:0)
$this->paginate
没有页面选项。这是自动完成的。您所要做的就是传递页码。
请参阅:http://book.cakephp.org/3.0/en/controllers/components/pagination.html
Cake还可以为您生成分页链接。见这里:http://book.cakephp.org/3.0/en/views/helpers/paginator.html
如果您正在尝试构建API,这是使用CURD插件执行此操作的最佳方式:http://www.bravo-kernel.com/2015/04/how-to-build-a-cakephp-3-rest-api-in-minutes/
答案 1 :(得分:0)
我发现这与我构建我的url的方式有关,这与CakePHP中的分页默认行为相冲突。
CakePHP自动处理page
查询字符串。虽然为分页选项设置'page' => $page_number,
是有效且有效的,但如果有page
查询字符串,则它优先于分页选项。
就我而言,我正在关注分页网址结构的JSON API示例。这看起来像?page[number]=3&page[size]=1
。由于查询字符串page
存在,它覆盖了我正在设置的paginate选项。但是,在这种情况下,page
的值是一个关联数组,而不是Paginator组件所期望的数字。因此,组件使用其默认值1。
这可以通过以下方式解决:
按预期使用默认查询字符串(例如?page=2&size=2
)(如@Jsonras所述)。
使用与page
不相符的其他查询字符串(例如?paging[number]=3&paging[size]=1
)并在问题中设置page
选项。
在解析值后保持相同的结构(?page[number]=3&page[size]=1
)并覆盖page
查询字符串的值。在这种情况下,这个代码在问题中,
$ this-> paginate = [ 'limit'=> $ PAGE_SIZE, 'page'=> $ PAGE_NUMBER, ];
将更改为:
$this->request->query['page'] = $page_number;
$this->paginate = [
'limit' => $page_size,
];