AXS3でCakePHPを使うための備忘録5
前回まででDBにデータをためることができるようになったので、今回はCSVファイルの出力の仕方を書きます。
CSVファイルというとExcelで処理する場合が多く、そのため出力はShift-JISで行うケースが多いでしょう。PHPでは普通 mb_convert_string() を通してエンコーディングを変換しますが、結構この処理を忘れてしまう場合も多いですよね。CakePHPではデータベース接続の encoding で sjis を指定すれば内部的にこの変換を行ってくれるので、コーディングする身としては特に意識する必要がありません。
app/config/database.php に、以下の変数を定義します。
var $csvsrc = array('driver' => 'mysql',
'connect' => 'mysql_connect',
'host' => 'localhost',
'login' => 'dbuser',
'password' => '******',
'database' => 'bookshelf',
'encoding' => 'sjis',
'prefix' => '');
次に、app/controllers/users_controller.php で以下のアクションメソッドを追加します。
function generate()
{
$this->autoRender = false;
$db =& ConnectionManager::getDataSource('csvsrc');
Configure::write('debug', 0);
$csv_file = sprintf("pkey_%s.csv", date("Ymd-hi"));
header("Content-disposition: attachment; filename=" . $csv_file);
header("Content-type: application/octet-stream; name=" . $csv_file);
$books = $db->query("SELECT * FROM books");
foreach ($books as $book) {
print implode(',', $book['books']);
print "\r\n";
}
return;
}
簡単に解説すると、まず1行目でレンダリングをオフにします。このおかげで、新たにビュー(app/views/books/generate.thtmlファイル)を作成する必要がありません。
2行目で先ほど定義した、SJISのDB接続へ切り替えます。
3行目でデバッグオプションを最小にして一切警告メッセージを吐かないようにし、ファイルの中にごみデータが入るのを防ぎます。
4~6行目はCSVを吐くためのヘッダーの準備。
7~11行目でSELECTクエリを実行して、戻り値に対して一行ずつ implode() で「,」区切りにしていきます。行末尾の \r\n は Excel で読み込んだときに改行を認識させるためです。
これでCSVを吐けるようになったのですが、ブラウザで「http://localhost/books/generate」とURLを直接指定しなければいけないので面倒です。そこで、トップページにリンクを作ります。
app/views/books/index.thtml の31行目に、以下を追加します。
<ul class="actions">
<li><?php echo $html->link('New Book', '/books/add'); ?></li>
<li><?php echo $html->link('Generate CSV', '/books/generate'); ?></li>
</ul>
これにより、トップページからGenerate CSVリンクを押すと、CSVファイルがダウンロードできるようになります。




コメント