Page
[ class tree: Page ] [ index: Page ] [ all elements ]

Source for file SC_Helper_CSV.php

Documentation is available at SC_Helper_CSV.php

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

Documentation generated on Fri, 24 Feb 2012 14:00:11 +0900 by Seasoft