検索結果CSVダウンロード

検索結果をCSVでダウンロードする処理を追加します。 検索の処理部分は全く同じで言い訳ですから、同じadmin_serchアクションに、またモードを指定して、ダウンロードモードの時はCSVにするようにします。 まず、レイアウトとビューを用意しておきます。 /app/views/layouts/csv.ctp を新規作成して、

<?php
    header('content-type: text/plain');
    header("Content-Type: application/octet-stream");
    header("Content-Disposition: attachment; filename=member.csv");
?>
<?php echo $content_for_layout; ?>

とします。 ビューは、 /app/views/members/admin_download.ctpとして、

<?php foreach ($members as $member): ?>
<?php 
    echo $member['Member']['id'];
    echo $member['Member']['email'];
    echo $member['Member']['password'];
    echo $member['Type']['name'];
    echo $this->Time->format($format = 'Y/m/d', $member['Member']['birthday']);
    echo $this->Time->format($format = 'Y/m/d', $member['Member']['created']); 
?> 
<?php endforeach; ?>

このように書いておきます。 で、会員検索のビュー、admin_search.ctp に以下を追加しておきます。

<p><?php echo $this->Paginator->link(__('CSVダウンロード', true), array('mode'=>'DL')); ?></p>

こうするとリンクに引数を渡せます。 で、コントローラ members_controller.php のadmin_searchアクションの一番下に、

        if ((isset($this->passedArgs['mode'])) && ($this->passedArgs['mode'] == 'DL')) {
            Configure::write('debug', 0);
            $this->layout = 'csv';
            $data = $this->Member->find('all',  array(
                'order'=>array('Member.id'),
                'conditions' => $conditions
            ));
            $this->set("members", $data);
            $this->render('admin_download');
        }

を追加します。 mode=”DL” で来た時は $conditions だけ引き継いで検索し直してる感じですかね。