cakephp 3.2.7分页 - 页面选项被忽略

时间:2016-09-06 06:01:44

标签: php cakephp pagination

我正在使用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);
}
}

分页选项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选项?

2 个答案:

答案 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。

这可以通过以下方式解决:

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

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

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

    $ this-> paginate = [             'limit'=> $ PAGE_SIZE,             'page'=> $ PAGE_NUMBER,  ];

  4. 将更改为:

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