2016-07-11 9 views
2

Я работаю над cakephp. Я создал Апи и настроить маршруты, но я хочу, чтобы отобразить пагинацию в результате JSon но я could'tRest api cakephp pagination

Вот мой код:

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, а не в компоненте Pagination.

Поэтому я предлагаю вам изменить эти данные на ваш взгляд.

// 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

На самом деле у меня нет ctp, потому что это Api, поэтому он должен автоматически генерировать json. –

+0

Да, вам действительно не нужна ctp, если вам не нужно настраивать в соответствии с вашими требованиями, как в этом случае. Вам не нужно создавать файлы ctp для других модулей Api. –

+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

Приветствия.