WHAT'S NEW?
Loading...

CakePHP1.2で内容をカスタマイズしたCSVをダウンロードさせる【2/3】

■CSVヘルパーのインストール
まず、CakePHP1.2で使えるCSVヘルパーを落とす。
【PHP5】
http://bakery.cakephp.org/articles/view/csv-helper-php5
【PHP4互換】
http://ifunk.net/cakephp/helpers/csv.php.txt

リンク先はPHP5と、PHP4互換の2種類あるが、今回念のためPHP4互換を使ってみる。
ページを表示したらコピーして、csv.phpという名前で保存する。
※WebサーバがPHP5のみインストールされているのであれば、躊躇無くPHP5版を選ぶと良い。

というわけで、csv.phpファイルを
[/Path/To/CakePHP/App/views/helpers/csv.php]
に設置する。
これでCSVヘルパーのインストールは完了。



■CSVヘルパー事前準備
コントローラ側で
var $helpers = array('Csv');
とし、CSVヘルパーを読み込むようにする。
もちろん、
var $helpers = array('Html', 'JavaScript');
などか書かれていれば、配列にCsvを追加する。
これでコントローラ内でCSVヘルパーが使えるようになった。

■アクションの作成
同コントローラ内に、csvというアクションメソッドを作ってみる。
ブラウザ上のリクエストURIとして実行するものなので、アクションとした。
※ちょっとした関数などはアクションにしないで、ただの関数にしておくと良い。もちろん関数名の先頭にアンダーバーをつければ、ブラウザから読み込めなくなるのでセキュリティ的にも良い

CSVファイルに出力したい内容に、デバッグ情報が入ってしまうのを防ぐことと、実際にブラウザ上ではCSVファイルの中味は表示しないという、二つの設定をアクション内に記述しておく。
function csv()
{
  Configure::write('debug', 0); // デバッグ情報不要
  $this->layout = false; // layout 不要 
}
アクションメソッドでは、仮にHistoryモデルから全レコードを抽出することとする。
あらかじめコントローラ側で
var $uses = array('History');
などと設定しておくこと。

function csv()
{
  Configure::write('debug', 0); // デバッグ情報不要
  $this->layout = false; // layout 不要 
  $this->set('histories', $this->History->find('all')) ;
}

■ビューの作成
コントローラ名に準じたビューディレクトリに、csv.ctpというビュースクリプトファイルを作っておく。
ここではhistories_controller.phpを使うこととするのでviews/historiesとした
ビュースクリプトの中味は単純で、以下のようになる。
[/Path/To/CakePHP/App/views/histories/csv.ctp]
$csv->addGrid($histories);
$csv->setFilename('支払.csv');
echo mb_convert_encoding($csv->render(), 'SJIS', 'UTF-8');
1行目、コントローラから渡されたHistoryモデルの全データを、addGridメソッドで適用させる。
2行目、出力するファイル名を設定する。
3行目、大抵Excelで見ることになるので、UTF-8からShift_JISに変換して出力
これでOK。

■確認
http://example.com/histories/csv などとブラウザ上でアクセスしてみる。
正しくブラウザがダウンロードを開始すれば成功だ。