[Svn-src-all:1390] [version-2_5-dev 20280] #973 (リファクタリング[管理画面]商品管理) のうちCSVに関連する所について、 #657 (CSVダウンロードの改善)関連の修正。

AMUAMU admin @ mail.ec-cube.net
2011年 2月 21日 (月) 02:00:17 JST


Subversion committed to /home/svn/open 20280
http://svn.ec-cube.net/open_trac/changeset/20280
┌────────────────────────────┐
│更新者 :  AMUAMU                                       │
│更新日時:  2011-02-21 02:00:17 +0900 (月, 21  2月 2011)│
└────────────────────────────┘

Log:
--------------------------------------------------------
#973 (リファクタリング[管理画面]商品管理) のうちCSVに関連する所について、 #657 (CSVダウンロードの改善)関連の修正。

Changed:                      [U:修正,A:追加,D:削除]
--------------------------------------------------------
U   branches/version-2_5-dev/data/class/helper/SC_Helper_CSV.php
U   branches/version-2_5-dev/data/class/pages/admin/products/LC_Page_Admin_Products.php

変更: branches/version-2_5-dev/data/class/helper/SC_Helper_CSV.php
===================================================================
--- branches/version-2_5-dev/data/class/helper/SC_Helper_CSV.php	2011-02-20 16:39:53 UTC (rev 20279)
+++ branches/version-2_5-dev/data/class/helper/SC_Helper_CSV.php	2011-02-20 17:00:17 UTC (rev 20280)
@@ -49,6 +49,51 @@
     // {{{ functions
 
     /**
+     * 項目情報を初期化する.
+     *
+     * @access private
+     * @return void
+     */
+    function init() {
+        $this->arrSubnavi = array(
+                                  1 => 'product',
+                                  2 => 'customer',
+                                  3 => 'order',
+                                  5 => 'category'
+                                  );
+
+        $this->arrSubnaviName = array(
+                                      1 => '商品管理',
+                                      2 => '顧客管理',
+                                      3 => '受注管理',
+                                      5 => 'カテゴリ'
+                                      );
+
+
+        $this->arrREVIEW_CVSCOL = array(
+                                        'B.name',
+                                        'A.status',
+                                        'A.create_date',
+                                        'A.reviewer_name',
+                                        'A.sex',
+                                        'A.recommend_level',
+                                        'A.title',
+                                        'A.comment'
+                                        );
+
+        $this->arrREVIEW_CVSTITLE = array(
+                                          '商品名',
+                                          'レビュー表示',
+                                          '投稿日',
+                                          '投稿者名',
+                                          '性別',
+                                          'おすすめレベル',
+                                          'タイトル',
+                                          'コメント'
+                                          );
+    }
+
+    /**
      * CSV 項目を出力する.
      *
      * @param integer $csv_id CSV ID
@@ -77,26 +122,7 @@
         return $arrRet;
     }
 
-    // CSVを送信する。(共通。現状は受注のみ利用。)
-    function sfDownloadCsv($csv_id, $where, $arrval, $order) {
-        switch ($csv_id) {
-            case 3: // 受注
-                $from = 'dtb_order';
-                break;
-        }
 
-        // CSV出力タイトル行の作成
-        $arrCsvOutput = SC_Utils_Ex::sfSwapArray($this->sfGetCsvOutput($csv_id, 'status = ' . CSV_COLUMN_STATUS_FLG_ENABLE));
-
-        if (count($arrCsvOutput) <= 0) break;
-
-        $arrCsvOutputCols = $arrCsvOutput['col'];
-        $arrCsvOutputConvs = $arrCsvOutput['conv'];
-        $arrCsvOutputTitle = $arrCsvOutput['disp_name'];
-        $head = SC_Utils_Ex::sfGetCSVList($arrCsvOutputTitle);
-        $data = $objCSV->lfGetCSV("dtb_order", $where, $option, $arrval, $arrCsvOutputCols, $arrCsvOutputConvs);
-    }
-    
     /**
      * CSVが出力設定でインポート可能かのチェック
      *
@@ -142,7 +168,6 @@
      * @return integer CSV のカウント数
      */
     function sfGetCSVRecordCount($fp) {
-
         $count = 0;
         while(!feof($fp)) {
             $arrCSV = fgetcsv($fp, CSV_LINE_MAX);
@@ -156,8 +181,13 @@
         }
     }
 
