質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

CakePHP

CakePHPは、PHPで書かれたWebアプリケーション開発用のフレームワークです。 Ruby on Railsの考え方を多く取り入れており、Railsの高速性とPHPの機動性を兼ね備えています。 MVCやORMなどを「規約優先の考え方」で利用するため、コードを書く手間を省くことができます。 外部のライブラリに依存しないので、単体での利用が可能です。

Q&A

解決済

2回答

5594閲覧

CakePHPで検索結果のテーブルをCSVで出力したい

ssk

総合スコア332

MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

CakePHP

CakePHPは、PHPで書かれたWebアプリケーション開発用のフレームワークです。 Ruby on Railsの考え方を多く取り入れており、Railsの高速性とPHPの機動性を兼ね備えています。 MVCやORMなどを「規約優先の考え方」で利用するため、コードを書く手間を省くことができます。 外部のライブラリに依存しないので、単体での利用が可能です。

1グッド

1クリップ

投稿2017/01/23 12:55

export()アクションを使って
index.ctpで検索した検索結果をCSVファイルでダウンロードしたいです。

######今の状態

HTML

1<!--index.ctp--> 2<?= $this->Html->link(__('CSVダウンロード'), ['action' => 'export'],['class' => 'btn btn-block btn-default']) ?>

この「CSVダウンロード」ボタンをクリックした時
実行されるのが、以下のexport()アクションです。

PHP

1//HogesController.php 2public function export() 3 { 4 $table = $this->Hoges->find('all'); 5 $_serialize = 'table'; 6 $_header = ['ID','名前','コメント']; 7 $_extract = ['id','name','comment']; 8 $this->response->download('sample.csv'); 9 $this->viewBuilder()->className('CsvView.Csv'); 10 $this->set(compact('table', '_serialize', '_header', '_extract')); 11 }

$this->Hoges->find('all')で全件取得しているので
ここに検索結果の内容にすれば動作するかと考えています。

ただ、どうやって記述したらいいかわからず、、、
そもそもこの方法いいのか、、アドバイスいただければ幸いです。

mattsershaw👍を押しています

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

ssk

2017/01/24 04:24

CsvView Pluginを利用しています。CSVファイルのダウンロードはできています。検索後のテーブルをダウンロードするにはどうしたらいいのでしょう、、、
guest

回答2

0

検索画面でCSVダウンロードボタンを追加して、CSVダウンロードボタンを押したときはJS側でクリックイベントを拾って、hiddenに"csv"といった値を設定してsubmit()する。
アクション側では"CSV"が渡された場合は、ビューをCsvViewに切り替えればいいと思うのですが。

php

1// 検索画面のアクション 2public function serch() { 3 $table = $this->Hoges->find().where(...); 4 // 検索ボタンを押した場合は、ビューの切り替え無し(検索画面のビューを使用する) 5 if(isset($this->params->named['csv'])) { 6 // CSVダウンロード処理の場合 7 $this->render('CsvView'); // ビューをCsvViewに切り替え 8 $_serialize = 'table'; 9 $_header = ['ID','名前','コメント']; 10 $_extract = ['id','name','comment']; 11 $this->response->download('sample.csv'); 12 $this->viewBuilder()->className('CsvView.Csv'); 13 $this->set(compact('table', '_serialize', '_header', '_extract')); //検索結果をビューに渡す 14 } 15}

といった具合かと。

投稿2017/01/26 04:27

turbgraphics200

総合スコア4267

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

popobot

2017/01/26 04:39 編集

自分も同じアクションで出力を出し分けるほうがスマートだと思います! jsを使わなくてもsubmitのnameを別にすれば、Cakephp側でどっちのボタンが押されたかは判断できると思います。以下参考になりそうなteratailがあったので載せておきます。 https://teratail.com/questions/41024
ssk

2017/01/26 05:50

