cakephp2.doc_080
最終投稿日:2019年11月20日
【概要】
モデルを検索し、内容をCSV出力します。
サーバ保存・ダウンロードどちらにも対応しています。
[ Controller ]
public function index() {
//ダウンロードの場合は描画を止める
$this->autoRender = false;
$this->User->recursive = 0;
$datas = $this->User->find("all",array("conditions"=>array()));
$cavPrams = array();
$cavPrams["jp"] = array(
"ID","アカウント名","パスワード","氏名","フリガナ","有効フラグ","登録日","更新日");
$cavPrams["title"] = true;
$cavPrams["path"] = array("C:/xampp/htdocs/cakephp258/app/tmp/","hoge");
$cavPrams["quart"] = true;
$cavPrams["encode"] = "SJIS";
/********************************************************************************************
* 第1引数
* 通常のfind all で取得したテーブルデータ $data[0]["User"]["id"]
* 第2引数 連想配列
* ["jp"] = array() 存在する場合は、1行目に日本語タイトルを使用する
* ["title"] = bool false で1行目からデータ行とする(デフォルト true)
* ["path"] = ファイル保存先(第1 = / で終わる,第2 = 拡張子なし) 第1="" の場合はダウンロードとなる
* ["quart"] = bool ture で項目を『"』で囲う(デフォルト true)
* ["encode"] = string UTF8から変換したい文字コード指定(例:SJIS)
*
* 【注意】
* ダウンロードの場合は、Controller 側で『$this->autoRender = false;』する事
*********************************************************************************************/
$this->MyCsvCreate->createCsv($datas,$cavPrams);
}
[ Component ]
class MyCsvCreateComponent extends Component {
//csv1行目タイトル
private $title = "";
//csvデータ部分
private $csvData = "";
public function initialize(Controller $controller) {
$this->controller = $controller;
}
/******************************************************************************************
* CSVデータを作成する(テーブル結合しても大丈夫!)
*
* 第1引数
* 通常のfind all で取得したテーブルデータ $data[0]["User"]["id"]
* 第2引数 連想配列
* ["jp"] = array() 存在する場合は、1行目に日本語タイトルを使用する
* ["title"] = bool false で1行目からデータ行とする(デフォルト true)
* ["path"] = ファイル保存先(第1 = / で終わる,第2 = 拡張子なし)
* ※ 第1が存在しない場合はダウンロードとなる
* ["quart"] = bool ture で項目を『"』で囲う(デフォルト true)
* ["encode"]= string UTF8から変換したい文字コード指定(例:SJIS)
*
* 【注意】
* ダウンロードの場合は、Controller 側で『$this->autoRender = false;』する事
********************************************************************************************/
function createCsv($datas = array(),$cavPrams = array()){
########################
# ファイルポインタ生成
if(!empty($cavPrams["path"][0]) && !empty($cavPrams["path"][1])){
$buf = fopen($cavPrams["path"][0].$cavPrams["path"][1].".csv","w");
}else{
//書き込み可のモード (w+) でユニークな名前を有するテンポラリファイルを作成
$buf = tmpfile();
}
########################
# 1行目タイトル作成
//1行目はタイトル
if(!isset($cavPrams["title"]) || $cavPrams["title"] == true){
//タイトルは日本語
if(isset($cavPrams["jp"])){
foreach($cavPrams["jp"] as $val){
if(!isset($cavPrams["quart"]) || $cavPrams["quart"] == true){
//『"』で囲う
$val = $this->quartPlus($val);
}
$this->title .= $val.",";
}
//タイトルは英語
}else{
foreach($datas[0] as $line){
foreach($line as $key => $val){
if(!isset($cavPrams["quart"]) || $cavPrams["quart"] == true){
$key = $this->quartPlus($key);
}
$this->title .= $key.",";
}
}
}
$this->title = substr($this->title,0,-1);
if(isset($cavPrams["encode"])){
fputs($buf,mb_convert_encoding($this->title,$cavPrams["encode"],"UTF-8")."\n");
}else{
fputs($buf,$this->title."\n");
}
}
########################
# 1行目以降データ作成
foreach($datas as $lines){
foreach($lines as $line){
foreach($line as $val){
if(!isset($cavPrams["quart"]) || $cavPrams["quart"] == true){
//『"』で囲う
$val = $this->quartPlus($val);
}
$this->csvData .= $val.",";
}
}
$this->csvData = substr($this->csvData,0,-1);
if(isset($cavPrams["encode"])){
fputs($buf,mb_convert_encoding($this->csvData,$cavPrams["encode"],"UTF-8")."\n");
}else{
fputs($buf,$this->csvData."\n");
}
$this->csvData = "";
}
#########################
# ダウンロードの場合処理
if(empty($cavPrams["path"][0]) && !empty($cavPrams["path"][1])){
//オープンしたファイルポインタからファイルに関する情報を得ます
$stat = fstat($buf);
$this->layout = false;
configure::write('debug', 0);
header("Cache-Control:private");
header("Pragma:private");
header("Content-Type: " . 'application/x-csv');
header("Content-length: " . $stat['size']);
header("Content-Disposition: attachment; filename=" . $cavPrams["path"][1].'.csv');
//引数で指定したファイルポインタの位置を先頭に戻します
rewind($buf);
//fopen()関数 で開いたファイルの全部を出力します
fpassthru($buf);
}
//ファイルクローズ
fclose($buf);
}
/**********************************
* 『"』で囲う
**********************************/
function quartPlus($val){
return "\"".$val."\"";
}
}
[ View ]
<?php echo $this->Form->create("User",array("controller"=>"users","action"=>"index")); ?>
<?php echo $this->Form->end("CSV"); ?>
※ダウンロードの場合は、他のアクションから SUBMIT してやればOK!