[Zend Framework] Zend_Layout: fputcsv を利用して、配列をCSVに変換/ダウンロード
以前に ContextSwitch を利用して CSV ファイルを作成したのですが、fputcsv という PHP 関数を利用した方法を試してみました。
Zend Framework 内で使う場合の手順は、こんな感じのようです。
- ビューレイアウトを無効にする
- fputcsv を使ってファイルを生成
- ダウンロード (headerを作成)
Action 内で下記のような形で使えました。
$csv = array(
array('1111', '1111', '1111', '1111'),
array('2222', '2222', '2222', '22,22'), // カンマ混在
array('3333', '3333', '3333', "33\n33"),// 改行混在
array('title' => 'タイトル', // 連想配列
'name' => '名",前',// ダブルクォート,カンマ混在
'hoge' => 'ほげ',
'fuga' => 'ふが'),
);
$filename = 'sample.csv';
// Zend_View, Layout の無効化
$this->_helper->layout()->disableLayout();
$this->_helper->viewRenderer->setNoRender(true);
//open/save dialog box
header("Content-Disposition: attachment; filename=\"$filename\"");
//content type
header("Content-type: application/octet-stream");
header("Pragma: no-cache");
header("Expires: 0");
//read from array and STDOUT
$fp= fopen('php://output', 'w');
foreach ($csv as $fields) fputcsv($fp, $fields);
fclose($fp);
disableLayout, setNoRender
fputcsv
TSV
TSVで出力したい場合、「fputtsv」という関数は無いので、fputcsvの引数に「」を渡して処理します。
上の例のfputcsvに修正を加えると… fputcsv($fp,$line, "¥t"); これでタブ区切りで出力されるようになります。
そして、ダウンロードさせる時のContent-Typeは、 「text/tab-separated-values」 です。