source: branches/camp/camp-2_5-E/data/class/helper/SC_Helper_CSV.php @ 19549

Revision 19549, 16.4 KB checked in by Yammy, 12 years ago (diff)

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