source: branches/comu-utf8/html/admin/products/upload_csv_category.php @ 17014

Revision 17014, 11.1 KB checked in by miningbrownie, 16 years ago (diff)

カテゴリーをCSVで登録出きるようにしました。

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');
8ini_set("display_errors",1);
9
10
11require_once("../require.php");
12
13class LC_Page {
14    var $arrSession;
15    var $arrCSVErr;
16    function LC_Page() {
17        $this->tpl_mainpage = 'products/upload_csv_category.tpl';
18        $this->tpl_subnavi = 'products/subnavi.tpl';
19        $this->tpl_mainno = 'products';
20        $this->tpl_subno = 'upload_csv_category';
21    }
22}
23
24$conn = new SC_DBConn();
25$objPage = new LC_Page();
26$objView = new SC_AdminView();
27$objSess = new SC_Session();
28
29// 認証可否の判定
30sfIsSuccess($objSess);
31
32
33// ファイル管理クラス
34$objUpFile = new SC_UploadFile(IMAGE_TEMP_DIR, IMAGE_SAVE_DIR);
35// ファイル情報の初期化
36lfInitFile();
37// パラメータ管理クラス
38$objFormParam = new SC_FormParam();
39// パラメータ情報の初期化
40lfInitParam();
41$colmax = $objFormParam->getCount();
42$objFormParam->setHtmlDispNameArray();
43$objPage->arrTitle = $objFormParam->getHtmlDispNameArray();
44
45switch($_POST['mode']) {
46    case 'csv_upload':
47        $err = false;
48        // エラーチェック
49        $arrErr['csv_file'] = $objUpFile->makeTempFile('csv_file');
50
51        if($arrErr['css_file'] == "") {
52            $arrErr = $objUpFile->checkEXISTS();
53        }
54
55        // 実行時間を制限しない
56        set_time_limit(0);
57
58        // 出力をバッファリングしない(==日本語自動変換もしない)
59        ob_end_clean();
60
61        // IEのために256バイト空文字出力
62        echo str_pad('',256);
63
64        if($arrErr['csv_file'] == "") {
65            // 一時ファイル名の取得
66            $filepath = $objUpFile->getTempFilePath('csv_file');
67            // エンコード
68            $enc_filepath = sfEncodeFile($filepath, CHAR_CODE, CSV_TEMP_DIR);
69
70            // レコード数を得る
71            $rec_count = lfCSVRecordCount($enc_filepath);
72
73            $fp = fopen($enc_filepath, "r");
74            $line = 0;      // 行数
75            $regist = 0;    // 登録数
76
77            $objQuery = new SC_Query();
78            $objQuery->begin();
79
80            echo "■ CSV登録進捗状況 <br/><br/>\n";               
81
82            while(!feof($fp) && !$err) {
83
84                $arrCSV = fgetcsv($fp, CSV_LINE_MAX);
85
86                //                print "<br/>";
87                //                var_dump($arrCSV);
88                // 行カウント
89                $line++;
90                if($line <= 1) {
91                    continue;
92                }
93                // 項目数カウント
94                $max = count($arrCSV);
95                //                print "項目数カウント".$max;
96                // 項目数が1以下の場合は無視する
97                if($max <= 1) {
98                    continue;
99                }
100                //                echo "項目数チェック";
101                // 項目数チェック
102                if($max != $colmax) {
103                    echo "※ 項目数が" . $max . "個検出されました。項目数は" . $colmax . "個になります。</br>\n";
104                    $err = true;
105                } else {
106                    //                    echo "項目数が${max}個検出,項目数は${colmax}個です。";
107                    // シーケンス配列を格納する。
108                    $objFormParam->setParam($arrCSV, true);
109                    //                    var_dump($objFormParam);
110                    $arrRet = $objFormParam->getHashArray();
111                    //                    var_dump($arrRet);
112                    $objFormParam->setParam($arrRet);
113                    //                    var_dump($objFormParam);
114                    // 入力値の変換
115                    $objFormParam->convParam();
116                    //                    var_dump($objFormParam);
117                    // <br>なしでエラー取得する。
118                    $arrCSVErr = lfCheckError();
119                    //                    var_dump($arrCSVErr);
120                }
121                // 入力エラーチェック
122                if(count($arrCSVErr) > 0) {
123                    echo "<font color=\"red\">■" . $line . "行目でエラーが発生しました。</font></br>\n";
124                    foreach($arrCSVErr as $val) {
125                        echo "<font color=\"red\">" . htmlspecialchars($val, ENT_QUOTES) . "</font></br>\n";
126                    }
127
128                    $err = true;
129                }
130                if(!$err) {
131                    lfRegistProduct($objQuery, $line);
132                    $regist++;
133                }
134                $arrParam = $objFormParam->getHashArray();
135
136                if(!$err) echo $line." / ".$rec_count. "行目 (カテゴリID:".$arrParam['category_id']." / カテゴリ名:".$arrParam['category_name'].")\n<br />";
137                flush();
138            }
139            fclose($fp);
140
141            if(!$err) {
142                $objQuery->commit();
143                echo "■" . $regist . "件のレコードを登録しました。";
144                // 商品件数カウント関数の実行
145                sfCategory_Count($objQuery);
146            } else {
147                $objQuery->rollback();
148            }
149        } else {
150            foreach($arrErr as $val) {
151                echo "<font color=\"red\">$val</font></br>\n";
152            }
153        }
154        echo "<br/><a href=\"javascript:window.close()\">→閉じる</a>";
155        flush();
156        exit;
157        break;
158    default:
159        break;
160}
161
162$objView->assignobj($objPage);
163$objView->display(MAIN_FRAME);
164
165//--------------------------------------------------------------------------------------------------------------------------
166
167/*
168 * 関数名:lfInitFile
169 * 説明 :ファイル情報の初期化
170 */function lfInitFile() {
171global $objUpFile;
172$objUpFile->addFile("カテゴリCSV", 'csv_file', array('csv'), CSV_SIZE, true, 0, 0, false);
173 }
174
175 /*
176  * 関数名:lfInitParam
177  * 説明 :入力情報の初期化
178  */
179 function lfInitParam() {
180     global $objFormParam;
181     /*
182      * +-----TABLE : dtb_category
183      * |category_id    int(11)
184      * |category_name  text
185      * |parent_category_id     int(11)
186      * |level  int(11)
187      * |rank   int(11)
188      * |creator_id     int(11)
189      * |create_date    datetime
190      * |update_date    datetime
191      * |del_flg    smallint(6)             いいえ     0
192      * +-----TABLE : dtb_category_total_count
193      * |category_id    int(11)             いいえ
194      * |product_count  int(11)             はい  NU
195      * |create_date    datetime            いいえ             
196      * +-----TABLE : dtb_category_count
197      * |category_id    int(11)
198      * |product_count  int(11)
199      * |create_date    datetime
200      * +---------------------------------
201      */
202
203     $objFormParam->addParam("カテゴリID","category_id",INT_LEN,"n",array("MAX_LENGTH_CHECK","NUM_CHECK"));
204     $objFormParam->addParam("カテゴリ名","category_name",STEXT_LEN,"KVa",array("EXIST_CHECK","SPTAB_CHECK","MAX_LENGTH_CHECK"));
205     $objFormParam->addParam("親カテゴリID","parent_category_id",INT_LEN,"n",array("MAX_LENGTH_CHECK","NUM_CHECK"));
206     $objFormParam->addParam("階層","level",INT_LEN,"n",array("MAX_LENGTH_CHECK","NUM_CHECK"));
207     /*
208      * これはログインされているユーザでやればOK
209      * $objFormParam->addParam("登録者ID","creator_id",INT_LEN,"n",array());
210      */
211     $objFormParam->addParam("表示順","rank",INT_LEN,"n",array("MAX_LENGTH_CHECK","NUM_CHECK"));
212     //     $objFormParam->addParam("削除フラグ","del_flg",INT_LEN,"n",array());
213
214 }
215
216 /*
217  * 関数名:lfRegistProduct
218  * 引数1 :SC_Queryオブジェクト
219  * 説明 :商品登録
220  */
221 function lfRegistProduct($objQuery, $line = "") {
222     global $objFormParam;
223     $arrRet = $objFormParam->getHashArray();
224     //     echo " <br/>ここまでは実行されています。IfRegisProduct".$errrrrr++;
225     // dtb_products以外に登録される値を除外する。
226     foreach($arrRet as $key => $val) {
227         switch($key) {
228             //             case 'recommend_comment6':
229             //                 break;
230             default:
231                 if(!ereg("^dummy", $key)) {
232                     $sqlval[$key] = $val;
233                 }
234                 break;
235         }
236     }
237     //     echo " <br/>ここまでは実行されています。IfRegisProduct".$errrrrr++;
238
239     // 登録時間を生成(DBのnow()だとcommitした際、すべて同一の時間になってしまう)
240     $time = date("Y-m-d H:i:s");
241     // 秒以下を生成
242     if($line != "") {
243         $microtime = sprintf("%06d", $line);
244         $time .= ".$microtime";
245     }
246     $sqlval['update_date'] = $time;
247     $sqlval['creator_id'] = $_SESSION['member_id'];
248     //     echo " <br/>ここまでは実行されています。IfRegisProduct".$errrrrr++;
249
250     //     $old_catid = $objQuery->get("dtb_category","category_id","category_id = ?",array($arrRet['category_id']));
251     $count = $objQuery->count("dtb_category", "category_id = ?", array($arrRet['category_id']));
252     if($count != 0) {
253         //         echo " <br/>ここまでは実行されています。IfRegisProduct count 0".$errrrrr++;
254         // if($old_catid != "" || isset($old_catid)){
255         // if($arrRet['category_id'] != "" && $arrRet['product_class_id'] != "") {
256         // UPDATEの実行
257         echo "UPDATEの実行";
258         $where = "category_id = ?";
259         $objQuery->update("dtb_category", $sqlval, $where, array($sqlval['category_id']));
260     } else {
261         //         echo " <br/>ここまでは実行されています。IfRegisProduct count / 0 ".$errrrrr++;
262         // 新規登録
263         $sqlval['category_id'] = $arrRet['category_id'];
264         $sqlval['create_date'] = $time;
265         if($arrRet['rank'] == ""){
266             // カテゴリ内で最大のランクを割り当てる
267             $sqlval['rank'] = $objQuery->max("dtb_products", "rank", "category_id = ?", array($arrRet['category_id'])) + 1;
268         }
269         // INSERTの実行
270         $objQuery->insert("dtb_category", $sqlval);
271     }
272
273 }
274
275 /*
276  * 関数名:lfCheckError
277  * 説明 :入力チェック
278  */
279 function lfCheckError() {
280     global $objFormParam;
281     // 入力データを渡す。
282     $arrRet =  $objFormParam->getHashArray();
283     $objErr = new SC_CheckError($arrRet);
284     $objErr->arrErr = $objFormParam->checkError(false);
285     if(count($objErr->arrErr) == 0) {
286         $objQuery = new SC_Query();
287         // 存在する親カテゴリIDかチェック
288         if($arrRet['parent_category_id'] != 0){
289             $count = $objQuery->count("dtb_category", "category_id = ?", array($arrRet['parent_category_id']));
290             if($count == 0) {
291                 $objErr->arrErr['parent_category_id'] = "※ 指定の親カテゴリID(".$arrRet['parent_category_id'].")は、存在しません。";
292             }
293         }
294     }
295     return $objErr->arrErr;
296 }
297
298 /*
299  * 関数名:lfCSVRecordCount "category
300  * 説明 :CSVのカウント数を得る
301  * 引数1 :ファイルパス
302  */
303 function lfCSVRecordCount($file_name) {
304
305     $count = 0;
306     $fp = fopen($file_name, "r");
307     while(!feof($fp)) {
308         $arrCSV = fgetcsv($fp, CSV_LINE_MAX);
309         $count++;
310     }
311
312     return $count-1;
313 }
314 ?>
Note: See TracBrowser for help on using the repository browser.