2016-09-06 41 views
0

我正在使用CakePHP 3.2.7。在我的控制,我分页表如下: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); 
} 
} 

的PAGINATE选项limitorder做的工作。但是,pageoffset(未显示)选项似乎被忽略。当打印的$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

我想通了,这个曾与我是结构的方式做我的url与CakePHP中分页的默认行为冲突。

CakePHP自动处理page查询字符串。虽然设置'page' => $page_number,作为分页选项是有效的,但如果存在page查询字符串,则它优先于分页选项。

在我的情况下,我正在关注分页url结构的JSON API示例。这看起来像?page[number]=3&page[size]=1。由于存在查询字符串page,因此它重写了我设置的分页选项。但是,在这种情况下,page的值是关联数组,而不是Paginator组件期望的数字。因此,组件使用的1

此它的默认值可以通过以下方式解决:

  1. 使用默认查询字符串按预期(例如?page=2&size=2)(如由@Jsonras提到的)。

  2. 使用与page(例如?paging[number]=3&paging[size]=1)不冲突的不同查询字符串,并在问题中设置page选项。

  3. 保留相同的结构(?page[number]=3&page[size]=1),并在解析值后覆盖page值的查询字符串。在这种情况下,这个代码在的问题,

    $这 - >分页= [ '限制'=> $ PAGE_SIZE, '页'=> $ PAGE_NUMBER, ];

将变为:

$this->request->query['page'] = $page_number; 
$this->paginate = [ 
     'limit' => $page_size, 
    ]; 
0

$this->paginate没有页面选项这会自动为您完成。你所要做的就是传递页码。

看到这个:http://book.cakephp.org/3.0/en/controllers/components/pagination.html

蛋糕也可以为您生成的分页链接。在这里看到:http://book.cakephp.org/3.0/en/views/helpers/paginator.html

如果你想建立一个API,这是用凝乳插件做到这一点的最好办法:http://www.bravo-kernel.com/2015/04/how-to-build-a-cakephp-3-rest-api-in-minutes/

+0

感谢您的回复。我正在尝试通过您提到的页码。 (请参考问题中的这一行:''page'=> $ page_number,')。问题是,不管我设置的页码是多少,它总是默认为1. – Elfalem

+0

正确,因为你没有正确传递它。你不需要这个代码'page'=> $ page_number',这是你自动处理的内容。首先,删除'page'=> $ page_number',然后进入你的浏览器和'http:// localhost:8765/api/collections?page = 2&size = 2'你也需要修改:'$ page_size = $ this- > request-> query ['page'] ['size'];'to:'$ page_size = $ this-> request-> query ['size'];'为上面的url工作。 – Jsonras