2017-01-10 6 views
1

Я пытаюсь создать Api, используя cakephp. Я создаю json на сервере, и он отлично работает, но я устал использовать разбивку на страницы, и у меня возникла проблема.Изменение данных до разбивки на страницы в CakePhp

в первом случае я беру путь на изображение и кодировать его в base64 и сгенерировать JSON => работает

во втором случае я определил пагинацию лимитами и макс, и я все тот же код но в итоге поле изображений по-прежнему путь из базы данных, и это не кодируется

это мой код в моем контроллере:

class PilotsController extends AppController { 
    public $paginate = [ 
     'page' => 1, 
     'limit' => 5, 
     'maxLimit' => 5 
    ]; 

    public function initialize() { 
     parent::initialize(); 
     $this->loadComponent('Paginator'); 
     $this->Auth->allow(['add','edit','delete','view','count']); 
    } 

    public function view($id) { 
     $pilot = $this->Pilots->find()->where(['Pilots.account_id' => $id], [ 
      'contain' => ['Accounts', 'Pilotlogs'] 
     ]); 
     foreach ($pilot as $obj) { 
      if ($obj->image_pilot!= NULL) { 
       $image1 = file_get_contents(WWW_ROOT.$obj->image_pilot); 
       $obj->image_pilot = base64_encode($image1); 
      } 
     } 
     $this->set('pilot', $this->paginate($pilot)); 
     $this->set('_serialize', ['pilot']); 
    } 
} 

Если удалить нумерацию страниц из кода он работает нормально. Любая идея, как это исправить?

ответ

1

Я предложил бы использовать результат форматировщик вместо этого, т.е. Query::formatResults(). Таким образом, вы будете иметь что-то вроде этого:

public function view($id) { 
$pilot = $this->Pilots->find() 
->where(['Pilots.account_id' => $id], [ 
    'contain' => ['Accounts', 'Pilotlogs']]); 
->formatResults(function($results) { 
    return $results->map(function($row) { 
     $image1 = file_get_contents(WWW_ROOT.$row['image_pilot']); 
     $row['image_pilot'] = base64_encode($image1); 
     return $row; 
    }); 
}); 

}

+0

Спасибо! оно работает –

0

Вы можете просто сначала перенести данные, а затем получить значения массива и после этого изменить эти данные так, как вы хотите. Проверьте это

public function view($id) { 
    $pilot = $this->Pilots->find()->where(['Pilots.account_id' => $id], [ 
     'contain' => ['Accounts', 'Pilotlogs'] 
    ]); 
    $pilot = $this->paginate($pilot); 
    $pilot = $pilot->toArray(); 
    foreach ($pilot as $obj) { 
     if ($obj->image_pilot!= NULL) { 
      $image1 = file_get_contents(WWW_ROOT.$obj->image_pilot); 
      $obj->image_pilot = base64_encode($image1); 
     } 
    } 
    $this->set('pilot', $pilot); 
    $this->set('_serialize', ['pilot']); 
} 
+2

Вот что [** результат форматтеры **] (https://book.cakephp.org/3.0/en/orm/query- builder.html # add-calculate-fields). – ndm

+0

Я всегда изучаю новые новинки. Спасибо :) –