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

Revision 18781, 15.5 KB checked in by miningbrownie, 11 years ago (diff)

php5.3に向けてeregをpregに

  • 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 = "", $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                "convert"
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        $dataRows = $objQuery->select(
135             SC_Utils_Ex::sfGetCommaList($arrOutputCols, true, array('category_id'))
136            ,'vw_product_class AS prdcls'
137            ,$where
138            ,$arrval
139        );
140       
141        // 規格分類名一覧
142        if (in_array('classcategory_id1', $arrOutputCols) || in_array('classcategory_id2', $arrOutputCols)) {
143            $objDb = new SC_Helper_DB_Ex();
144            $arrClassCatName = $objDb->sfGetIDValueList("dtb_classcategory", "classcategory_id", "name");
145        }
146
147        $outputArray = array();
148       
149        // ヘッダ行
150        $outputArray[] = $arrOutput['disp_name'];
151       
152        $objQuery = new SC_Query();
153        // データ行
154        foreach ($dataRows as $row) {
155            // 規格名1
156            if (in_array('classcategory_id1', $arrOutputCols)) {
157                $row['classcategory_id1'] = $arrClassCatName[$row['classcategory_id1']];
158            }
159
160            // 規格名2
161            if (in_array('classcategory_id2', $arrOutputCols)) {
162                $row['classcategory_id2'] = $arrClassCatName[$row['classcategory_id2']];
163            }
164
165            // カテゴリID
166            if (in_array('category_id', $arrOutputCols)) {
167                $row['category_id'] = $objQuery->getCol("dtb_product_categories",
168                                  "category_id",
169                                  "product_id = ?",
170                                  array($row['product_id']));
171            }
172
173            $outputArray[] = $row;
174        }
175       
176        // CSVを送信する。
177        $this->lfDownloadCsv($outputArray);
178       
179        // 成功終了
180        return true;
181    }
182
183    // CSV出力データを作成する。(レビュー)
184    function lfGetReviewCSV($where, $option, $arrval) {
185
186        $from = "dtb_review AS A INNER JOIN dtb_products AS B on A.product_id = B.product_id ";
187        $cols = SC_Utils_Ex::sfGetCommaList($this->arrREVIEW_CVSCOL);
188
189        $objQuery = new SC_Query();
190        $objQuery->setOption($option);
191
192        $list_data = $objQuery->select($cols, $from, $where, $arrval);
193
194        $max = count($list_data);
195        if (!isset($data)) $data = "";
196        for($i = 0; $i < $max; $i++) {
197            // 各項目をCSV出力用に変換する。
198            $data .= $this->lfMakeReviewCSV($list_data[$i]);
199        }
200        return $data;
201    }
202
203    // CSV出力データを作成する。(トラックバック)
204    function lfGetTrackbackCSV($where, $option, $arrval) {
205        $from = "dtb_trackback AS A INNER JOIN dtb_products AS B on A.product_id = B.product_id ";
206        $cols = SC_Utils_Ex::sfGetCommaList($this->arrTRACKBACK_CVSCOL);
207
208        $objQuery = new SC_Query();
209        $objQuery->setOption($option);
210
211        $list_data = $objQuery->select($cols, $from, $where, $arrval);
212
213        $max = count($list_data);
214        if (!isset($data)) $data = "";
215        for($i = 0; $i < $max; $i++) {
216            // 各項目をCSV出力用に変換する。
217            $data .= $this->lfMakeTrackbackCSV($list_data[$i]);
218        }
219        return $data;
220    }
221
222    // CSVを送信する。(カテゴリ)
223    function sfDownloadCategoryCsv() {
224
225        // CSV出力タイトル行の作成
226        $arrOutput = SC_Utils_Ex::sfSwapArray($this->sfgetCsvOutput(5, 'status = 1'));
227        if (count($arrOutput) <= 0) return false; // 失敗終了
228        $arrOutputCols = $arrOutput['col'];
229
230        $objQuery = new SC_Query();
231        $objQuery->setOrder('rank DESC');
232
233        $dataRows = $objQuery->select(
234             SC_Utils_Ex::sfGetCommaList($arrOutputCols)
235            ,'dtb_category'
236            ,'del_flg = 0'
237        );
238       
239        $outputArray = array();
240       
241        // ヘッダ行
242        $outputArray[] = $arrOutput['disp_name'];
243       
244        // データ行
245        foreach ($dataRows as $row) {
246            $outputArray[] = $row;
247        }
248       
249        // CSVを送信する。
250        $this->lfDownloadCsv($outputArray, 'category');
251       
252        // 成功終了
253        return true;
254    }
255
256    // CSV出力データを作成する。
257    function lfGetCSV($from, $where, $option, $arrval, $arrCsvOutputCols = "", $arrCsvOutputConverts = array()) {
258
259        $cols = SC_Utils_Ex::sfGetCommaList($arrCsvOutputCols);
260
261        $objQuery = new SC_Query();
262        $objQuery->setOption($option);
263
264        $list_data = $objQuery->select($cols, $from, $where, $arrval, DB_FETCHMODE_ORDERED);
265
266        $csv = '';
267        foreach ($list_data as $row) {
268            $row = SC_Utils_Ex::mbConvertKanaWithArray($row, $arrCsvOutputConverts);
269            // 各項目をCSV出力用に変換する。
270            $line = $this->sfArrayToCsv($row);
271            $csv .= "$line\r\n";
272        }
273        return $csv;
274    }
275
276    // 各項目をCSV出力用に変換する。
277    function lfMakeCSV($list) {
278        $line = "";
279       
280        foreach($list as $key => $val) {
281            $tmp = "";
282            switch($key) {
283                case 'order_pref':
284                case 'deliv_pref':
285                    $tmp = $this->arrPref[$val];
286                    break;
287                default:
288                    $tmp = $val;
289                    break;
290            }
291
292            $tmp = preg_replace('/[",]/', " ", $tmp);
293            $line .= "\"".$tmp."\",";
294        }
295        // 文末の","を変換
296        $line = $this->replaceLineSuffix($line);
297        return $line;
298    }
299
300    // 各項目をCSV出力用に変換する。(レビュー)
301    function lfMakeReviewCSV($list) {
302        $line = "";
303
304        foreach($list as $key => $val) {
305            $tmp = "";
306            switch($key) {
307            case 'sex':
308                $tmp = isset($this->arrSex[$val]) ? $this->arrSex[$val] : "";
309                break;
310            case 'recommend_level':
311                $tmp = isset($this->arrRECOMMEND[$val]) ? $this->arrRECOMMEND[$val]
312                                                        : "";
313                break;
314            case 'status':
315                $tmp = isset($this->arrDISP[$val]) ? $this->arrDISP[$val] : "";
316                break;
317            default:
318                $tmp = $val;
319                break;
320            }
321
322            $tmp = preg_replace('/[",]/', " ", $tmp);
323            $line .= "\"".$tmp."\",";
324        }
325        // 文末の","を変換
326        $line = $this->replaceLineSuffix($line);
327        return $line;
328    }
329
330    // 各項目をCSV出力用に変換する。(トラックバック)
331    function lfMakeTrackbackCSV($list) {
332
333        $line = "";
334
335        foreach($list as $key => $val) {
336            $tmp = "";
337            switch($key) {
338            case 'status':
339                $tmp = $this->arrTrackBackStatus[$val];
340                break;
341            default:
342                $tmp = $val;
343                break;
344            }
345
346            $tmp = preg_replace('/[",]/', " ", $tmp);
347            $line .= "\"".$tmp."\",";
348        }
349        // 文末の","を変換
350        $line = $this->replaceLineSuffix($line);
351        return $line;
352    }
353
354    /**
355     * 行末の ',' を CRLF へ変換する.
356     *
357     * @access private
358     * @param string $line CSV出力用の1行分の文字列
359     * @return string 行末の ',' を CRLF に変換した文字列
360     */
361    function replaceLineSuffix($line) {
362//        return mb_ereg_replace(",$", "\r\n", $line); 
363        return preg_replace('/,$/',"\r\n",$line);
364    }
365
366    /**
367     * 項目情報を初期化する.
368     *
369     * @access private
370     * @return void
371     */
372    function init() {
373        $this->arrSubnavi = array(
374                                  1 => 'product',
375                                  2 => 'customer',
376                                  3 => 'order',
377                                  4 => 'campaign',
378                                  5 => 'category'
379                                  );
380
381        $this->arrSubnaviName = array(
382                                      1 => '商品管理',
383                                      2 => '顧客管理',
384                                      3 => '受注管理',
385                                      4 => 'キャンペーン',
386                                      5 => 'カテゴリ'
387                                      );
388
389
390        $this->arrREVIEW_CVSCOL = array(
391                                        'B.name',
392                                        'A.status',
393                                        'A.create_date',
394                                        'A.reviewer_name',
395                                        'A.sex',
396                                        'A.recommend_level',
397                                        'A.title',
398                                        'A.comment'
399                                        );
400
401        $this->arrREVIEW_CVSTITLE = array(
402                                          '商品名',
403                                          'レビュー表示',
404                                          '投稿日',
405                                          '投稿者名',
406                                          '性別',
407                                          'おすすめレベル',
408                                          'タイトル',
409                                          'コメント'
410                                          );
411
412        $this->arrTRACKBACK_CVSTITLE = array(
413                                             '商品名',
414                                             'ブログ名',
415                                             'ブログ記事タイトル',
416                                             'ブログ記事内容',
417                                             '状態',
418                                             '投稿日'
419                                             );
420
421        $this->arrTRACKBACK_CVSCOL = array(
422                                           'B.name',
423                                           'A.blog_name',
424                                           'A.title',
425                                           'A.excerpt',
426                                           'A.status',
427                                           'A.create_date'
428                                           );
429    }
430   
431    /**
432     * 1次元配列を1行のCSVとして返す
433     * 参考: http://jp.php.net/fputcsv
434     */
435    function sfArrayToCsv($fields, $delimiter = ',', $enclosure = '"', $arrayDelimiter = '|') {
436       
437        if( strlen($delimiter) != 1 ) {
438            trigger_error('delimiter must be a single character', E_USER_WARNING);
439            return "";
440        }
441       
442        if( strlen($enclosure) < 1 ) {
443            trigger_error('enclosure must be a single character', E_USER_WARNING);
444            return "";
445        }
446       
447        foreach (array_keys($fields) as $key) {
448            $field =& $fields[$key];
449           
450            // 配列を「|」区切りの文字列に変換する
451            if (is_array($field)) {
452                $field = implode($arrayDelimiter, $field);
453            }
454           
455            /* enclose a field that contains a delimiter, an enclosure character, or a newline */
456            if (
457                   is_string($field)
458                && preg_match('/[' . preg_quote($delimiter) . preg_quote($enclosure) . '\\s]/', $field)
459            ) {
460                $field = $enclosure . preg_replace('/' . preg_quote($enclosure) . '/', $enclosure . $enclosure, $field) . $enclosure;
461            }
462        }
463       
464        return implode($delimiter, $fields);
465    }
466   
467    /**
468     * CSVを送信する。
469     */
470    function lfDownloadCsv($arrayData, $prefix = ""){
471
472        if($prefix == "") {
473            $dir_name = SC_Utils::sfUpDirName();
474            $file_name = $dir_name . date("ymdHis") .".csv";
475        } else {
476            $file_name = $prefix . date("ymdHis") .".csv";
477        }
478
479        /* HTTPヘッダの出力 */
480        Header("Content-disposition: attachment; filename=${file_name}");
481        Header("Content-type: application/octet-stream; name=${file_name}");
482        Header("Cache-Control: ");
483        Header("Pragma: ");
484
485        /* データを出力 */
486        foreach ($arrayData as $lineArray) {
487            $lineString = $this->sfArrayToCsv($lineArray);
488            $lineString = mb_convert_encoding($lineString, 'SJIS-Win');
489            echo $lineString . "\r\n";
490        }
491    }
492}
493?>
Note: See TracBrowser for help on using the repository browser.