turbgraphics200様 サンプルコード、ありがとうございます! こちらでできるよう、再度コーディングしてみます。 icchii様 参考URLありがとうございます。 こちらも参考に、進めてまいります。
ssk

2017/01/27 08:04 編集

こちらの方法で実装しています。 JS側でクリックイベントを拾って、hiddenに"csv"といった値を設定してsubmit()の方法がわからず、困っています。現状のコードです。 hiddenで渡しているのにボタンを押すとパラメータに含まれてしまいます。 //index.ctp <span id="csv" class="btn btn-block btn-default">CSVダウンロード</span> <?= $this->Form->create('search',[ 'url' => ['action' => 'index'], 'id' => 'search', 'type' => 'get', ]); ?> <?= $this->Form->button(__('検索')) ?> <?= $this->Form->end() ?> <script type="text/javascript"> $('#csv').on('click', function() { $("#search").append('<input type="hidden" name="csv" value="csvsearch">'); $("#search").submit(); }); </script>
ssk

2017/01/27 09:31

debug($this->params->named['csv']); ↓エラー Trying to get property of non-object
guest

0

ベストアンサー

indexに渡されたパラメータを同じようにexportに渡してあげて、whereで条件を追記してあげれば、いいのではないかと

php

1$this->Hoges->find('all')->where([]);

投稿2017/01/24 04:52

編集2017/01/24 05:20
popobot

総合スコア6586

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

popobot

2017/01/24 05:20 編集

※質問の意図を間違えたので、書き換え...
ssk

2017/01/25 04:54 編集

ありがとうございます。 indexに渡されたパラメータを同じようにexportに渡してあげて ↑どのように渡したらいいですか?試してみたものの、渡し方がわからず、、、ご教授いただければ幸いです。さ $table = $this->Hoges->find() ->where(["sample01 like " => 'りんご']); と条件を指定すると、検索結果後のテーブルデータがダウンロードできましたので、->where(["sample01 like " => 'りんご']);の内容を渡してあげればよいとは思うのですが><
popobot

2017/01/25 05:23

index側のwhere句が何をもとに作られているのかわからないので、これ以上なんとも言えません... クエリパラメータかなにかで渡すか、セッションに渡すかとかでしょうか
ssk

2017/01/25 08:04 編集

icchii様 セッションで渡す場合 コントラーラーで //HogesController public function hogehoge() { $this->request->session()->write('foo', 'bar'); } public function hogehogehoge() { $SearchTable = $this->request->session()->read('foo'); debug($SearchTable); } でセッションの内容を呼び出せると思ったんですが $SearchTable がnullになってしまいます。 セッションの書き方が間違っていますか?
turbgraphics200

2017/01/25 08:17

コントローラーから、ビューに渡してるところは $this->set(compact('table', '_serialize', '_header', '_extract')); の行になります。
ssk

2017/01/25 08:23

$table = $this->request->session()->read('foo'); $_serialize = 'table'; とすればいいかと考えました。 ただ、$this->request->session()->read('foo');がnullになってしまい セッションがpublic function hogehoge()から渡せていないようです。
popobot

2017/01/25 08:53

> セッションの書き方が間違っていますか? あっていると思いますよ。手元の環境ではhogehogehogeでbarが表示されました。 なお、findした結果をセッションで持つのはサイズ的に問題があるかもしれないので、whereに渡す配列などにした方がよいかと
ssk

2017/01/26 03:47

$hoges = $this->Hoges->find('all'); $hoges->where(["column IN" => $values]); $ArrayCSV = ["column IN" => $values]; $ArrayCSV ↑をセッションに持たせることで実装することができました! icchii様、turbgraphics200様  助かりました><
turbgraphics200

2017/01/26 03:50

なぜセッションに持たせる必要があるのかが気になります。
ssk

2017/01/26 03:53

turbgraphics200様 動いて満足していました、、 どのように書くのがベストでしょうか? サンプルのコードも記載いただけると非常にありがたいです。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問