CakePHP2でCSVやTSVデータをダウンロードできるようにするには

ヘルパーを使う方法もあるようですが、もっと単純な方法で実装をしてみました。拡張子指定によってViewを切り替えたいといった要望がない場合はこれで十分でしょう。

InfoController.phpを用意してあり、http://example.jp/app/info/ でアクセスできるように設定してあるとします。下記のようにlist_all_csv()メソッドを追加します。こうすると、http://example.jp/app/info/list_all_tsv へアクセスするとTSVファイルのダウンロードができます。CSVファイルにしたい場合は、 “\t” を “,” に直せばいいでしょう。また、ヘッダーがいらない場合は、$list[0]に関しての処理を省略します。

  public function list_all_tsv()
  {
    $tsv_file_name = 'info.tsv';
    $response_type = 'comma-separated-values';
    $this->autoRender = false;
    $this->response->type($response_type);
    $this->response->download($tsv_file_name);
    $list = $this->Info->find('all');
    //Debugger::log($list);
    $content = "";
    $list_size = count($list);
    $info = $list[0]['Info'];
    foreach (array_keys($info) as $info_key) {
      $a = $info_key;
      $content .= $a . "\t";
    }
    $content .= "\n";
    for ($i = 0; $i < $list_size; $i++) {
      $info = $list[$i]['Info'];
      foreach (array_keys($info) as $info_key) {
        $a = $info[$info_key];
        $content .= $a . "\t";
      }
      $content .= "\n";
    }
    $this->response->body($content);
  }

CakePHP2の参考書には下記があります。

同じタグの記事: CakePHP2
同じタグの記事: CSV
同じタグの記事: TSV
同じカテゴリの記事: Program