Source for file SC_Helper_CSV.php

Documentation is available at SC_Helper_CSV.php

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

Documentation generated on Tue, 28 Apr 2009 18:13:24 +0900 by phpDocumentor 1.4.2