Export CSV

Export do excela w formacie CSV:

Zainstalowanie i włączenie pluginu

# composer require friendsofcake/cakephp-csvview

# bin/cake plugin load CsvView

config/routes.php

$routes->prefix('Brand', function (RouteBuilder $router) {
   $router->setExtensions(['pdf', 'csv']);
   ....
   $router->fallbacks(DashedRoute::class);
});

Widok templates/transactions/export.php – odnośnik do exportu

<?= $this->Html->link(__('<i class="fas fa-file-export mr-2"></i> Export'), 
    ['action' => 'export', '_ext' => 'csv', '?' => $this->request->getQuery()  // obsługa filtrowania
              ], [
    'class' => 'btn btn-info float-right',
    'title' => 'Eksport rekordów do formatu CSV (Excell)',
    'data-toggle' => 'tooltip',
    'escape' => false
]) ?>

Kontroller Transactions/export.php

public function export()
{
  $q = $this->Transactions->find()
     ->contain(['Markets' => function($q){ 
             return $q->select(['id', 'name']); 
         },
        'Points' => function($q){ 
             return $q->select(['id', 'name']); 
         }])
    ->where(['Transactions.brand_id' => $this->brand_id]); 

   // Filtrowanie
   $point_id = $this->getRequest()->getQuery('point_id', null); 
  if($point_id) {
    $q = $q->where(['Transactions.point_id' => $point_id]);
  }

  $date_from = $this->getRequest()->getQuery('date_from', null); 
  $date_to = $this->getRequest()->getQuery('date_to', null); 

  if($date_from && $date_to) { 
    $q = $q->where(function (QueryExpression $exp, Query $q) use ($date_from, $date_to) {
    return $exp->between('Transactions.created', $date_from, $date_to);
  });
  } else if($date_from) { 
    $q = $q->where(['Transactions.created >=' => $date_from]);
  } else if($date_to) { 
    $q = $q->where(['Transactions.created <=' => $date_to]);
  }

$transactions = $q->order(['Transactions.created' => 'DESC']);

// Nagłówki do Eksportu
$header = ['Punkt', 'Nr. transakcji', 'Data', 'Dostarczono', 'Otrzymano', 'Kurs', 'Rodzaj', 'Uwagi'];

// Przygotowywanie wierszy do exportu
$rows=[];
foreach($transactions as $i => $trans)
{
  $date = $trans->created; 

  $rows[$i]['point']   = $trans->point->name;
  $rows[$i]['numer']   = $trans->id .'/'. $date->year;
  $rows[$i]['data']    = $date->format('Y-m-d');
  $rows[$i]['dost']    = $trans->src_value;
  $rows[$i]['otrz']    = $trans->target_value;
  $rows[$i]['kurs_kr'] = $trans->usd_ex_buy ;
  $rows[$i]['market']  = $trans->market->name ;
  $rows[$i]['rodzaj']  = $trans->type ;
  $rows[$i]['uwagi']   = $trans->uwagi ;
}

// Wymuszenie odpowiedzi jako pobranie
$new_response = $this->getResponse()
->withDownload('CryptoEx-raport-'.date('d-m-YTHi').'.csv');
$this->setResponse($new_response);

$this->set('rows', $rows);

$this->viewBuilder()
  ->setClassName('CsvView.Csv') 
  ->setOptions([
    'serialize' => 'rows',
    'header' => $header,
    'dataEncoding' => 'UTF-8',
    'csvEncoding' => 'CP1250',
    'delimiter' => ';'              // Excel tylko ; rozróżnia
]) ;
}