-    //  CSV作成 コールバック関数
-    function cbOutputProductCSV($data) {
+    /**
+     * CSV作成 テンポラリファイル出力 コールバック関数
+     *
+     * @param mixed $data 出力データ
+     * @return boolean true (true:固定 false:中断)
+     */
+    function cbOutputCSV($data) {
         $line = $this->sfArrayToCSV($data);
         $line = mb_convert_encoding($line, 'SJIS-Win');
         $line .= "\r\n";
@@ -165,24 +195,44 @@
         return true;
     }
 
-    // CSVを送信する。(商品)
-    function sfDownloadProductsCsv($where, $arrval, $order, $is_download = false) {
+    /**
+     * CSVファイルを送信する
+     *
+     * @param integer $csv_id CSVフォーマットID
+     * @param string $where WHERE条件文
+     * @param array $arrVal プリペアドステートメントの実行時に使用される配列。配列の要素数は、クエリ内のプレースホルダの数と同じでなければなりません。 
+     * @param string $order ORDER文
+     * @param boolean $is_download true:ダウンロード用出力までさせる false:CSVの内容を返す(旧方式、メモリを食います。)
+     * @return mixed $is_download = true時 成功失敗フラグ(boolean) 、$is_downalod = false時 string
+     */
+    function sfDownloadCsv($csv_id, $where = "", $arrVal = array(), $order = "", $is_download = false) {
         // 実行時間を制限しない
         @set_time_limit(0);
 
         // CSV出力タイトル行の作成
-        $arrOutput = SC_Utils_Ex::sfSwapArray($this->sfGetCsvOutput(1, 'status = ' . CSV_COLUMN_STATUS_FLG_ENABLE));
+        $arrOutput = SC_Utils_Ex::sfSwapArray($this->sfGetCsvOutput($csv_id, 'status = ' . CSV_COLUMN_STATUS_FLG_ENABLE));
         if (count($arrOutput) <= 0) return false; // 失敗終了
         $arrOutputCols = $arrOutput['col'];
 
         $objQuery =& SC_Query::getSingletonInstance();
-        $objQuery->setOrder($order);
+        $objQuery->setOrder($order);        
+        $cols = SC_Utils_Ex::sfGetCommaList($arrOutputCols, true);
         
-        $objProduct = new SC_Product();
-        $cols = SC_Utils_Ex::sfGetCommaList($arrOutputCols, true);
-        // このWhereを足さないと無効な規格も出力される。現行仕様と合わせる為追加。
-        $inner_where = 'dtb_products_class.del_flg = 0';
-        $sql = $objQuery->getSql($cols, $objProduct->prdclsSQL($inner_where),$where);
+        // TODO: 固有処理 なんかエレガントな処理にしたい
+        if($csv_id == '1') {
+            //商品の場合
+            $objProduct = new SC_Product();
+            // このWhereを足さないと無効な規格も出力される。現行仕様と合わせる為追加。
+            $inner_where = 'dtb_products_class.del_flg = 0';
+            $sql = $objQuery->getSql($cols, $objProduct->prdclsSQL($inner_where),$where);
+        }else if($csv_id == '2') {
+            // 顧客の場合
+            $sql = "SELECT " . $cols . " FROM dtb_customer " . $where . " " . $order;
+            
+        }
+        // 固有処理ここまで
+        
+        // ヘッダ構築
         $header = $this->sfArrayToCSV($arrOutput['disp_name']);
         $header = mb_convert_encoding($header, 'SJIS-Win');
         $header .= "\r\n";
@@ -191,18 +241,17 @@
         // TODO: パフォーマンス向上には、ストリームを使うようにすると良い
         //  環境要件がバージョン5.1以上になったら使うように変えても良いかと
         //  fopen('php://temp/maxmemory:'. (5*1024*1024), 'r+');
-        $tmp_filename = tempnam(CSV_TEMP_REALDIR, 'product_csv');
+        $tmp_filename = tempnam(CSV_TEMP_REALDIR, $this->arrSubnavi[$csv_id] . '_csv');
         $this->fpOutput = fopen($tmp_filename, "w+");
-
         fwrite($this->fpOutput, $header);
 
-        $objQuery->doCallbackAll(array(&$this, 'cbOutputProductCSV'), $sql, $arrval);
+        $objQuery->doCallbackAll(array(&$this, 'cbOutputCSV'), $sql, $arrVal);
 
         fclose($this->fpOutput);
 
         if($is_download) {
             // CSVを送信する。
-            $this->lfDownloadCSVFile($tmp_filename,"product_");
+            $this->lfDownloadCSVFile($tmp_filename,$this->arrSubnavi[$csv_id] . "_");
             $res = true;
         }else{
             $res = SC_Utils_Ex::sfReadFile($tmp_filename);
@@ -353,53 +402,7 @@
         return preg_replace('/,$/',"\r\n",$line);
     }
 
-    /**
-     * 項目情報を初期化する.
-     *
-     * @access private
-     * @return void
-     */
-    function init() {
-        $this->arrSubnavi = array(
-                                  1 => 'product',
-                                  2 => 'customer',
-                                  3 => 'order',
-                                  4 => 'campaign',
-                                  5 => 'category'
-                                  );
 
-        $this->arrSubnaviName = array(
-                                      1 => '商品管理',
-                                      2 => '顧客管理',
-                                      3 => '受注管理',
-                                      4 => 'キャンペーン',
-                                      5 => 'カテゴリ'
-                                      );
-
-
-        $this->arrREVIEW_CVSCOL = array(
-                                        'B.name',
-                                        'A.status',
-                                        'A.create_date',
-                                        'A.reviewer_name',
-                                        'A.sex',
-                                        'A.recommend_level',
-                                        'A.title',
-                                        'A.comment'
-                                        );
-
-        $this->arrREVIEW_CVSTITLE = array(
-                                          '商品名',
-                                          'レビュー表示',
-                                          '投稿日',
-                                          '投稿者名',
-                                          '性別',
-                                          'おすすめレベル',
-                                          'タイトル',
-                                          'コメント'
-                                          );
-    }
-    
     /**
      * 1次元配列を1行のCSVとして返す
      * 参考: http://jp.php.net/fputcsv

変更: branches/version-2_5-dev/data/class/pages/admin/products/LC_Page_Admin_Products.php
===================================================================
--- branches/version-2_5-dev/data/class/pages/admin/products/LC_Page_Admin_Products.php	2011-02-20 16:39:53 UTC (rev 20279)
+++ branches/version-2_5-dev/data/class/pages/admin/products/LC_Page_Admin_Products.php	2011-02-20 17:00:17 UTC (rev 20280)
@@ -141,12 +141,8 @@
                     require_once(CLASS_EX_REALDIR . "helper_extends/SC_Helper_CSV_Ex.php");
 
                     $objCSV = new SC_Helper_CSV_Ex();
-
                     // CSVを送信する。正常終了の場合、終了。
-                    $objCSV->sfDownloadProductsCsv($where, $arrval, $order, true);
-                    // FIXME: sendResponseに渡した方が良いのか?
-//                        $data = $objCSV->sfDownloadProductsCsv($where, $arrval, $order);
-//                        $this->sendResponseCSV($fime_name, $data);
+                    $objCSV->sfDownloadCsv(1, $where, $arrval, $order, true);
                     exit;
                 // 全件削除(ADMIN_MODE)
                 case 'delete_all':




Svn-src-all メーリングリストの案内