Ignore:
Timestamp:
2010/12/18 20:04:49 (16 years ago)
Author:
AMUAMU
Message:

#657 (CSVダウンロードの改善) のうち商品CSVダウンロードの修正。
#781 (規格のデータベースを木構造に) の影響により機能していなかった商品CSVダウンロード機能の修正。
#823 (商品種別によってカートを分ける) や #792 (ダウンロード販売機能) による影響部分も修正。

Location:
branches/version-2_5-dev/data/class
Files:
4 edited

Legend:

Unmodified
Added
Removed
  • branches/version-2_5-dev/data/class/SC_Product.php

    r19740 r19742  
    716716 
    717717    /** 
     718     * 商品規格詳細の SQL を取得する. 
     719     * 
     720     * MEMO: 2.4系 vw_product_classに相当(?)するイメージ 
     721     * 
     722     * @param string $where 商品詳細の WHERE 句 
     723     * @return string 商品規格詳細の SQL 
     724     */ 
     725    function prdclsSQL($where = "") { 
     726        $whereCause = ""; 
     727        if (!SC_Utils_Ex::isBlank($where)) { 
     728            $whereCause = " WHERE " . $where; 
     729        } 
     730        $sql = <<< __EOS__ 
     731        ( 
     732             SELECT dtb_products.*, 
     733                    dtb_products_class.product_class_id, 
     734                    dtb_products_class.class_combination_id, 
     735                    dtb_products_class.product_type_id, 
     736                    dtb_products_class.product_code, 
     737                    dtb_products_class.stock, 
     738                    dtb_products_class.stock_unlimited, 
     739                    dtb_products_class.sale_limit, 
     740                    dtb_products_class.price01, 
     741                    dtb_products_class.price02, 
     742                    dtb_products_class.deliv_fee, 
     743                    dtb_products_class.point_rate, 
     744                    dtb_products_class.down_filename, 
     745                    dtb_products_class.down_realfilename, 
     746                    dtb_class_combination.parent_class_combination_id, 
     747                    dtb_class_combination.classcategory_id, 
     748                    dtb_class_combination.level as classlevel, 
     749                    Tpcm.classcategory_id as parent_classcategory_id, 
     750                    Tpcm.level as parent_classlevel, 
     751                    Tcc1.class_id as class_id, 
     752                    Tcc1.name as classcategory_name, 
     753                    Tcc2.class_id as parent_class_id, 
     754                    Tcc2.name as parent_classcategory_name 
     755             FROM dtb_products 
     756                 LEFT JOIN dtb_products_class 
     757                     ON dtb_products.product_id = dtb_products_class.product_id 
     758                 LEFT JOIN dtb_class_combination 
     759                     ON dtb_products_class.class_combination_id = dtb_class_combination.class_combination_id 
     760                 LEFT JOIN dtb_class_combination as Tpcm 
     761                     ON dtb_class_combination.parent_class_combination_id = Tpcm.class_combination_id 
     762                 LEFT JOIN dtb_classcategory as Tcc1 
     763                     ON dtb_class_combination.classcategory_id = Tcc1.classcategory_id 
     764                 LEFT JOIN dtb_classcategory as Tcc2 
     765                     ON Tpcm.classcategory_id = Tcc2.classcategory_id 
     766        ) as prdcls 
     767__EOS__; 
     768        return $sql; 
     769    } 
     770     
     771    /** 
    718772     * 商品規格ID1、2に紐づいた,product_class_idを取得する. 
    719773     * 
  • branches/version-2_5-dev/data/class/SC_Query.php

    r19732 r19742  
    216216        return $this->query($str, $arrval); 
    217217    } 
     218     
     219    /** 
     220     * クエリを実行し、結果行毎にコールバック関数を適用する 
     221     * 
     222     * @param callback $function コールバック先 
     223     * @param string $sql SQL クエリ 
     224     * @param array $arrVal プリペアドステートメントの実行時に使用される配列。配列の要素数は、クエリ内のプレースホルダの数と同じでなければなりません。  
     225     * @param integer $fetchmode 使用するフェッチモード。デフォルトは DB_FETCHMODE_ASSOC。 
     226     * @return boolean 結果 
     227     */ 
     228    function doCallbackAll($cbFunc, $sql, $arrval = array(), $fetchmode = MDB2_FETCHMODE_ASSOC) { 
     229 
     230        $sql = $this->dbFactory->sfChangeMySQL($sql); 
     231 
     232        $sth =& $this->prepare($sql); 
     233        if (PEAR::isError($sth) && $this->force_run) { 
     234            return; 
     235        } 
     236 
     237        $affected =& $this->execute($sth, $arrval); 
     238        if (PEAR::isError($affected) && $this->force_run) { 
     239            return; 
     240        } 
     241         
     242        while($data = $affected->fetchRow($fetchmode)) { 
     243            $result = call_user_func($cbFunc, &$data); 
     244            if($result === false) { 
     245                break; 
     246            } 
     247        } 
     248        $sth->free(); 
     249        return $result; 
     250    } 
    218251 
    219252    /** 
  • branches/version-2_5-dev/data/class/helper/SC_Helper_CSV.php

    r19730 r19742  
    120120        $data = $objCSV->lfGetCSV("dtb_order", $where, $option, $arrval, $arrCsvOutputCols, $arrCsvOutputConvs); 
    121121    } 
     122     
     123    //  CSV作成 コールバック関数 
     124    function cbOutputProductCSV($data) { 
     125        $line = $this->sfArrayToCSV($data); 
     126        $line = mb_convert_encoding($line, 'SJIS-Win'); 
     127        $line .= "\r\n"; 
     128        fwrite($this->fpOutput, $line); 
     129        return true; 
     130    } 
    122131 
    123132    // CSVを送信する。(商品) 
    124     function sfDownloadProductsCsv($where, $arrval, $order) { 
     133    function sfDownloadProductsCsv($where, $arrval, $order, $is_download = false) { 
    125134 
    126135        // CSV出力タイトル行の作成 
     
    131140        $objQuery = new SC_Query(); 
    132141        $objQuery->setOrder($order); 
    133  
    134         /* 
    135          * FIXME 
    136          * パフォーマンスが出ないため, 
    137          * SC_Product::getProductsClassByProductIds() を使用した実装に変更 
    138          */ 
    139         $dataRows = $objQuery->select( 
    140              SC_Utils_Ex::sfGetCommaList($arrOutputCols, true, array('category_id')) 
    141             ,'vw_product_class AS prdcls' 
    142             ,$where 
    143             ,$arrval 
    144         ); 
    145          
    146         // 規格分類名一覧 
    147         if (in_array('classcategory_id1', $arrOutputCols) || in_array('classcategory_id2', $arrOutputCols)) { 
    148             $objDb = new SC_Helper_DB_Ex(); 
    149             $arrClassCatName = $objDb->sfGetIDValueList("dtb_classcategory", "classcategory_id", "name"); 
    150         } 
    151  
    152         $outputArray = array(); 
    153          
    154         // ヘッダ行 
    155         $outputArray[] = $arrOutput['disp_name']; 
    156          
    157         $objQuery = new SC_Query(); 
    158         // データ行 
    159         foreach ($dataRows as $row) { 
    160             // 規格名1 
    161             if (in_array('classcategory_id1', $arrOutputCols)) { 
    162                 $row['classcategory_id1'] = $arrClassCatName[$row['classcategory_id1']]; 
    163             } 
    164  
    165             // 規格名2 
    166             if (in_array('classcategory_id2', $arrOutputCols)) { 
    167                 $row['classcategory_id2'] = $arrClassCatName[$row['classcategory_id2']]; 
    168             } 
    169  
    170             // カテゴリID 
    171             if (in_array('category_id', $arrOutputCols)) { 
    172                 $row['category_id'] = $objQuery->getCol( 
    173                     "category_id", 
    174                     "dtb_product_categories", 
    175                     "product_id = ?", 
    176                     array($row['product_id']) 
    177                 ); 
    178             } 
    179  
    180             $outputArray[] = $row; 
    181         } 
    182          
    183         // CSVを送信する。 
    184         #$this->lfDownloadCsv($outputArray); 
    185         return $this->lfGetCsv2($outputArray); 
    186          
    187         // 成功終了 
    188         #return true; 
     142         
     143        $objProduct = new SC_Product(); 
     144        $cols = SC_Utils_Ex::sfGetCommaList($arrOutputCols, true); 
     145        $sql = $objQuery->getSql($cols, $objProduct->prdclsSQL(),$where); 
     146        $header = $this->sfArrayToCSV($arrOutput['disp_name']); 
     147        $header = mb_convert_encoding($header, 'SJIS-Win'); 
     148        $header .= "\r\n"; 
     149         
     150        //テンポラリファイル作成 
     151        // TODO: パフォーマンス向上には、ストリームを使うようにすると良い 
     152        //  環境要件がバージョン5.1以上になったら使うように変えても良いかと 
     153        //  fopen('php://temp/maxmemory:'. (5*1024*1024), 'r+'); 
     154        $tmp_filename = tempnam(CSV_TEMP_DIR, 'product_csv'); 
     155        $this->fpOutput = fopen($tmp_filename, "w+"); 
     156 
     157        fwrite($this->fpOutput, $header); 
     158 
     159        $objQuery->doCallbackAll(array(&$this, 'cbOutputProductCSV'), $sql, $arrval); 
     160 
     161        fclose($this->fpOutput); 
     162 
     163        if($is_download) { 
     164            // CSVを送信する。 
     165            $this->lfDownloadCSVFile($tmp_filename,"product_"); 
     166            $res = true; 
     167        }else{ 
     168            $res = SC_Utils_Ex::sfReadFile($tmp_filename); 
     169        } 
     170         
     171        //テンポラリファイル削除 
     172        unlink($tmp_filename); 
     173        return $res; 
    189174    } 
    190175 
     
    498483        } 
    499484    } 
     485     
     486    /** 
     487     * CSVファイルを送信する。 
     488     */ 
     489    function lfDownloadCSVFile($filepath, $prefix = "") { 
     490        $file_name = $prefix . date("YmdHis") . ".csv"; 
     491         
     492        /* HTTPヘッダの出力 */ 
     493        Header("Content-disposition: attachment; filename=${file_name}"); 
     494        Header("Content-type: application/octet-stream; name=${file_name}"); 
     495        Header("Cache-Control: "); 
     496        Header("Pragma: "); 
     497         
     498        /* データを出力 */ 
     499        // file_get_contentsはメモリマッピングも自動的に使ってくれるので高速&省メモリ 
     500        echo file_get_contents($filepath); 
     501    } 
    500502 
    501503    /** 
  • branches/version-2_5-dev/data/class/pages/admin/products/LC_Page_Admin_Products.php

    r19670 r19742  
    250250 
    251251                        // CSVを送信する。正常終了の場合、終了。 
    252                         list($fime_name, $data) = $objCSV->sfDownloadProductsCsv($where, $arrval, $order); 
    253                         $this->sendResponseCSV($fime_name, $data); 
     252                        $objCSV->sfDownloadProductsCsv($where, $arrval, $order, true); 
     253                        // FIXME: sendResponseに渡した方が良いのか? 
     254//                        $data = $objCSV->sfDownloadProductsCsv($where, $arrval, $order); 
     255//                        $this->sendResponseCSV($fime_name, $data); 
    254256                        exit; 
    255257                        break; 
Note: See TracChangeset for help on using the changeset viewer.