Yacsvは、拙作のYet AnatherなCSVプラグインです。(使い方はこちら)
今まで数々のプロジェクトの「CSVインポート機能」で活躍してきました。個人的にはFilebinderの次によくできたと思っているプラグインです。
機能を追加するプラグインよりも、面倒な機能を簡単に実装できる(省略できる)プラグインが好きです。
CSVエクスポート機能
本当によくある「CSVインポート機能」。そのCSVインポート機能の実装でYacsvは使われてきました。
結構なパターンのCSVに対応しており、テストもあり、CIも回っていて、安心して実装できています。
一方で、CSVインポートより頻度は少ないながらもよくある機能が「CSVエクスポート機能」です。
こちらは、CSVをControllerでechoしたり、ViewでレンダリングしたりHelper使ったり、いろんな方法で実装してきましたが、どれも「まあ普通」でした。
「あ、そうだ。YacsvのCSVエクスポート実装をつくろう」
ということで、CakePHP3がでる直前のこのタイミングでつくっちゃいました。
Yacsv.CsvGenerator
同じYacsvなので、当然Yacsv.ImporterBehaviorと同じ感覚で使えることを目指しています。
以下のような感じで、配列地獄(?)なModel::find('all')
の返り値にいい感じ対応してCSVを生成できるようになっています。
<?php App::uses('CsvGenerator', 'Yacsv.Lib'); $posts = $this->Post->find('all'); $fields = array( 'Post.body', 'Post.title', 'Post.created', ); $options = array( 'csvEncoding' => 'UTF-8', 'delimiter' => ',', 'enclosure' => '"', 'newlineChar' => "\n", 'forceEnclose' => true, 'forceOutput' => false, ); $csvString = CsvGenerator::generate($posts, $fields, $options);
内部エンジンはこれまた拙作のGinqCsvを利用しているので、$options
のパラメータもGinqCsvのそれと同じです。
実は、GinqCsvの
$options
のパラメータがYacsv.ImpoterBehaviorを参考にしているので、結果としてYacsv.CsvGeneratorはYacsv.ImporterBehaviorと似ている感覚でCSV出力が可能。というわけです。
CSVのヘッダを設定したいときは $fields
を配列ではなく、以下のよう連想配列で設定するだけです。
(これを思いついたから作ったと言っても過言ではない)
<?php $fields = array( '内容' => 'Post.body', 'タイトル' => 'Post.title', '投稿日時' => 'Post.created', );
その他の使い方は、是非テストケースを見てみてください。