2016-09-06 40 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