source: branches/version-2_5-dev/data/class/helper/SC_Helper_CSV.php @ 20207

Revision 20207, 16.9 KB checked in by ume, 10 years ago (diff)

#973 [管理画面]商品管理 CSV処理の修正 ※ チェックボックスにチェックを入れた時の値の受け渡しができていない。(受注管理も同様)

  • Property svn:eol-style set to LF
  • Property svn:keywords set to Id
  • Property svn:mime-type set to text/x-httpd-php; charset=UTF-8
Line 
1<?php
2  /*
3   * Copyright(c) 2000-2010 LOCKON CO.,LTD. All Rights Reserved.
4   *
5   * http://www.lockon.co.jp/
6   */
7
8  /**
9   * CSV 関連 のヘルパークラス.
10   *
11   * @package Page
12   * @author LOCKON CO.,LTD.
13   * @version $Id$
14   */
15class SC_Helper_CSV {
16
17    // {{{ properties
18
19    /** 項目英名 */
20    var $arrSubnavi;
21
22    /** 項目名 */
23    var $arrSubnaviName;
24
25    /** レビュー管理項目 */
26    var $arrREVIEW_CVSCOL;
27
28    /** レビュータイトル */
29    var $arrREVIEW_CVSTITLE;
30
31    /** トラックバック項目 */
32    var $arrTRACKBACK_CVSCOL;
33
34    /** トラックバックタイトル */
35    var $arrTRACKBACK_CVSTITLE;
36
37
38    // }}}
39    // {{{ constructor
40
41    /**
42     * デフォルトコンストラクタ.
43     */
44    function SC_Helper_CSV() {
45        $this->init();
46
47        $masterData = new SC_DB_MasterData_Ex();
48        $this->arrPref = $masterData->getMasterData('mtb_pref');
49        $this->arrSex = $masterData->getMasterData("mtb_sex");
50        $this->arrDISP = $masterData->getMasterData("mtb_disp");
51        $this->arrRECOMMEND = $masterData->getMasterData("mtb_recommend");
52    }
53
54    // }}}
55    // {{{ functions
56
57    /**
58     * CSV 項目を出力する.
59     *
60     * @param integer $csv_id CSV ID
61     * @param string $where SQL の WHERE 句
62     * @param array $arrVal WHERE 句の要素
63     * @param array $order SQL の ORDER BY 句
64     * @return array CSV 項目の配列
65     */
66    function sfGetCsvOutput($csv_id = "", $where = '', $arrVal = array(), $order = 'rank, no'){
67        $objQuery =& SC_Query::getSingletonInstance();
68       
69        $cols = 'no, csv_id, col, disp_name, rank, status, rw_flg, mb_convert_kana_option, size_const_type, error_check_types';
70        $table = 'dtb_csv';
71       
72        if(SC_Utils_Ex::sfIsInt($csv_id)){
73            if($where == "") {
74                $where = "csv_id = ?";
75            }else{
76                $where = "$where AND csv_id = ?";
77            }
78            $arrVal[] = $csv_id;
79        }
80        $objQuery->setOrder($order);
81       
82        $arrRet = $objQuery->select($cols, $table, $where, $arrVal);
83        return $arrRet;
84    }
85
86    // CSVを送信する。(共通。現状は受注のみ利用。)
87    function sfDownloadCsv($csv_id, $where, $arrval, $order) {
88        switch ($csv_id) {
89            case 3: // 受注
90                $from = 'dtb_order';
91                break;
92        }
93
94        // CSV出力タイトル行の作成
95        $arrCsvOutput = SC_Utils_Ex::sfSwapArray($this->sfGetCsvOutput($csv_id, 'status = ' . CSV_COLUMN_STATUS_FLG_ENABLE));
96
97        if (count($arrCsvOutput) <= 0) break;
98
99        $arrCsvOutputCols = $arrCsvOutput['col'];
100        $arrCsvOutputConvs = $arrCsvOutput['conv'];
101        $arrCsvOutputTitle = $arrCsvOutput['disp_name'];
102        $head = SC_Utils_Ex::sfGetCSVList($arrCsvOutputTitle);
103        $data = $objCSV->lfGetCSV("dtb_order", $where, $option, $arrval, $arrCsvOutputCols, $arrCsvOutputConvs);
104    }
105   
106    /**
107     * CSVが出力設定でインポート可能かのチェック
108     *
109     * @param array sfGetCsvOutputで取得した内容(またはそれと同等の配列)
110     * @return boolean true:インポート可能、false:インポート不可
111     */
112    function sfIsImportCSVFrame(&$arrCSVFrame) {
113        $result = true;
114        foreach($arrCSVFrame as $key => $val) {
115            if($val['status'] != CSV_COLUMN_STATUS_FLG_ENABLE
116                    and $val['rw_flg'] == CSV_COLUMN_RW_FLG_READ_WRITE
117                    and $val['error_check_types'] != ""
118                    and stripos($val['error_check_types'], "EXIST_CHECK") !== FALSE) {
119                //必須フィールド
120                $result = false;
121            }
122        }
123        return $result;
124    }
125   
126    /**
127     * CSVが出力設定で更新可能かのチェック
128     *
129     * @param array sfGetCsvOutputで取得した内容(またはそれと同等の配列)
130     * @return boolean true:更新可能、false:新規追加のみ不可
131     */
132    function sfIsUpdateCSVFrame(&$arrCSVFrame) {
133        $result = true;
134        foreach($arrCSVFrame as $key => $val) {
135            if($val['status'] != CSV_COLUMN_STATUS_FLG_ENABLE
136                    and $val['rw_flg'] == CSV_COLUMN_RW_FLG_KEY_FIELD) {
137                //キーフィールド
138                $result = false;
139            }
140        }
141        return $result;
142    }
143   
144    /**
145     * CSVファイルのカウント数を得る.
146     *
147     * @param resource $fp fopenを使用して作成したファイルポインタ
148     * @return integer CSV のカウント数
149     */
150    function sfGetCSVRecordCount($fp) {
151
152        $count = 0;
153        while(!feof($fp)) {
154            $arrCSV = fgetcsv($fp, CSV_LINE_MAX);
155            $count++;
156        }
157        // ファイルポインタを戻す
158        if (rewind($fp)) {
159            return $count-1;
160        } else {
161            return FALSE;
162        }
163    }
164
165    //  CSV作成 コールバック関数
166    function cbOutputProductCSV($data) {
167        $line = $this->sfArrayToCSV($data);
168        $line = mb_convert_encoding($line, 'SJIS-Win');
169        $line .= "\r\n";
170        fwrite($this->fpOutput, $line);
171        return true;
172    }
173
174    // CSV出力データを作成する。(レビュー)
175    function lfGetReviewCSV($where, $option, $arrval) {
176
177        $from = "dtb_review AS A INNER JOIN dtb_products AS B on A.product_id = B.product_id ";
178        $cols = SC_Utils_Ex::sfGetCommaList($this->arrREVIEW_CVSCOL);
179
180        $objQuery =& SC_Query::getSingletonInstance();
181        $objQuery->setOption($option);
182
183        $list_data = $objQuery->select($cols, $from, $where, $arrval);
184
185        $max = count($list_data);
186        if (!isset($data)) $data = "";
187        for($i = 0; $i < $max; $i++) {
188            // 各項目をCSV出力用に変換する。
189            $data .= $this->lfMakeReviewCSV($list_data[$i]);
190        }
191        return $data;
192    }
193
194    // CSV出力データを作成する。(トラックバック)
195    function lfGetTrackbackCSV($where, $option, $arrval) {
196        $from = "dtb_trackback AS A INNER JOIN dtb_products AS B on A.product_id = B.product_id ";
197        $cols = SC_Utils_Ex::sfGetCommaList($this->arrTRACKBACK_CVSCOL);
198
199        $objQuery =& SC_Query::getSingletonInstance();
200        $objQuery->setOption($option);
201
202        $list_data = $objQuery->select($cols, $from, $where, $arrval);
203
204        $max = count($list_data);
205        if (!isset($data)) $data = "";
206        for($i = 0; $i < $max; $i++) {
207            // 各項目をCSV出力用に変換する。
208            $data .= $this->lfMakeTrackbackCSV($list_data[$i]);
209        }
210        return $data;
211    }
212
213    // CSVを送信する。(カテゴリ)
214    function sfDownloadCategoryCsv() {
215
216        // CSV出力タイトル行の作成
217        $arrOutput = SC_Utils_Ex::sfSwapArray($this->sfGetCsvOutput(5, 'status = ' . CSV_COLUMN_STATUS_FLG_ENABLE));
218        if (count($arrOutput) <= 0) return false; // 失敗終了
219        $arrOutputCols = $arrOutput['col'];
220
221        $objQuery =& SC_Query::getSingletonInstance();
222        $objQuery->setOrder('rank DESC');
223
224        $dataRows = $objQuery->select(
225             SC_Utils_Ex::sfGetCommaList($arrOutputCols)
226            ,'dtb_category'
227            ,'del_flg = 0'
228        );
229       
230        $outputArray = array();
231       
232        // ヘッダ行
233        $outputArray[] = $arrOutput['disp_name'];
234       
235        // データ行
236        foreach ($dataRows as $row) {
237            $outputArray[] = $row;
238        }
239       
240        // CSVを送信する。
241        $this->lfDownloadCsv($outputArray, 'category');
242       
243        // 成功終了
244        return true;
245    }
246
247    // CSV出力データを作成する。
248    function lfGetCSV($from, $where, $option, $arrval, $arrCsvOutputCols = "", $arrCsvOutputConverts = array()) {
249
250        $cols = SC_Utils_Ex::sfGetCommaList($arrCsvOutputCols);
251
252        $objQuery =& SC_Query::getSingletonInstance();
253        $objQuery->setOption($option);
254
255        $list_data = $objQuery->select($cols, $from, $where, $arrval, MDB2_FETCHMODE_ORDERED);
256
257        $csv = '';
258        foreach ($list_data as $row) {
259            $row = SC_Utils_Ex::mbConvertKanaWithArray($row, $arrCsvOutputConverts);
260            // 各項目をCSV出力用に変換する。
261            $line = $this->sfArrayToCsv($row);
262            $csv .= "$line\r\n";
263        }
264        return $csv;
265    }
266
267    // 各項目をCSV出力用に変換する。
268    function lfMakeCSV($list) {
269        $line = "";
270       
271        foreach($list as $key => $val) {
272            $tmp = "";
273            switch($key) {
274                case 'order_pref':
275                case 'deliv_pref':
276                    $tmp = $this->arrPref[$val];
277                    break;
278                default:
279                    $tmp = $val;
280                    break;
281            }
282
283            $tmp = preg_replace('/[",]/', " ", $tmp);
284            $line .= "\"".$tmp."\",";
285        }
286        // 文末の","を変換
287        $line = $this->replaceLineSuffix($line);
288        return $line;
289    }
290
291    // 各項目をCSV出力用に変換する。(レビュー)
292    function lfMakeReviewCSV($list) {
293        $line = "";
294
295        foreach($list as $key => $val) {
296            $tmp = "";
297            switch($key) {
298            case 'sex':
299                $tmp = isset($this->arrSex[$val]) ? $this->arrSex[$val] : "";
300                break;
301            case 'recommend_level':
302                $tmp = isset($this->arrRECOMMEND[$val]) ? $this->arrRECOMMEND[$val]
303                                                        : "";
304                break;
305            case 'status':
306                $tmp = isset($this->arrDISP[$val]) ? $this->arrDISP[$val] : "";
307                break;
308            default:
309                $tmp = $val;
310                break;
311            }
312
313            $tmp = preg_replace('/[",]/', " ", $tmp);
314            $line .= "\"".$tmp."\",";
315        }
316        // 文末の","を変換
317        $line = $this->replaceLineSuffix($line);
318        return $line;
319    }
320
321    // 各項目をCSV出力用に変換する。(トラックバック)
322    function lfMakeTrackbackCSV($list) {
323
324        $line = "";
325
326        foreach($list as $key => $val) {
327            $tmp = "";
328            switch($key) {
329            case 'status':
330                $tmp = $this->arrTrackBackStatus[$val];
331                break;
332            default:
333                $tmp = $val;
334                break;
335            }
336
337            $tmp = preg_replace('/[",]/', " ", $tmp);
338            $line .= "\"".$tmp."\",";
339        }
340        // 文末の","を変換
341        $line = $this->replaceLineSuffix($line);
342        return $line;
343    }
344
345    /**
346     * 行末の ',' を CRLF へ変換する.
347     *
348     * @access private
349     * @param string $line CSV出力用の1行分の文字列
350     * @return string 行末の ',' を CRLF に変換した文字列
351     */
352    function replaceLineSuffix($line) {
353//        return mb_ereg_replace(",$", "\r\n", $line); 
354        return preg_replace('/,$/',"\r\n",$line);
355    }
356
357    /**
358     * 項目情報を初期化する.
359     *
360     * @access private
361     * @return void
362     */
363    function init() {
364        $this->arrSubnavi = array(
365                                  1 => 'product',
366                                  2 => 'customer',
367                                  3 => 'order',
368                                  4 => 'campaign',
369                                  5 => 'category'
370                                  );
371
372        $this->arrSubnaviName = array(
373                                      1 => '商品管理',
374                                      2 => '顧客管理',
375                                      3 => '受注管理',
376                                      4 => 'キャンペーン',
377                                      5 => 'カテゴリ'
378                                      );
379
380
381        $this->arrREVIEW_CVSCOL = array(
382                                        'B.name',
383                                        'A.status',
384                                        'A.create_date',
385                                        'A.reviewer_name',
386                                        'A.sex',
387                                        'A.recommend_level',
388                                        'A.title',
389                                        'A.comment'
390                                        );
391
392        $this->arrREVIEW_CVSTITLE = array(
393                                          '商品名',
394                                          'レビュー表示',
395                                          '投稿日',
396                                          '投稿者名',
397                                          '性別',
398                                          'おすすめレベル',
399                                          'タイトル',
400                                          'コメント'
401                                          );
402
403        $this->arrTRACKBACK_CVSTITLE = array(
404                                             '商品名',
405                                             'ブログ名',
406                                             'ブログ記事タイトル',
407                                             'ブログ記事内容',
408                                             '状態',
409                                             '投稿日'
410                                             );
411
412        $this->arrTRACKBACK_CVSCOL = array(
413                                           'B.name',
414                                           'A.blog_name',
415                                           'A.title',
416                                           'A.excerpt',
417                                           'A.status',
418                                           'A.create_date'
419                                           );
420    }
421   
422    /**
423     * 1次元配列を1行のCSVとして返す
424     * 参考: http://jp.php.net/fputcsv
425     */
426    function sfArrayToCsv($fields, $delimiter = ',', $enclosure = '"', $arrayDelimiter = '|') {
427       
428        if( strlen($delimiter) != 1 ) {
429            trigger_error('delimiter must be a single character', E_USER_WARNING);
430            return "";
431        }
432       
433        if( strlen($enclosure) < 1 ) {
434            trigger_error('enclosure must be a single character', E_USER_WARNING);
435            return "";
436        }
437       
438        foreach (array_keys($fields) as $key) {
439            $field =& $fields[$key];
440           
441            // 配列を「|」区切りの文字列に変換する
442            if (is_array($field)) {
443                $field = implode($arrayDelimiter, $field);
444            }
445           
446            /* enclose a field that contains a delimiter, an enclosure character, or a newline */
447            if (
448                   is_string($field)
449                && preg_match('/[' . preg_quote($delimiter) . preg_quote($enclosure) . '\\s]/', $field)
450            ) {
451                $field = $enclosure . preg_replace('/' . preg_quote($enclosure) . '/', $enclosure . $enclosure, $field) . $enclosure;
452            }
453        }
454       
455        return implode($delimiter, $fields);
456    }
457   
458    /**
459     * CSVを送信する。
460     */
461    function lfDownloadCsv($arrayData, $prefix = ""){
462
463        if($prefix == "") {
464            $dir_name = SC_Utils::sfUpDirName();
465            $file_name = $dir_name . date("ymdHis") .".csv";
466        } else {
467            $file_name = $prefix . date("ymdHis") .".csv";
468        }
469
470        /* HTTPヘッダの出力 */
471        Header("Content-disposition: attachment; filename=${file_name}");
472        Header("Content-type: application/octet-stream; name=${file_name}");
473        Header("Cache-Control: ");
474        Header("Pragma: ");
475
476        /* データを出力 */
477        foreach ($arrayData as $lineArray) {
478            $lineString = $this->sfArrayToCsv($lineArray);
479            $lineString = mb_convert_encoding($lineString, 'SJIS-Win');
480            echo $lineString . "\r\n";
481        }
482    }
483   
484    /**
485     * CSVファイルを送信する。
486     */
487    function lfDownloadCSVFile($filepath, $prefix = "") {
488        $file_name = $prefix . date("YmdHis") . ".csv";
489       
490        /* HTTPヘッダの出力 */
491        Header("Content-disposition: attachment; filename=${file_name}");
492        Header("Content-type: application/octet-stream; name=${file_name}");
493        Header("Cache-Control: ");
494        Header("Pragma: ");
495       
496        /* データを出力 */
497        // file_get_contentsはメモリマッピングも自動的に使ってくれるので高速&省メモリ
498        echo file_get_contents($filepath);
499    }
500
501    /**
502     * CSVデータを取得する。
503     */
504    function lfGetCsv2($arrayData, $prefix = "") {
505
506        if($prefix == "") {
507            $dir_name = SC_Utils::sfUpDirName();
508            $file_name = $dir_name . date("ymdHis") .".csv";
509        } else {
510            $file_name = $prefix . date("ymdHis") .".csv";
511        }
512
513        /* データを出力 */
514        foreach ($arrayData as $lineArray) {
515            $lineString = $this->sfArrayToCsv($lineArray);
516            $lineString = mb_convert_encoding($lineString, 'SJIS-Win');
517            $lineString .= "\r\n";
518        }
519        return array($file_name, $lineString);
520    }
521}
522?>
Note: See TracBrowser for help on using the repository browser.