Source for file SC_Helper_CSV.php
Documentation is available at SC_Helper_CSV.php
* Copyright(c) 2000-2011 LOCKON CO.,LTD. All Rights Reserved.
* http://www.lockon.co.jp/
* @author LOCKON CO.,LTD.
* @version $Id: SC_Helper_CSV.php 21118 2011-08-03 12:28:10Z kajiwara $
* @param integer $csv_id CSVフォーマットID
* @param string $where WHERE条件文
* @param array $arrVal プリペアドステートメントの実行時に使用される配列。配列の要素数は、クエリ内のプレースホルダの数と同じでなければなりません。
* @param string $order ORDER文
* @param boolean $is_download true:ダウンロード用出力までさせる false:CSVの内容を返す(旧方式、メモリを食います。)
* @return mixed $is_download = true時 成功失敗フラグ(boolean) 、$is_downalod = false時 string
function sfDownloadCsv($csv_id, $where = "", $arrVal = array(), $order = "", $is_download = false) {
$arrOutput = SC_Utils_Ex::sfSwapArray($this->sfGetCsvOutput($csv_id, 'status = ' . CSV_COLUMN_STATUS_FLG_ENABLE));
if (count($arrOutput) <= 0) return false; // 失敗終了
$arrOutputCols = $arrOutput['col'];
$objQuery = & SC_Query_Ex::getSingletonInstance();
$objQuery->setOrder($order);
$cols = SC_Utils_Ex::sfGetCommaList($arrOutputCols, true);
// TODO: 固有処理 なんかエレガントな処理にしたい
$objProduct = new SC_Product_Ex();
// このWhereを足さないと無効な規格も出力される。現行仕様と合わせる為追加。
$inner_where = 'dtb_products_class.del_flg = 0';
$sql = $objQuery->getSql($cols, $objProduct->prdclsSQL($inner_where),$where);
}else if($csv_id == '2') {
$sql = "SELECT " . $cols . " FROM dtb_customer " . $where;
}else if($csv_id == '3') {
$sql = "SELECT " . $cols . " FROM dtb_order " . $where;
}else if($csv_id == '4') {
$sql = "SELECT " . $cols . " FROM dtb_review AS A INNER JOIN dtb_products AS B on A.product_id = B.product_id " . $where;
}else if($csv_id == '5') {
$sql = "SELECT " . $cols . " FROM dtb_category " . $where;
* @param integer $csv_id CSV ID
* @param string $where SQL の WHERE 句
* @param array $arrVal WHERE 句の要素
* @param array $order SQL の ORDER BY 句
* @return array CSV 項目の配列
function sfGetCsvOutput($csv_id = "", $where = '', $arrVal = array(), $order = 'rank, no'){
$objQuery = & SC_Query_Ex::getSingletonInstance();
$cols = 'no, csv_id, col, disp_name, rank, status, rw_flg, mb_convert_kana_option, size_const_type, error_check_types';
if(SC_Utils_Ex::sfIsInt($csv_id)){
$where = "$where AND csv_id = ?";
$objQuery->setOrder($order);
$arrRet = $objQuery->select($cols, $table, $where, $arrVal);
* @param array sfGetCsvOutputで取得した内容(またはそれと同等の配列)
* @return boolean true:インポート可能、false:インポート不可
foreach($arrCSVFrame as $key => $val) {
if($val['status'] != CSV_COLUMN_STATUS_FLG_ENABLE
and $val['rw_flg'] == CSV_COLUMN_RW_FLG_READ_WRITE
and $val['error_check_types'] != ""
* @param array sfGetCsvOutputで取得した内容(またはそれと同等の配列)
* @return boolean true:更新可能、false:新規追加のみ不可
foreach($arrCSVFrame as $key => $val) {
if($val['status'] != CSV_COLUMN_STATUS_FLG_ENABLE
and $val['rw_flg'] == CSV_COLUMN_RW_FLG_KEY_FIELD) {
* @param resource $fp fopenを使用して作成したファイルポインタ
* @return integer CSV のカウント数
$arrCSV = fgetcsv($fp, CSV_LINE_MAX);
* CSV作成 テンポラリファイル出力 コールバック関数
* @param mixed $data 出力データ
* @return boolean true (true:固定 false:中断)
$line = $this->sfArrayToCSV($data);
$line = mb_convert_encoding($line, 'SJIS-Win');
fwrite($this->fpOutput, $line);
* SQL文からクエリ実行し CSVファイルを送信する
* @param integer $sql SQL文
* @param array $arrVal プリペアドステートメントの実行時に使用される配列。配列の要素数は、クエリ内のプレースホルダの数と同じでなければなりません。
* @param string $file_head ファイル名の頭に付ける文字列
* @param array $arrHeader ヘッダ出力列配列
* @param boolean $is_download true:ダウンロード用出力までさせる false:CSVの内容を返す(旧方式、メモリを食います。)
* @return mixed $is_download = true時 成功失敗フラグ(boolean) 、$is_downalod = false時 string
function sfDownloadCsvFromSql($sql, $arrVal = array(), $file_head = 'csv', $arrHeader = array(), $is_download = false) {
$objQuery = & SC_Query_Ex::getSingletonInstance();
$header = $this->sfArrayToCSV($arrHeader);
$header = mb_convert_encoding($header, 'SJIS-Win');
// TODO: パフォーマンス向上には、ストリームを使うようにすると良い
// 環境要件がPHPバージョン5.1以上になったら使うように変えても良いかと
// fopen('php://temp/maxmemory:'. (5*1024*1024), 'r+');
$tmp_filename = tempnam(CSV_TEMP_REALDIR, $file_head . '_csv');
$this->fpOutput = fopen($tmp_filename, "w+");
fwrite($this->fpOutput, $header);
$objQuery->doCallbackAll(array(&$this, 'cbOutputCSV'), $sql, $arrVal);
$res = SC_Utils_Ex::sfReadFile($tmp_filename);
* 参考: http://jp.php.net/fputcsv
* @param array $fields データ1次元配列
* @param string $delimiter
* @param string $enclosure
* @param string $arrayDelimiter
function sfArrayToCsv($fields, $delimiter = ',', $enclosure = '"', $arrayDelimiter = '|') {
if( strlen($delimiter) != 1 ) {
trigger_error('delimiter must be a single character', E_USER_WARNING);
if( strlen($enclosure) < 1 ) {
trigger_error('enclosure must be a single character', E_USER_WARNING);
$field = implode($arrayDelimiter, $field);
/* enclose a field that contains a delimiter, an enclosure character, or a newline */
$field = $enclosure . preg_replace('/' . preg_quote($enclosure) . '/', $enclosure . $enclosure, $field) . $enclosure;
return implode($delimiter, $fields);
* @param array $fields データ配列
$dir_name = SC_Utils_Ex::sfUpDirName();
$file_name = $dir_name . date('ymdHis') . ".csv";
$file_name = $prefix . date('ymdHis') . ".csv";
Header("Content-disposition: attachment; filename=${file_name}");
Header("Content-type: application/octet-stream; name=${file_name}");
Header("Cache-Control: ");
foreach ($arrData as $lineArray) {
$lineString = mb_convert_encoding($lineString, 'SJIS-Win');
echo $lineString . "\r\n";
* @param string $filepath 送信するファイルのフルパス
$file_name = $prefix . date('YmdHis') . ".csv";
Header("Content-disposition: attachment; filename=${file_name}");
Header("Content-type: application/octet-stream; name=${file_name}");
Header("Cache-Control: ");
// file_get_contentsはメモリマッピングも自動的に使ってくれるので高速&省メモリ
Documentation generated on Fri, 24 Feb 2012 14:02:38 +0900 by Seasoft
|