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<= 0return 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($arrOutputColstruearray('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<= 0return 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.                                   => 'product',
  350.                                   => 'customer',
  351.                                   => 'order',
  352.                                   => 'campaign',
  353.                                   => 'category'
  354.                                   );
  355.  
  356.         $this->arrSubnaviName = array(
  357.                                       => '商品管理',
  358.                                       => '顧客管理',
  359.                                       => '受注管理',
  360.                                       => 'キャンペーン',
  361.                                       => 'カテゴリ'
  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.         ifstrlen($delimiter!= {
  413.             trigger_error('delimiter must be a single character'E_USER_WARNING);
  414.             return "";
  415.         }
  416.         
  417.         ifstrlen($enclosure{
  418.             trigger_error('enclosure must be a single character'E_USER_WARNING);
  419.             return "";
  420.         }
  421.         
  422.         foreach (array_keys($fieldsas $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($delimiterpreg_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