Changeset 19742 for branches/version-2_5-dev/data/class
- Timestamp:
- 2010/12/18 20:04:49 (16 years ago)
- Location:
- branches/version-2_5-dev/data/class
- Files:
-
- 4 edited
-
SC_Product.php (modified) (1 diff)
-
SC_Query.php (modified) (1 diff)
-
helper/SC_Helper_CSV.php (modified) (3 diffs)
-
pages/admin/products/LC_Page_Admin_Products.php (modified) (1 diff)
Legend:
- Unmodified
- Added
- Removed
-
branches/version-2_5-dev/data/class/SC_Product.php
r19740 r19742 716 716 717 717 /** 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 /** 718 772 * 商品規格ID1、2に紐づいた,product_class_idを取得する. 719 773 * -
branches/version-2_5-dev/data/class/SC_Query.php
r19732 r19742 216 216 return $this->query($str, $arrval); 217 217 } 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 } 218 251 219 252 /** -
branches/version-2_5-dev/data/class/helper/SC_Helper_CSV.php
r19730 r19742 120 120 $data = $objCSV->lfGetCSV("dtb_order", $where, $option, $arrval, $arrCsvOutputCols, $arrCsvOutputConvs); 121 121 } 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 } 122 131 123 132 // CSVを送信する。(商品) 124 function sfDownloadProductsCsv($where, $arrval, $order ) {133 function sfDownloadProductsCsv($where, $arrval, $order, $is_download = false) { 125 134 126 135 // CSV出力タイトル行の作成 … … 131 140 $objQuery = new SC_Query(); 132 141 $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; 189 174 } 190 175 … … 498 483 } 499 484 } 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 } 500 502 501 503 /** -
branches/version-2_5-dev/data/class/pages/admin/products/LC_Page_Admin_Products.php
r19670 r19742 250 250 251 251 // 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); 254 256 exit; 255 257 break;
Note: See TracChangeset
for help on using the changeset viewer.
