source: branches/feature-module-update/html/admin/products/upload_csv.php @ 15080

Revision 15080, 16.7 KB checked in by nanasess, 17 years ago (diff)

svn properties 設定

  • svn:mime-type - application/x-httpd-php; charset=UTF-8
  • svn:keywords - Id
  • Property svn:keywords set to Id
  • Property svn:mime-type set to application/x-httpd-php; charset=UTF-8
Line 
1<?php
2/*
3 * Copyright(c) 2000-2007 LOCKON CO.,LTD. All Rights Reserved.
4 *
5 * http://www.lockon.co.jp/
6 */
7mb_language('Japanese');
8
9require_once("../require.php");
10
11class 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}
21
22$conn = new SC_DBConn();
23$objPage = new LC_Page();
24$objView = new SC_AdminView();
25$objSess = new SC_Session();
26
27// 認証可否の判定
28sfIsSuccess($objSess);
29
30// ファイル管理クラス
31$objUpFile = new SC_UploadFile(IMAGE_TEMP_DIR, IMAGE_SAVE_DIR);
32// ファイル情報の初期化
33lfInitFile();
34// パラメータ管理クラス
35$objFormParam = new SC_FormParam();
36// パラメータ情報の初期化
37lfInitParam();
38$colmax = $objFormParam->getCount();
39$objFormParam->setHtmlDispNameArray();
40$objPage->arrTitle = $objFormParam->getHtmlDispNameArray();
41
42switch($_POST['mode']) {
43case '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;
149default:
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 */
170function 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 */
238function 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 */
349function 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 */
385function 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 */
426function 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}
437?>
Note: See TracBrowser for help on using the repository browser.