2016-07-11 11 views
2

私はcakephpに取り組んでいます。私は、APIを作成し、ルートを設定するが、私は、JSONの結果に改ページを表示したいが、私はここで残りのapi cakephpページ区切り

をcould't私のコードは次のとおりです。

ここ
class DronesController extends AppController { 


    public $paginate = [ 
     'page' => 1, 
     'limit' => 5, 
     'maxLimit' => 6, 
     'fields' => [ 
      'id', 'user_id' 
     ], 
     'sortWhitelist' => [ 
      'id', 'user_id' 
     ] 
    ]; 

    public function initialize() 
     { 
      parent::initialize(); 
      $this->loadComponent('Paginator'); 
     } 
    public function view($id) 
    { 
     $drone = $this->Drones->find()->where(['Drones.user_id' => $id], [ 
      'contain' => ['Accounts', 'Cards', 'Pilotlogs'] 
     ]); 
     $this->set('drone', $this->paginate($drone)); 
     $this->set('_serialize', ['drone']); 
    } 
} 

私が得た結果:http://imgur.com/ZEph0IB

このようにしたいです:http://imgur.com/nUCQA4Q

+0

結果はどのように正確に見えますか?最初にそれを明確にしてください。 –

答えて

0

ページングの詳細は、Pagination Helperで利用可能であり、改ページコンポーネントではありません。

したがって、私はあなたのビューでこれらのデータを変更することをお勧めします。

// View/Drones/json/view.ctp 

$pagination['has_next_page'] = $this->Paginator->hasNext(); 
$pagination['has_prev_page'] = $this->Paginator->hasPrev(); 
$pagination['current_page'] = (int)$this->Paginator->current(); 
..... 
..... 

echo json_encode(compact("drone", "pagination"), JSON_PRETTY_PRINT); 
+0

実際に私はcpを持っていないのでApiだから自動的にjsonを生成するはずです –

+0

この場合のように、あなたの要件に合わせてカスタマイズする必要がなければ、本当にctpは必要ありません。他のApiモジュール用のctpファイルを作成する必要はありません。 –

+0

私は参照してください。しかし、私がctpファイルを作成しても何も変更されません。 –

1

CakePHP 3を使用している場合は、リクエストパラメータでPaginatorコンポーネントによって生成されたページングデータを取得できます。

AppController.phpには、これをシリアライズ変数チェックの前に入れます。

if ($this->request->param('paging') !== false && 
    in_array($this->response->type(), ['application/json', 'application/xml']) 
) { 
    $this->set('paging', current($this->request->param('paging'))); 
} 

機能は次のようになります:

public function beforeRender(Event $event) 
{ 
    if ($this->request->param('paging') !== false && 
     in_array($this->response->type(), ['application/json', 'application/xml']) 
    ) { 
     $this->set('paging', current($this->request->param('paging'))); 
    } 
    if (!array_key_exists('_serialize', $this->viewVars) && 
     in_array($this->response->type(), ['application/json', 'application/xml']) 
    ) { 
     $this->set('_serialize', true); 
    } 
} 

if文は、ページングデータが存在するかどうかを確認することです。

$this->request->param('paging') // returns false if it does not exist 

current()が表示されます。私はこれを使ってモデル名を取り除いた。

current()を使用しない結果は次のようになります。

"paging": { 
    "Posts": { 
     "finder": "all", 
     "page": 1, 
     "current": 6, 
     "count": 6, 
     "perPage": 10, 
     "prevPage": false, 
     "nextPage": false, 
     "pageCount": 1, 
     "sort": null, 
     "direction": false, 
     "limit": null, 
     "sortDefault": false, 
     "directionDefault": false 
    } 
} 

current()を使用すると結果は以下のようになります。

"paging": { 
    "finder": "all", 
    "page": 1, 
    "current": 6, 
    "count": 6, 
    "perPage": 10, 
    "prevPage": false, 
    "nextPage": false, 
    "pageCount": 1, 
    "sort": null, 
    "direction": false, 
    "limit": null, 
    "sortDefault": false, 
    "directionDefault": false 
} 

CakePHPのPaginatorHelperは、ページングデータにアクセスするには、このメソッドを使用しています。

ソース/参照:Cake\View\Helper\PaginatorHelper

乾杯。