Ticket #236: uploadCSVCategory.patch
File uploadCSVCategory.patch, 25.4 KB (added by nanasess, 15 years ago) |
---|
-
data/class_extends/page_extends/admin/products/LC_Page_Admin_Products_UploadCSVCategory_Ex.php
1 1 <?php 2 2 /* 3 * This file is part of EC-CUBE 4 * 5 * Copyright(c) 2000-2007 LOCKON CO.,LTD. All Rights Reserved. 6 * 7 * http://www.lockon.co.jp/ 8 * 9 * This program is free software; you can redistribute it and/or 10 * modify it under the terms of the GNU General Public License 11 * as published by the Free Software Foundation; either version 2 12 * of the License, or (at your option) any later version. 13 * 14 * This program is distributed in the hope that it will be useful, 15 * but WITHOUT ANY WARRANTY; without even the implied warranty of 16 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 17 * GNU General Public License for more details. 18 * 19 * You should have received a copy of the GNU General Public License 20 * along with this program; if not, write to the Free Software 21 * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. 22 */ 3 23 // {{{ requires 4 require_once(CLASS_PATH . "pages/admin/products/LC_Page_Admin_Products_UploadCSV .php");24 require_once(CLASS_PATH . "pages/admin/products/LC_Page_Admin_Products_UploadCSVCategory.php"); 5 25 6 26 /** 7 * CSV アップロード のページクラス(拡張)27 * カテゴリ CSV アップロード のページクラス(拡張) 8 28 * 9 * LC_Page_Admin_Products_UploadCSV をカスタマイズする場合はこのクラスを編集する.29 * LC_Page_Admin_Products_UploadCSVCategory をカスタマイズする場合はこのクラスを編集する. 10 30 * 11 31 * @package Page 12 32 * @author LOCKON CO.,LTD. 13 * @version $ $Id: LC_Page_Admin_Products_UploadCSV_Ex.php 16741 2007-11-08 00:43:24Z adachi $$33 * @version $Id$ 14 34 */ 15 class LC_Page_Admin_Products_UploadCSVCategory_Ex extends LC_Page_Admin_Products_UploadCSV {35 class LC_Page_Admin_Products_UploadCSVCategory_Ex extends LC_Page_Admin_Products_UploadCSVCategory { 16 36 17 37 // }}} 18 38 // {{{ functions … … 24 44 */ 25 45 function init() { 26 46 parent::init(); 27 $this->tpl_mainpage = 'products/upload_csv_category.tpl';28 $this->tpl_subnavi = 'products/subnavi.tpl';29 $this->tpl_mainno = 'products';30 $this->tpl_subno = 'upload_csv_category';31 47 } 32 48 33 49 /** … … 36 52 * @return void 37 53 */ 38 54 function process() { 39 $conn = new SC_DBConn(); 40 $objView = new SC_AdminView(); 41 $objSess = new SC_Session(); 42 $objDb = new SC_Helper_DB_Ex(); 43 44 // 認証可否の判定 45 SC_Utils_Ex::sfIsSuccess($objSess); 46 47 // ファイル管理クラス 48 $this->objUpFile = new SC_UploadFile(IMAGE_TEMP_DIR, IMAGE_SAVE_DIR); 49 // ファイル情報の初期化 50 $this->lfInitFile(); 51 // パラメータ管理クラス 52 $this->objFormParam = new SC_FormParam(); 53 // パラメータ情報の初期化 54 $this->lfInitParam(); 55 $colmax = $this->objFormParam->getCount(); 56 $this->objFormParam->setHtmlDispNameArray(); 57 $this->arrTitle = $this->objFormParam->getHtmlDispNameArray(); 58 59 if (!isset($_POST['mode'])) $_POST['mode'] = ""; 60 61 switch($_POST['mode']) { 62 case 'csv_upload': 63 $err = false; 64 // エラーチェック 65 $arrErr['csv_file'] = $this->objUpFile->makeTempFile('csv_file'); 66 67 if($arrErr['css_file'] == "") { 68 $arrErr = $this->objUpFile->checkEXISTS(); 69 } 70 71 // 実行時間を制限しない 72 set_time_limit(0); 73 74 // 出力をバッファリングしない(==日本語自動変換もしない) 75 ob_end_clean(); 76 77 // IEのために256バイト空文字出力 78 echo str_pad('',256); 79 80 if(empty($arrErr['csv_file'])) { 81 // 一時ファイル名の取得 82 $filepath = $this->objUpFile->getTempFilePath('csv_file'); 83 // エンコード 84 $enc_filepath = SC_Utils_Ex::sfEncodeFile($filepath, 85 CHAR_CODE, CSV_TEMP_DIR); 86 87 // レコード数を得る 88 $rec_count = $this->lfCSVRecordCount($enc_filepath); 89 90 $fp = fopen($enc_filepath, "r"); 91 $line = 0; // 行数 92 $regist = 0; // 登録数 93 94 $objQuery = new SC_Query(); 95 $objQuery->begin(); 96 97 echo "■ CSV登録進捗状況 <br/><br/>\n"; 98 99 while(!feof($fp) && !$err) { 100 $arrCSV = fgetcsv($fp, CSV_LINE_MAX); 101 102 // 行カウント 103 $line++; 104 105 if($line <= 1) { 106 continue; 107 } 108 109 // 項目数カウント 110 $max = count($arrCSV); 111 112 // 項目数が1以下の場合は無視する 113 if($max <= 1) { 114 continue; 115 } 116 117 // 項目数チェック 118 if($max != $colmax) { 119 echo "※ 項目数が" . $max . "個検出されました。項目数は" . $colmax . "個になります。</br>\n"; 120 $err = true; 121 } else { 122 // シーケンス配列を格納する。 123 $this->objFormParam->setParam($arrCSV, true); 124 $arrRet = $this->objFormParam->getHashArray(); 125 $this->objFormParam->setParam($arrRet); 126 // 入力値の変換 127 $this->objFormParam->convParam(); 128 // <br>なしでエラー取得する。 129 $arrCSVErr = $this->lfCheckError(); 130 } 131 132 // 入力エラーチェック 133 if(count($arrCSVErr) > 0) { 134 echo "<font color=\"red\">■" . $line . "行目でエラーが発生しました。</font></br>\n"; 135 foreach($arrCSVErr as $val) { 136 $this->printError($val); 137 } 138 $err = true; 139 } 140 141 if(!$err) { 142 $this->lfRegistProduct($objQuery, $line); 143 $regist++; 144 } 145 $arrParam = $this->objFormParam->getHashArray(); 146 147 if(!$err) echo $line." / ".$rec_count. "行目 (カテゴリID:".$arrParam['category_id']." / カテゴリ名:".$arrParam['category_name'].")\n<br />"; 148 flush(); 149 } 150 fclose($fp); 151 152 if(!$err) { 153 $objQuery->commit(); 154 echo "■" . $regist . "件のレコードを登録しました。"; 155 // カテゴリ件数カウント関数の実行 156 $objDb->sfCategory_Count($objQuery); 157 } else { 158 $objQuery->rollback(); 159 } 160 } else { 161 foreach($arrErr as $val) { 162 $this->printError($val); 163 } 164 } 165 echo "<br/><a href=\"javascript:window.close()\">→閉じる</a>"; 166 flush(); 167 exit; 168 break; 169 default: 170 break; 171 } 172 173 $objView->assignobj($this); 174 $objView->display(MAIN_FRAME); 55 parent::process(); 175 56 } 176 57 177 58 /** … … 182 63 function destroy() { 183 64 parent::destroy(); 184 65 } 185 186 187 /**188 * ファイル情報の初期化を行う.189 *190 * @return void191 */192 function lfInitFile() {193 $this->objUpFile->addFile("CSVファイル", 'csv_file', array('csv'),194 CSV_SIZE, true, 0, 0, false);195 }196 197 /**198 * 入力情報の初期化を行う.199 *200 * @return void201 */202 function lfInitParam() {203 $this->objFormParam->addParam("カテゴリID","category_id",INT_LEN,"n",array("MAX_LENGTH_CHECK","NUM_CHECK"));204 $this->objFormParam->addParam("カテゴリ名","category_name",STEXT_LEN,"KVa",array("EXIST_CHECK","SPTAB_CHECK","MAX_LENGTH_CHECK"));205 $this->objFormParam->addParam("親カテゴリID","parent_category_id",INT_LEN,"n",array("MAX_LENGTH_CHECK","NUM_CHECK"));206 $this->objFormParam->addParam("階層","level",INT_LEN,"n",array("MAX_LENGTH_CHECK","NUM_CHECK"));207 $this->objFormParam->addParam("表示順","rank",INT_LEN,"n",array("MAX_LENGTH_CHECK","NUM_CHECK"));208 // $this->objFormParam->addParam("削除フラグ","del_flg",INT_LEN,"n",array());209 }210 211 /**212 * カテゴリ登録を行う.213 *214 * @param SC_Query $objQuery SC_Queryインスタンス215 * @param string|integer $line 処理中の行数216 * @return void217 */218 function lfRegistProduct($objQuery, $line = "") {219 $objDb = new SC_Helper_DB_Ex();220 $arrRet = $this->objFormParam->getHashArray();221 foreach($arrRet as $key => $val) {222 switch($key) {223 // case 'recommend_comment6':224 // break;225 default:226 if(!ereg("^dummy", $key)) {227 $sqlval[$key] = $val;228 }229 break;230 }231 }232 // 登録時間を生成(DBのnow()だとcommitした際、すべて同一の時間になってしまう)233 $time = date("Y-m-d H:i:s");234 // 秒以下を生成235 if($line != "") {236 $microtime = sprintf("%06d", $line);237 $time .= ".$microtime";238 }239 $sqlval['update_date'] = $time;240 $sqlval['creator_id'] = $_SESSION['member_id'];241 $count = $objQuery->count("dtb_category", "category_id = ?", array($arrRet['category_id']));242 if($count != 0) {243 // UPDATEの実行244 echo "UPDATEの実行";245 $where = "category_id = ?";246 $objQuery->update("dtb_category", $sqlval, $where, array($sqlval['category_id']));247 } else {248 // 新規登録249 $sqlval['category_id'] = $arrRet['category_id'];250 $sqlval['create_date'] = $time;251 if($arrRet['rank'] == ""){252 // カテゴリ内で最大のランクを割り当てる253 $sqlval['rank'] = $objQuery->max("dtb_category", "rank", "parent_category_id = ?", array($arrRet['parent_category_id'])) + 1;254 }255 // INSERTの実行256 $objQuery->insert("dtb_category", $sqlval);257 }258 }259 260 /**261 * 入力チェックを行う.262 *263 * @return void264 */265 function lfCheckError() {266 // 入力データを渡す。267 $arrRet = $this->objFormParam->getHashArray();268 $objErr = new SC_CheckError($arrRet);269 $objErr->arrErr = $this->objFormParam->checkError(false);270 if(count($objErr->arrErr) == 0) {271 $objQuery = new SC_Query();272 // 存在する親カテゴリIDかチェック273 if($arrRet['parent_category_id'] != 0){274 $count = $objQuery->count("dtb_category", "category_id = ?", array($arrRet['parent_category_id']));275 if($count == 0) {276 $objErr->arrErr['parent_category_id'] = "※ 指定の親カテゴリID(".$arrRet['parent_category_id'].")は、存在しません。";277 }278 }279 }280 return $objErr->arrErr;281 }282 283 /**284 * CSVのカウント数を得る.285 *286 * @param string $file_name ファイルパス287 * @return integer CSV のカウント数288 */289 function lfCSVRecordCount($file_name) {290 291 $count = 0;292 $fp = fopen($file_name, "r");293 while(!feof($fp)) {294 $arrCSV = fgetcsv($fp, CSV_LINE_MAX);295 $count++;296 }297 298 return $count-1;299 }300 301 /**302 * 引数の文字列をエラー出力する.303 *304 * 引数 $val の内容は, htmlspecialchars() によってサニタイズされ305 *306 * @param string $val 出力する文字列307 * @return void308 */309 function printError($val) {310 echo "<font color=\"red\">"311 . htmlspecialchars($val, ENT_QUOTES)312 . "</font></br>\n";313 }314 }315 66 ?> -
data/class/pages/admin/products/LC_Page_Admin_Products_UploadCSVCategory.php
1 <?php 2 /* 3 * This file is part of EC-CUBE 4 * 5 * Copyright(c) 2000-2007 LOCKON CO.,LTD. All Rights Reserved. 6 * 7 * http://www.lockon.co.jp/ 8 * 9 * This program is free software; you can redistribute it and/or 10 * modify it under the terms of the GNU General Public License 11 * as published by the Free Software Foundation; either version 2 12 * of the License, or (at your option) any later version. 13 * 14 * This program is distributed in the hope that it will be useful, 15 * but WITHOUT ANY WARRANTY; without even the implied warranty of 16 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 17 * GNU General Public License for more details. 18 * 19 * You should have received a copy of the GNU General Public License 20 * along with this program; if not, write to the Free Software 21 * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. 22 */ 23 // {{{ requires 24 require_once(CLASS_PATH . "pages/LC_Page.php"); 25 26 /** 27 * カテゴリを CSV でアップロードする. 28 * 29 * LC_Page_Admin_Products_UploadCSV をカスタマイズする場合はこのクラスを編集する. 30 * 31 * @package Page 32 * @author Ryuichi Tokugami 33 * @version $Id$ 34 */ 35 class LC_Page_Admin_Products_UploadCSVCategory extends LC_Page_Admin_Products_UploadCSV { 36 37 // }}} 38 // {{{ functions 39 40 /** 41 * Page を初期化する. 42 * 43 * @return void 44 */ 45 function init() { 46 parent::init(); 47 $this->tpl_mainpage = 'products/upload_csv_category.tpl'; 48 $this->tpl_subnavi = 'products/subnavi.tpl'; 49 $this->tpl_mainno = 'products'; 50 $this->tpl_subno = 'upload_csv_category'; 51 } 52 53 /** 54 * Page のプロセス. 55 * 56 * @return void 57 */ 58 function process() { 59 $conn = new SC_DBConn(); 60 $objView = new SC_AdminView(); 61 $objSess = new SC_Session(); 62 $objDb = new SC_Helper_DB_Ex(); 63 64 // 認証可否の判定 65 SC_Utils_Ex::sfIsSuccess($objSess); 66 67 // ファイル管理クラス 68 $this->objUpFile = new SC_UploadFile(IMAGE_TEMP_DIR, IMAGE_SAVE_DIR); 69 // ファイル情報の初期化 70 $this->lfInitFile(); 71 // パラメータ管理クラス 72 $this->objFormParam = new SC_FormParam(); 73 // パラメータ情報の初期化 74 $this->lfInitParam(); 75 $colmax = $this->objFormParam->getCount(); 76 $this->objFormParam->setHtmlDispNameArray(); 77 $this->arrTitle = $this->objFormParam->getHtmlDispNameArray(); 78 79 if (!isset($_POST['mode'])) $_POST['mode'] = ""; 80 81 switch($_POST['mode']) { 82 case 'csv_upload': 83 $err = false; 84 // エラーチェック 85 $arrErr['csv_file'] = $this->objUpFile->makeTempFile('csv_file'); 86 87 if($arrErr['css_file'] == "") { 88 $arrErr = $this->objUpFile->checkEXISTS(); 89 } 90 91 // 実行時間を制限しない 92 set_time_limit(0); 93 94 // 出力をバッファリングしない(==日本語自動変換もしない) 95 ob_end_clean(); 96 97 // IEのために256バイト空文字出力 98 echo str_pad('',256); 99 100 if(empty($arrErr['csv_file'])) { 101 // 一時ファイル名の取得 102 $filepath = $this->objUpFile->getTempFilePath('csv_file'); 103 // エンコード 104 $enc_filepath = SC_Utils_Ex::sfEncodeFile($filepath, 105 CHAR_CODE, CSV_TEMP_DIR); 106 107 // レコード数を得る 108 $rec_count = $this->lfCSVRecordCount($enc_filepath); 109 110 $fp = fopen($enc_filepath, "r"); 111 $line = 0; // 行数 112 $regist = 0; // 登録数 113 114 $objQuery = new SC_Query(); 115 $objQuery->begin(); 116 117 echo "■ CSV登録進捗状況 <br/><br/>\n"; 118 119 while(!feof($fp) && !$err) { 120 $arrCSV = fgetcsv($fp, CSV_LINE_MAX); 121 122 // 行カウント 123 $line++; 124 125 if($line <= 1) { 126 continue; 127 } 128 129 // 項目数カウント 130 $max = count($arrCSV); 131 132 // 項目数が1以下の場合は無視する 133 if($max <= 1) { 134 continue; 135 } 136 137 // 項目数チェック 138 if($max != $colmax) { 139 echo "※ 項目数が" . $max . "個検出されました。項目数は" . $colmax . "個になります。</br>\n"; 140 $err = true; 141 } else { 142 // シーケンス配列を格納する。 143 $this->objFormParam->setParam($arrCSV, true); 144 $arrRet = $this->objFormParam->getHashArray(); 145 $this->objFormParam->setParam($arrRet); 146 // 入力値の変換 147 $this->objFormParam->convParam(); 148 // <br>なしでエラー取得する。 149 $arrCSVErr = $this->lfCheckError(); 150 } 151 152 // 入力エラーチェック 153 if(count($arrCSVErr) > 0) { 154 echo "<font color=\"red\">■" . $line . "行目でエラーが発生しました。</font></br>\n"; 155 foreach($arrCSVErr as $val) { 156 $this->printError($val); 157 } 158 $err = true; 159 } 160 161 if(!$err) { 162 $this->lfRegistProduct($objQuery, $line); 163 $regist++; 164 } 165 $arrParam = $this->objFormParam->getHashArray(); 166 167 if(!$err) echo $line." / ".$rec_count. "行目 (カテゴリID:".$arrParam['category_id']." / カテゴリ名:".$arrParam['category_name'].")\n<br />"; 168 flush(); 169 } 170 fclose($fp); 171 172 if(!$err) { 173 $objQuery->commit(); 174 echo "■" . $regist . "件のレコードを登録しました。"; 175 // カテゴリ件数カウント関数の実行 176 $objDb->sfCategory_Count($objQuery); 177 } else { 178 $objQuery->rollback(); 179 } 180 } else { 181 foreach($arrErr as $val) { 182 $this->printError($val); 183 } 184 } 185 echo "<br/><a href=\"javascript:window.close()\">→閉じる</a>"; 186 flush(); 187 exit; 188 break; 189 default: 190 break; 191 } 192 193 $objView->assignobj($this); 194 $objView->display(MAIN_FRAME); 195 } 196 197 /** 198 * デストラクタ. 199 * 200 * @return void 201 */ 202 function destroy() { 203 parent::destroy(); 204 } 205 206 207 /** 208 * ファイル情報の初期化を行う. 209 * 210 * @return void 211 */ 212 function lfInitFile() { 213 $this->objUpFile->addFile("CSVファイル", 'csv_file', array('csv'), 214 CSV_SIZE, true, 0, 0, false); 215 } 216 217 /** 218 * 入力情報の初期化を行う. 219 * 220 * @return void 221 */ 222 function lfInitParam() { 223 $this->objFormParam->addParam("カテゴリID","category_id",INT_LEN,"n",array("MAX_LENGTH_CHECK","NUM_CHECK")); 224 $this->objFormParam->addParam("カテゴリ名","category_name",STEXT_LEN,"KVa",array("EXIST_CHECK","SPTAB_CHECK","MAX_LENGTH_CHECK")); 225 $this->objFormParam->addParam("親カテゴリID","parent_category_id",INT_LEN,"n",array("MAX_LENGTH_CHECK","NUM_CHECK")); 226 $this->objFormParam->addParam("階層","level",INT_LEN,"n",array("MAX_LENGTH_CHECK","NUM_CHECK")); 227 $this->objFormParam->addParam("表示順","rank",INT_LEN,"n",array("MAX_LENGTH_CHECK","NUM_CHECK")); 228 // $this->objFormParam->addParam("削除フラグ","del_flg",INT_LEN,"n",array()); 229 } 230 231 /** 232 * カテゴリ登録を行う. 233 * 234 * @param SC_Query $objQuery SC_Queryインスタンス 235 * @param string|integer $line 処理中の行数 236 * @return void 237 */ 238 function lfRegistProduct($objQuery, $line = "") { 239 $objDb = new SC_Helper_DB_Ex(); 240 $arrRet = $this->objFormParam->getHashArray(); 241 foreach($arrRet as $key => $val) { 242 switch($key) { 243 // case 'recommend_comment6': 244 // break; 245 default: 246 if(!ereg("^dummy", $key)) { 247 $sqlval[$key] = $val; 248 } 249 break; 250 } 251 } 252 // 登録時間を生成(DBのnow()だとcommitした際、すべて同一の時間になってしまう) 253 $time = date("Y-m-d H:i:s"); 254 // 秒以下を生成 255 if($line != "") { 256 $microtime = sprintf("%06d", $line); 257 $time .= ".$microtime"; 258 } 259 $sqlval['update_date'] = $time; 260 $sqlval['creator_id'] = $_SESSION['member_id']; 261 $count = $objQuery->count("dtb_category", "category_id = ?", array($arrRet['category_id'])); 262 if($count != 0) { 263 // UPDATEの実行 264 echo "UPDATEの実行"; 265 $where = "category_id = ?"; 266 $objQuery->update("dtb_category", $sqlval, $where, array($sqlval['category_id'])); 267 } else { 268 // 新規登録 269 $sqlval['category_id'] = $arrRet['category_id']; 270 $sqlval['create_date'] = $time; 271 if($arrRet['rank'] == ""){ 272 // カテゴリ内で最大のランクを割り当てる 273 $sqlval['rank'] = $objQuery->max("dtb_category", "rank", "parent_category_id = ?", array($arrRet['parent_category_id'])) + 1; 274 } 275 // INSERTの実行 276 $objQuery->insert("dtb_category", $sqlval); 277 } 278 } 279 280 /** 281 * 入力チェックを行う. 282 * 283 * @return void 284 */ 285 function lfCheckError() { 286 // 入力データを渡す。 287 $arrRet = $this->objFormParam->getHashArray(); 288 $objErr = new SC_CheckError($arrRet); 289 $objErr->arrErr = $this->objFormParam->checkError(false); 290 if(count($objErr->arrErr) == 0) { 291 $objQuery = new SC_Query(); 292 // 存在する親カテゴリIDかチェック 293 if($arrRet['parent_category_id'] != 0){ 294 $count = $objQuery->count("dtb_category", "category_id = ?", array($arrRet['parent_category_id'])); 295 if($count == 0) { 296 $objErr->arrErr['parent_category_id'] = "※ 指定の親カテゴリID(".$arrRet['parent_category_id'].")は、存在しません。"; 297 } 298 } 299 } 300 return $objErr->arrErr; 301 } 302 303 /** 304 * CSVのカウント数を得る. 305 * 306 * @param string $file_name ファイルパス 307 * @return integer CSV のカウント数 308 */ 309 function lfCSVRecordCount($file_name) { 310 311 $count = 0; 312 $fp = fopen($file_name, "r"); 313 while(!feof($fp)) { 314 $arrCSV = fgetcsv($fp, CSV_LINE_MAX); 315 $count++; 316 } 317 318 return $count-1; 319 } 320 321 /** 322 * 引数の文字列をエラー出力する. 323 * 324 * 引数 $val の内容は, htmlspecialchars() によってサニタイズされ 325 * 326 * @param string $val 出力する文字列 327 * @return void 328 */ 329 function printError($val) { 330 echo "<span style=\"color: #FF0000\">" 331 . htmlspecialchars($val, ENT_QUOTES) 332 . "</span><br />\n"; 333 } 334 } 335 ?>