CakePHP 3 plugin CsvView
W artykule przedstawię ciekawy plugin do CakePHP, a mianowicie CsvView. Służy on do łatwego generowania danych wyjściowych w postaci csv. Instalacja za pomocą composera jest bardzo prosta.
composer require friendsofcake/cakephp-csvviewNastępnie ładujemy plugin w konsoli.
bin/cake plugin load CsvViewMożna też dopisać po prostu linijkę w pliku Application.php w metodzie bootstrap.
$this->addPlugin('CsvView');Sposób w jaki używamy plugina jest bardzo prosty. Spójrzmy na poniższy przykład metody w kontrolerze.
public function export() { $data = [ ['a', 'b', 'c'], [1, 2, 3], ['bla', 'bla2', 'bla3'], ]; $_serialize = 'data'; $this->viewBuilder()->setClassName('CsvView.Csv'); $this->set(compact('data', '_serialize')); }Wszystkie zmienne, które mają być zawarte w pliku csv, muszą być określone w zmiennej widoku $ _serialize, dokładnie tak, jak działa JsonView lub XmlView. Jest możliwe przekazywanie kilku zmiennych tak jak w przykładzie poniżej.
public function export() { $data = [['a', 'b', 'c']]; $data2 = [[1, 2, 3]]; $_serialize = ['data', 'data2']; $this->viewBuilder()->setClassName('CsvView.Csv'); $this->set(compact('data', 'data2', '_serialize')); }Jeśli chcesz, aby nagłówek lub stopka były wyświetlane w danych wyjściowych CSV, możesz określić zmienną widoku $ _header lub $ _footer.
$_header = ['ID', 'Name', 'Email']; $_footer = ['Totals', '400', '$3000']; $this->set(compact('data', '_serialize', '_header', '_footer'));Można także określić separator, znak końca linii, znak nowej linii, znak zmiany znaczenia i sekwencję znacznika kolejności bajtów (BOM), używając odpowiednio $ _delimiter, $ _eol, $ _newline, $ _enclosure i $ _bom:
$_serialize = 'data'; $_delimiter = chr(9); //tab $_enclosure = '"'; $_newline = '\r\n'; $_eol = '~'; $_bom = true; $this->viewBuilder()->setClassName('CsvView.Csv'); $this->set(compact('data', '_serialize', '_delimiter', '_enclosure', '_newline', '_eol', '_bom'));Jeśli chcesz uzyskać bardziej skomplikowane dane z modelu, możesz użyć zmiennej widoku $ _extract do określenia poszczególnych ścieżek kompatybilnych z Hash::extract() lub za pomocą funkcji dla każdego rekordu:
public function export() { $posts = $this->Posts->find(); $_serialize = 'posts'; $_header = ['Post ID', 'Title', 'Created']; $_extract = [ 'id', function (array $row) { return $row['title']; }, 'created' ]; $this->viewBuilder()->setClassName('CsvView.Csv'); $this->set(compact('posts', '_serialize', '_header', '_extract')); }Na obecnym etapie URL naszego eksportu CSV to nazwa_kontrolera/export. Fajnie byłoby dołączyć do rozszerzenia CSV. W tym celu powiemy Cakowi, aby poprawnie przeanalizował żądania pliku CSV. W naszym pliku config/routes.php dodamy:
Router::extensions(['csv']);Poniższy kod pokazuje jak poprawnie utworzyć link do naszego pliku csv.
<?= $this->Html->link('export', [ 'controller' => 'nazwa_kontrolera', 'action' => 'export', '_ext' => 'csv' ]) ?>