MIRACLE
メールサービス申込 ユーザー登録 パートナー情報
お問い合わせ FAQ サイトマップ
MIRACLE LINUXの特長 製品紹介 サービス案内 購入 サポート 技術フォーラム

プロフィール

ミラクル・リナックス株式会社営業・マーケティング部所属。

Linux, OSSに関するマーケティング情報から英語のニュースまで、幅広いトピックを扱っていきます。

ミラクル関連リンク

採用情報

サイト検索

最近のトラックバック

2008年8月

          1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
31            

« AXS3でCakePHPを使うための備忘録4 | メイン | ブログ閉鎖のお知らせ »

2008年2月28日 (木)

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ファイルがダウンロードできるようになります。

Cakephp_3

トラックバック

このページのトラックバックURL:
http://www.typepad.jp/t/trackback/4447/11935082

このページへのトラックバック一覧 AXS3でCakePHPを使うための備忘録5:

コメント

コメントを投稿

会社情報 採用情報 個人情報保護方針 商標等取り扱い事項 English
Copyright(c)2000-2006 MIRACLE LINUX CORPORATION. All Rights Reserved.