tpl_mainpage = 'products/upload_csv_category.tpl'; $this->tpl_subnavi = 'products/subnavi.tpl'; $this->tpl_mainno = 'products'; $this->tpl_subno = 'upload_csv_category'; } /** * Page のプロセス. * * @return void */ function process() { $conn = new SC_DBConn(); $objView = new SC_AdminView(); $objSess = new SC_Session(); $objDb = new SC_Helper_DB_Ex(); // 認証可否の判定 SC_Utils_Ex::sfIsSuccess($objSess); // ファイル管理クラス $this->objUpFile = new SC_UploadFile(IMAGE_TEMP_DIR, IMAGE_SAVE_DIR); // ファイル情報の初期化 $this->lfInitFile(); // パラメータ管理クラス $this->objFormParam = new SC_FormParam(); // パラメータ情報の初期化 $this->lfInitParam(); $colmax = $this->objFormParam->getCount(); $this->objFormParam->setHtmlDispNameArray(); $this->arrTitle = $this->objFormParam->getHtmlDispNameArray(); if (!isset($_POST['mode'])) $_POST['mode'] = ""; switch($_POST['mode']) { case 'csv_upload': $err = false; // エラーチェック $arrErr['csv_file'] = $this->objUpFile->makeTempFile('csv_file'); if($arrErr['css_file'] == "") { $arrErr = $this->objUpFile->checkEXISTS(); } // 実行時間を制限しない set_time_limit(0); // 出力をバッファリングしない(==日本語自動変換もしない) ob_end_clean(); // IEのために256バイト空文字出力 echo str_pad('',256); if(empty($arrErr['csv_file'])) { // 一時ファイル名の取得 $filepath = $this->objUpFile->getTempFilePath('csv_file'); // エンコード $enc_filepath = SC_Utils_Ex::sfEncodeFile($filepath, CHAR_CODE, CSV_TEMP_DIR); // レコード数を得る $rec_count = $this->lfCSVRecordCount($enc_filepath); $fp = fopen($enc_filepath, "r"); $line = 0; // 行数 $regist = 0; // 登録数 $objQuery = new SC_Query(); $objQuery->begin(); echo "■ CSV登録進捗状況

\n"; while(!feof($fp) && !$err) { $arrCSV = fgetcsv($fp, CSV_LINE_MAX); // 行カウント $line++; if($line <= 1) { continue; } // 項目数カウント $max = count($arrCSV); // 項目数が1以下の場合は無視する if($max <= 1) { continue; } // 項目数チェック if($max != $colmax) { echo "※ 項目数が" . $max . "個検出されました。項目数は" . $colmax . "個になります。
\n"; $err = true; } else { // シーケンス配列を格納する。 $this->objFormParam->setParam($arrCSV, true); $arrRet = $this->objFormParam->getHashArray(); $this->objFormParam->setParam($arrRet); // 入力値の変換 $this->objFormParam->convParam(); //
なしでエラー取得する。 $arrCSVErr = $this->lfCheckError(); } // 入力エラーチェック if(count($arrCSVErr) > 0) { echo "■" . $line . "行目でエラーが発生しました。
\n"; foreach($arrCSVErr as $val) { $this->printError($val); } $err = true; } if(!$err) { $this->lfRegistProduct($objQuery, $line); $regist++; } $arrParam = $this->objFormParam->getHashArray(); if(!$err) echo $line." / ".$rec_count. "行目 (カテゴリID:".$arrParam['category_id']." / カテゴリ名:".$arrParam['category_name'].")\n
"; flush(); } fclose($fp); if(!$err) { $objQuery->commit(); echo "■" . $regist . "件のレコードを登録しました。"; // カテゴリ件数カウント関数の実行 $objDb->sfCategory_Count($objQuery); } else { $objQuery->rollback(); } } else { foreach($arrErr as $val) { $this->printError($val); } } echo "
→閉じる"; flush(); exit; break; default: break; } $objView->assignobj($this); $objView->display(MAIN_FRAME); } /** * デストラクタ. * * @return void */ function destroy() { parent::destroy(); } /** * ファイル情報の初期化を行う. * * @return void */ function lfInitFile() { $this->objUpFile->addFile("CSVファイル", 'csv_file', array('csv'), CSV_SIZE, true, 0, 0, false); } /** * 入力情報の初期化を行う. * * @return void */ function lfInitParam() { $this->objFormParam->addParam("カテゴリID","category_id",INT_LEN,"n",array("MAX_LENGTH_CHECK","NUM_CHECK")); $this->objFormParam->addParam("カテゴリ名","category_name",STEXT_LEN,"KVa",array("EXIST_CHECK","SPTAB_CHECK","MAX_LENGTH_CHECK")); $this->objFormParam->addParam("親カテゴリID","parent_category_id",INT_LEN,"n",array("MAX_LENGTH_CHECK","NUM_CHECK")); } /** * カテゴリ登録を行う. * * @param SC_Query $objQuery SC_Queryインスタンス * @param string|integer $line 処理中の行数 * @return void */ function lfRegistProduct($objQuery, $line = "") { $objDb = new SC_Helper_DB_Ex(); $arrRet = $this->objFormParam->getHashArray(); //カテゴリID $update = false; if($arrRet['category_id'] != ""){ $sqlval['category_id'] = $arrRet['category_id']; $update = true; }else{ $category_id = $objQuery->max("dtb_category","category_id")+1; $sqlval['category_id'] = $category_id; $count = $objQuery->count("dtb_category", "category_id = ?", array($arrRet['category_id'])); if($count == 0){ $update = false; }else{ $update = true; } } // カテゴリ名 $sqlval['category_name'] = $arrRet['category_name']; // 親カテゴリID、レベル if ($arrRet['parent_category_id'] == 0) { $sqlval['parent_category_id'] = "0"; $sqlval['level'] = 1; } else { $sqlval['parent_category_id'] = $arrRet['parent_category_id']; $parent_level = $objQuery->get('dtb_category','level',"category_id = ?",array($sqlval['parent_category_id'])); $sqlval['level'] = $parent_level+1; } // その他 $time = date("Y-m-d H:i:s"); if($line != "") { $microtime = sprintf("%06d", $line); $time .= ".$microtime"; } $sqlval['update_date'] = $time; $sqlval['creator_id'] = $_SESSION['member_id']; // UPDATE if($update) { echo "UPDATE "; $where = "category_id = ?"; $objQuery->update("dtb_category", $sqlval, $where, array($sqlval['category_id'])); // 新規登録 } else { $sqlval['create_date'] = $time; // ランク if ($sqlval['parent_category_id'] == 0) { // ROOT階層で最大のランクを取得する。 $where = "parent_category_id = ?"; $sqlval['rank'] = $objQuery->max("dtb_category", "rank", $where, array($sqlval['parent_category_id'])) + 1; } else { // 親のランクを自分のランクとする。 $where = "category_id = ?"; $sqlval['rank'] = $objQuery->get("dtb_category", "rank", $where, array($sqlval['parent_category_id'])); // 追加レコードのランク以上のレコードを一つあげる。 $sqlup = "UPDATE dtb_category SET rank = (rank + 1) WHERE rank >= ?"; $objQuery->exec($sqlup, array($sqlval['rank'])); } echo "INSERT "; $objQuery->insert("dtb_category", $sqlval); } } /** * 入力チェックを行う. * * @return void */ function lfCheckError() { $arrRet = $this->objFormParam->getHashArray(); $objQuery = new SC_Query(); $objErr = new SC_CheckError($arrRet); $objErr->arrErr = $this->objFormParam->checkError(false); // 親カテゴリID設定 if ($arrRet['parent_category_id'] == 0) { $parent_category_id = "0"; } else { $parent_category_id = $arrRet['parent_category_id']; } // 存在する親カテゴリIDかチェック if(count($objErr->arrErr) == 0) { if($parent_category_id != 0){ $count = $objQuery->count("dtb_category", "category_id = ?", array($parent_category_id)); if($count == 0) { $objErr->arrErr['parent_category_id'] = "※ 指定の親カテゴリID(".$parent_category_id.")は、存在しません。"; } } } // 階層チェック if(!isset($objErr->arrErr['category_name']) && !isset($objErr->arrErr['parent_category_id'])) { $level = $objQuery->get("dtb_category", "level", "category_id = ?", array($parent_category_id)); if($level >= LEVEL_MAX) { $objErr->arrErr['category_name'] = "※ ".LEVEL_MAX."階層以上の登録はできません。
"; } } // 重複チェック if(!isset($objErr->arrErr['category_name']) && !isset($objErr->arrErr['parent_category_id'])) { $where = "parent_category_id = ? AND category_name = ?"; $arrCat = $objQuery->select("category_id, category_name", "dtb_category", $where, array($parent_category_id, $arrRet['category_name'])); if (empty($arrCat)) { $arrCat = array(array("category_id" => "", "category_name" => "")); } // 編集中のレコード以外に同じ名称が存在する場合 if ($arrCat[0]['category_id'] != $arrRet['category_id'] && $arrCat[0]['category_name'] == $_POST['category_name']) { $objErr->arrErr['category_name'] = "※ 既に同じ内容の登録が存在します。
"; } } return $objErr->arrErr; } /** * CSVのカウント数を得る. * * @param string $file_name ファイルパス * @return integer CSV のカウント数 */ function lfCSVRecordCount($file_name) { $count = 0; $fp = fopen($file_name, "r"); while(!feof($fp)) { $arrCSV = fgetcsv($fp, CSV_LINE_MAX); $count++; } return $count-1; } /** * 引数の文字列をエラー出力する. * * 引数 $val の内容は, htmlspecialchars() によってサニタイズされ * * @param string $val 出力する文字列 * @return void */ function printError($val) { echo "" . htmlspecialchars($val, ENT_QUOTES) . "
\n"; } } ?>