- Timestamp:
- 2007/08/30 15:11:00 (17 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
branches/feature-module-update/html/admin/products/upload_csv.php
r15080 r15472 5 5 * http://www.lockon.co.jp/ 6 6 */ 7 mb_language('Japanese');8 7 9 require_once("../require.php"); 8 // {{{ requires 9 require_once("../../require.php"); 10 require_once(CLASS_PATH . "page_extends/admin/products/LC_Page_Admin_Products_UploadCSV_Ex.php"); 10 11 11 class LC_Page { 12 var $arrSession; 13 var $arrCSVErr; 14 function LC_Page() { 15 $this->tpl_mainpage = 'products/upload_csv.tpl'; 16 $this->tpl_subnavi = 'products/subnavi.tpl'; 17 $this->tpl_mainno = 'products'; 18 $this->tpl_subno = 'upload_csv'; 19 } 20 } 12 // }}} 13 // {{{ generate page 21 14 22 $conn = new SC_DBConn(); 23 $objPage = new LC_Page(); 24 $objView = new SC_AdminView(); 25 $objSess = new SC_Session(); 26 27 // 認証可否の判定 28 sfIsSuccess($objSess); 29 30 // ファイル管理クラス 31 $objUpFile = new SC_UploadFile(IMAGE_TEMP_DIR, IMAGE_SAVE_DIR); 32 // ファイル情報の初期化 33 lfInitFile(); 34 // パラメータ管理クラス 35 $objFormParam = new SC_FormParam(); 36 // パラメータ情報の初期化 37 lfInitParam(); 38 $colmax = $objFormParam->getCount(); 39 $objFormParam->setHtmlDispNameArray(); 40 $objPage->arrTitle = $objFormParam->getHtmlDispNameArray(); 41 42 switch($_POST['mode']) { 43 case 'csv_upload': 44 $err = false; 45 // エラーチェック 46 $arrErr['csv_file'] = $objUpFile->makeTempFile('csv_file'); 47 48 if($arrErr['css_file'] == "") { 49 $arrErr = $objUpFile->checkEXISTS(); 50 } 51 52 // 実行時間を制限しない 53 set_time_limit(0); 54 55 // 出力をバッファリングしない(==日本語自動変換もしない) 56 ob_end_clean(); 57 58 // IEのために256バイト空文字出力 59 echo str_pad('',256); 60 61 if($arrErr['csv_file'] == "") { 62 // 一時ファイル名の取得 63 $filepath = $objUpFile->getTempFilePath('csv_file'); 64 // エンコード 65 $enc_filepath = sfEncodeFile($filepath, CHAR_CODE, CSV_TEMP_DIR); 66 67 // レコード数を得る 68 $rec_count = lfCSVRecordCount($enc_filepath); 69 70 $fp = fopen($enc_filepath, "r"); 71 $line = 0; // 行数 72 $regist = 0; // 登録数 73 74 $objQuery = new SC_Query(); 75 $objQuery->begin(); 76 77 echo "■ CSV登録進捗状況 <br/><br/>\n"; 78 79 while(!feof($fp) && !$err) { 80 $arrCSV = fgetcsv($fp, CSV_LINE_MAX); 81 82 // 行カウント 83 $line++; 84 85 if($line <= 1) { 86 continue; 87 } 88 89 // 項目数カウント 90 $max = count($arrCSV); 91 92 // 項目数が1以下の場合は無視する 93 if($max <= 1) { 94 continue; 95 } 96 97 // 項目数チェック 98 if($max != $colmax) { 99 echo "※ 項目数が" . $max . "個検出されました。項目数は" . $colmax . "個になります。</br>\n"; 100 $err = true; 101 } else { 102 // シーケンス配列を格納する。 103 $objFormParam->setParam($arrCSV, true); 104 $arrRet = $objFormParam->getHashArray(); 105 $objFormParam->setParam($arrRet); 106 // 入力値の変換 107 $objFormParam->convParam(); 108 // <br>なしでエラー取得する。 109 $arrCSVErr = lfCheckError(); 110 } 111 112 // 入力エラーチェック 113 if(count($arrCSVErr) > 0) { 114 echo "<font color=\"red\">■" . $line . "行目でエラーが発生しました。</font></br>\n"; 115 foreach($arrCSVErr as $val) { 116 echo "<font color=\"red\">$val</font></br>\n"; 117 } 118 $err = true; 119 } 120 121 if(!$err) { 122 lfRegistProduct($objQuery, $line); 123 $regist++; 124 } 125 $arrParam = $objFormParam->getHashArray(); 126 127 if(!$err) echo $line." / ".$rec_count. "行目 (商品ID:".$arrParam['product_id']." / 商品名:".$arrParam['name'].")\n<br />"; 128 flush(); 129 } 130 fclose($fp); 131 132 if(!$err) { 133 $objQuery->commit(); 134 echo "■" . $regist . "件のレコードを登録しました。"; 135 // 商品件数カウント関数の実行 136 sfCategory_Count($objQuery); 137 } else { 138 $objQuery->rollback(); 139 } 140 } else { 141 foreach($arrErr as $val) { 142 echo "<font color=\"red\">$val</font></br>\n"; 143 } 144 } 145 echo "<br/><a href=\"javascript:window.close()\">→閉じる</a>"; 146 flush(); 147 exit; 148 break; 149 default: 150 break; 151 } 152 153 $objView->assignobj($objPage); 154 $objView->display(MAIN_FRAME); 155 156 //-------------------------------------------------------------------------------------------------------------------------- 157 158 /* 159 * 関数名:lfInitFile 160 * 説明 :ファイル情報の初期化 161 */function lfInitFile() { 162 global $objUpFile; 163 $objUpFile->addFile("CSVファイル", 'csv_file', array('csv'), CSV_SIZE, true, 0, 0, false); 164 } 165 166 /* 167 * 関数名:lfInitParam 168 * 説明 :入力情報の初期化 169 */ 170 function lfInitParam() { 171 global $objFormParam; 172 173 $objFormParam->addParam("商品ID", "product_id", INT_LEN, "n", array("MAX_LENGTH_CHECK","NUM_CHECK")); 174 $objFormParam->addParam("商品規格ID", "product_class_id", INT_LEN, "n", array("MAX_LENGTH_CHECK","NUM_CHECK")); 175 176 $objFormParam->addParam("規格名1", "dummy1"); 177 $objFormParam->addParam("規格名2", "dummy2"); 178 179 $objFormParam->addParam("商品名", "name", STEXT_LEN, "KVa", array("EXIST_CHECK","SPTAB_CHECK","MAX_LENGTH_CHECK")); 180 $objFormParam->addParam("公開フラグ(1:公開 2:非公開)", "status", INT_LEN, "n", array("EXIST_CHECK","MAX_LENGTH_CHECK","NUM_CHECK")); 181 $objFormParam->addParam("商品ステータス", "product_flag", INT_LEN, "n", array("EXIST_CHECK","MAX_LENGTH_CHECK","NUM_CHECK")); 182 $objFormParam->addParam("商品コード", "product_code", STEXT_LEN, "KVa", array("SPTAB_CHECK","MAX_LENGTH_CHECK")); 183 $objFormParam->addParam(NORMAL_PRICE_TITLE, "price01", PRICE_LEN, "n", array("MAX_LENGTH_CHECK","NUM_CHECK")); 184 $objFormParam->addParam(SALE_PRICE_TITLE, "price02", PRICE_LEN, "n", array("EXIST_CHECK","MAX_LENGTH_CHECK","NUM_CHECK")); 185 $objFormParam->addParam("在庫数", "stock", INT_LEN, "n", array("MAX_LENGTH_CHECK","NUM_CHECK")); 186 $objFormParam->addParam("送料", "deliv_fee", PRICE_LEN, "n", array("MAX_LENGTH_CHECK","NUM_CHECK")); 187 $objFormParam->addParam("ポイント付与率", "point_rate", PERCENTAGE_LEN, "n", array("EXIST_CHECK","MAX_LENGTH_CHECK","NUM_CHECK")); 188 $objFormParam->addParam("購入制限", "sale_limit", INT_LEN, "n", array("MAX_LENGTH_CHECK","NUM_CHECK")); 189 $objFormParam->addParam("メーカーURL", "comment1", URL_LEN, "KVa", array("SPTAB_CHECK","URL_CHECK","MAX_LENGTH_CHECK")); 190 $objFormParam->addParam("検索ワード", "comment3", LLTEXT_LEN, "KVa", array("SPTAB_CHECK","MAX_LENGTH_CHECK")); 191 $objFormParam->addParam("一覧-メインコメント", "main_list_comment", LTEXT_LEN, "KVa", array("EXIST_CHECK","SPTAB_CHECK","MAX_LENGTH_CHECK")); 192 $objFormParam->addParam("一覧-メイン画像", "main_list_image", LTEXT_LEN, "KVa", array("EXIST_CHECK","FILE_EXISTS","SPTAB_CHECK","MAX_LENGTH_CHECK")); 193 $objFormParam->addParam("メインコメント", "main_comment", LTEXT_LEN, "KVa", array("EXIST_CHECK","SPTAB_CHECK","MAX_LENGTH_CHECK")); 194 $objFormParam->addParam("メイン画像", "main_image", LTEXT_LEN, "KVa", array("EXIST_CHECK","FILE_EXISTS","SPTAB_CHECK","MAX_LENGTH_CHECK")); 195 $objFormParam->addParam("メイン拡大画像", "main_large_image", LTEXT_LEN, "KVa", array("FILE_EXISTS","SPTAB_CHECK","MAX_LENGTH_CHECK")); 196 $objFormParam->addParam("カラー比較画像", "file1", LTEXT_LEN, "KVa", array("FILE_EXISTS","SPTAB_CHECK","MAX_LENGTH_CHECK")); 197 $objFormParam->addParam("商品詳細ファイル", "file2", LTEXT_LEN, "KVa", array("FILE_EXISTS","SPTAB_CHECK","MAX_LENGTH_CHECK")); 198 $objFormParam->addParam("詳細-サブタイトル(1)", "sub_title1", LTEXT_LEN, "KVa", array("SPTAB_CHECK","MAX_LENGTH_CHECK")); 199 $objFormParam->addParam("詳細-サブコメント(1)", "sub_comment1", LTEXT_LEN, "KVa", array("SPTAB_CHECK","MAX_LENGTH_CHECK")); 200 $objFormParam->addParam("詳細-サブ画像(1)", "sub_image1", LTEXT_LEN, "KVa", array("FILE_EXISTS","SPTAB_CHECK","MAX_LENGTH_CHECK")); 201 $objFormParam->addParam("詳細-サブ拡大画像(1)", "sub_large_image1", LTEXT_LEN, "KVa", array("FILE_EXISTS","SPTAB_CHECK","MAX_LENGTH_CHECK")); 202 203 $objFormParam->addParam("詳細-サブタイトル(2)", "sub_title2", LTEXT_LEN, "KVa", array("SPTAB_CHECK","MAX_LENGTH_CHECK")); 204 $objFormParam->addParam("詳細-サブコメント(2)", "sub_comment2", LTEXT_LEN, "KVa", array("SPTAB_CHECK","MAX_LENGTH_CHECK")); 205 $objFormParam->addParam("詳細-サブ画像(2)", "sub_image2", LTEXT_LEN, "KVa", array("FILE_EXISTS","SPTAB_CHECK","MAX_LENGTH_CHECK")); 206 $objFormParam->addParam("詳細-サブ拡大画像(2)", "sub_large_image2", LTEXT_LEN, "KVa", array("FILE_EXISTS","SPTAB_CHECK","MAX_LENGTH_CHECK")); 207 208 $objFormParam->addParam("詳細-サブタイトル(3)", "sub_title3", LTEXT_LEN, "KVa", array("SPTAB_CHECK","MAX_LENGTH_CHECK")); 209 $objFormParam->addParam("詳細-サブコメント(3)", "sub_comment3", LTEXT_LEN, "KVa", array("SPTAB_CHECK","MAX_LENGTH_CHECK")); 210 $objFormParam->addParam("詳細-サブ画像(3)", "sub_image3", LTEXT_LEN, "KVa", array("FILE_EXISTS","SPTAB_CHECK","MAX_LENGTH_CHECK")); 211 $objFormParam->addParam("詳細-サブ拡大画像(3)", "sub_large_image3", LTEXT_LEN, "KVa", array("FILE_EXISTS","SPTAB_CHECK","MAX_LENGTH_CHECK")); 212 213 $objFormParam->addParam("詳細-サブタイトル(4)", "sub_title4", LTEXT_LEN, "KVa", array("SPTAB_CHECK","MAX_LENGTH_CHECK")); 214 $objFormParam->addParam("詳細-サブコメント(4)", "sub_comment4", LTEXT_LEN, "KVa", array("SPTAB_CHECK","MAX_LENGTH_CHECK")); 215 $objFormParam->addParam("詳細-サブ画像(4)", "sub_image4", LTEXT_LEN, "KVa", array("FILE_EXISTS","SPTAB_CHECK","MAX_LENGTH_CHECK")); 216 $objFormParam->addParam("詳細-サブ拡大画像(4)", "sub_large_image4", LTEXT_LEN, "KVa", array("FILE_EXISTS","SPTAB_CHECK","MAX_LENGTH_CHECK")); 217 218 $objFormParam->addParam("詳細-サブタイトル(5)", "sub_title5", LTEXT_LEN, "KVa", array("SPTAB_CHECK","MAX_LENGTH_CHECK")); 219 $objFormParam->addParam("詳細-サブコメント(5)", "sub_comment5", LTEXT_LEN, "KVa", array("SPTAB_CHECK","MAX_LENGTH_CHECK")); 220 $objFormParam->addParam("詳細-サブ画像(5)", "sub_image5", LTEXT_LEN, "KVa", array("FILE_EXISTS","SPTAB_CHECK","MAX_LENGTH_CHECK")); 221 $objFormParam->addParam("詳細-サブ拡大画像(5)", "sub_large_image5", LTEXT_LEN, "KVa", array("FILE_EXISTS","SPTAB_CHECK","MAX_LENGTH_CHECK")); 222 223 $objFormParam->addParam("発送日目安", "deliv_date_id", INT_LEN, "n", array("MAX_LENGTH_CHECK","NUM_CHECK")); 224 225 for ($cnt = 1; $cnt <= RECOMMEND_PRODUCT_MAX; $cnt++) { 226 $objFormParam->addParam("おすすめ商品($cnt)", "recommend_product_id$cnt", INT_LEN, "n", array("MAX_LENGTH_CHECK","NUM_CHECK")); 227 $objFormParam->addParam("詳細-サブコメント($cnt)", "recommend_comment$cnt", LTEXT_LEN, "KVa", array("SPTAB_CHECK","MAX_LENGTH_CHECK")); 228 } 229 230 $objFormParam->addParam("商品カテゴリ", "category_id", STEXT_LEN, "n", array("EXIST_CHECK", "SPTAB_CHECK", "MAX_LENGTH_CHECK")); 231 } 232 233 /* 234 * 関数名:lfRegistProduct 235 * 引数1 :SC_Queryオブジェクト 236 * 説明 :商品登録 237 */ 238 function lfRegistProduct($objQuery, $line = "") { 239 global $objFormParam; 240 $arrRet = $objFormParam->getHashArray(); 241 242 // dtb_products以外に登録される値を除外する。 243 foreach($arrRet as $key => $val) { 244 switch($key) { 245 case 'product_code': 246 case 'price01': 247 case 'price02': 248 case 'stock': 249 case 'product_class_id': 250 case 'recommend_product_id1': 251 case 'recommend_product_id2': 252 case 'recommend_product_id3': 253 case 'recommend_product_id4': 254 case 'recommend_product_id5': 255 case 'recommend_product_id6': 256 case 'recommend_comment1': 257 case 'recommend_comment2': 258 case 'recommend_comment3': 259 case 'recommend_comment4': 260 case 'recommend_comment5': 261 case 'recommend_comment6': 262 break; 263 default: 264 if(!ereg("^dummy", $key)) { 265 $sqlval[$key] = $val; 266 } 267 break; 268 } 269 } 270 // 登録時間を生成(DBのnow()だとcommitした際、すべて同一の時間になってしまう) 271 $time = date("Y-m-d H:i:s"); 272 // 秒以下を生成 273 if($line != "") { 274 $microtime = sprintf("%06d", $line); 275 $time .= ".$microtime"; 276 } 277 $sqlval['update_date'] = $time; 278 $sqlval['creator_id'] = $_SESSION['member_id']; 279 280 if($sqlval['sale_limit'] == "") { 281 $sqlval['sale_unlimited'] = '1'; 282 } else { 283 $sqlval['sale_unlimited'] = '0'; 284 } 285 286 if($sqlval['status'] == "") { 287 $sqlval['status'] = 2; 288 } 289 290 if($arrRet['product_id'] != "" && $arrRet['product_class_id'] != "") { 291 // カテゴリ内ランクの調整処理 292 $old_catid = $objQuery->get("dtb_products", "category_id", "product_id = ?", array($arrRet['product_id'])); 293 sfMoveCatRank($objQuery, "dtb_products", "product_id", "category_id", $old_catid, $arrRet['category_id'], $arrRet['product_id']); 294 295 // UPDATEの実行 296 $where = "product_id = ?"; 297 $objQuery->update("dtb_products", $sqlval, $where, array($sqlval['product_id'])); 298 } else { 299 300 // 新規登録 301 // postgresqlとmysqlとで処理を分ける 302 if (DB_TYPE == "pgsql") { 303 $product_id = $objQuery->nextval("dtb_products","product_id"); 304 }elseif (DB_TYPE == "mysql") { 305 $product_id = $objQuery->get_auto_increment("dtb_products"); 306 } 307 $sqlval['product_id'] = $product_id; 308 $sqlval['create_date'] = $time; 309 310 // カテゴリ内で最大のランクを割り当てる 311 $sqlval['rank'] = $objQuery->max("dtb_products", "rank", "category_id = ?", array($arrRet['category_id'])) + 1; 312 313 // INSERTの実行 314 $objQuery->insert("dtb_products", $sqlval); 315 } 316 317 // 規格登録 318 lfRegistProductClass($objQuery, $arrRet, $sqlval['product_id'], $arrRet['product_class_id']); 319 320 // おすすめ商品登録 321 $objQuery->delete("dtb_recommend_products", "product_id = ?", array($sqlval['product_id'])); 322 for($i = 1; $i <= RECOMMEND_PRODUCT_MAX; $i++) { 323 $keyname = "recommend_product_id" . $i; 324 $comment_key = "recommend_comment" . $i; 325 if($arrRet[$keyname] != "") { 326 $arrProduct = $objQuery->select("product_id", "dtb_products", "product_id = ?", array($arrRet[$keyname])); 327 if($arrProduct[0]['product_id'] != "") { 328 $arrval['product_id'] = $sqlval['product_id']; 329 $arrval['recommend_product_id'] = $arrProduct[0]['product_id']; 330 $arrval['comment'] = $arrRet[$comment_key]; 331 $arrval['update_date'] = "Now()"; 332 $arrval['create_date'] = "Now()"; 333 $arrval['creator_id'] = $_SESSION['member_id']; 334 $arrval['rank'] = RECOMMEND_PRODUCT_MAX - $i + 1; 335 $objQuery->insert("dtb_recommend_products", $arrval); 336 } 337 } 338 } 339 } 340 341 /* 342 * 関数名:lfRegistProductClass 343 * 引数1 :SC_Queryオブジェクト 344 * 引数2 :商品規格情報配列 345 * 引数3 :商品ID 346 * 引数4 :商品規格ID 347 * 説明 :商品規格登録 348 */ 349 function lfRegistProductClass($objQuery, $arrList, $product_id, $product_class_id) { 350 $sqlval['product_code'] = $arrList["product_code"]; 351 $sqlval['stock'] = $arrList["stock"]; 352 if($sqlval['stock'] == "") { 353 $sqlval['stock_unlimited'] = '1'; 354 } else { 355 $sqlval['stock_unlimited'] = '0'; 356 } 357 $sqlval['price01'] = $arrList['price01']; 358 $sqlval['price02'] = $arrList['price02']; 359 $sqlval['creator_id'] = $_SESSION['member_id']; 360 if($sqlval['member_id'] == "") { 361 $sqlval['creator_id'] = '0'; 362 } 363 364 if($product_class_id == "") { 365 // 新規登録 366 $where = "product_id = ?"; 367 // 念のために既存の規格を削除 368 $objQuery->delete("dtb_products_class", $where, array($product_id)); 369 $sqlval['product_id'] = $product_id; 370 $sqlval['classcategory_id1'] = '0'; 371 $sqlval['classcategory_id2'] = '0'; 372 $sqlval['create_date'] = "now()"; 373 $objQuery->insert("dtb_products_class", $sqlval); 374 } else { 375 // 既存編集 376 $where = "product_id = ? AND product_class_id = ?"; 377 $objQuery->update("dtb_products_class", $sqlval, $where, array($product_id, $product_class_id)); 378 } 379 } 380 381 /* 382 * 関数名:lfCheckError 383 * 説明 :入力チェック 384 */ 385 function lfCheckError() { 386 global $objFormParam; 387 // 入力データを渡す。 388 $arrRet = $objFormParam->getHashArray(); 389 $objErr = new SC_CheckError($arrRet); 390 $objErr->arrErr = $objFormParam->checkError(false); 391 392 if(count($objErr->arrErr) == 0) { 393 $objQuery = new SC_Query(); 394 // 商品ID、規格IDの存在チェック 395 if($arrRet['product_id'] != "") { 396 $count = $objQuery->count("dtb_products", "product_id = ?", array($arrRet['product_id'])); 397 if($count == 0) { 398 $objErr->arrErr['product_id'] = "※ 指定の商品IDは、登録されていません。"; 399 } 400 } 401 402 if($arrRet['product_class_id'] != "") { 403 $count = 0; 404 if($arrRet['product_id'] != "") { 405 $count = $objQuery->count("dtb_products_class", "product_id = ? AND product_class_id = ?", array($arrRet['product_id'], $arrRet['product_class_id'])); 406 } 407 if($count == 0) { 408 $objErr->arrErr['product_class_id'] = "※ 指定の規格IDは、登録されていません。"; 409 } 410 } 411 412 // 存在するカテゴリIDかチェック 413 $count = $objQuery->count("dtb_category", "category_id = ?", array($arrRet['category_id'])); 414 if($count == 0) { 415 $objErr->arrErr['product_id'] = "※ 指定のカテゴリIDは、登録されていません。"; 416 } 417 } 418 return $objErr->arrErr; 419 } 420 421 /* 422 * 関数名:lfCSVRecordCount 423 * 説明 :CSVのカウント数を得る 424 * 引数1 :ファイルパス 425 */ 426 function lfCSVRecordCount($file_name) { 427 428 $count = 0; 429 $fp = fopen($file_name, "r"); 430 while(!feof($fp)) { 431 $arrCSV = fgetcsv($fp, CSV_LINE_MAX); 432 $count++; 433 } 434 435 return $count-1; 436 } 15 $objPage = new LC_Page_Admin_Products_UploadCSV_Ex(); 16 $objPage->init(); 17 $objPage->process(); 18 register_shutdown_function(array($objPage, "destroy")); 437 19 ?>
Note: See TracChangeset
for help on using the changeset viewer.