Ticket #236 (closed 新規開発: 修正済)
CSVからカテゴリを登録できるようにしました。
Reported by: | miningbrownie | Owned by: | miningbrownie |
---|---|---|---|
Priority: | 中 | Milestone: | EC-CUBE2.x.x |
Component: | 管理画面 | Version: | 2.0.1(正式版) |
Keywords: | Cc: | ||
修正済み: |
Description (last modified by miningbrownie) (diff)
http://webml.ec-cube.net/comu-ml/200802/msg00000.html
大量のカテゴリを作成するときに楽なようにCSVからの登録を出来るようにしました。
「商品管理」に「カテゴリーCSV」のメニューが出来ます。
仕様
CSVの項目は
1項目:カテゴリID
2項目:カテゴリ名(※ 必須)
3項目:親カテゴリID
4項目:階層
5項目:表示順
となっております。
カテゴリID
未入力の場合現在あるカテゴリIDの最大値+1がカテゴリIDになります。
親カテゴリID
未入力の場合、0となります。 存在しない場合はエラーとなります。
階層
未入力かつ親カテゴリIDも未入力の場合、1になります。 未入力で親カテゴリがある場合、親カテゴリの階層+1になります。
表示順
未入力の場合、同じ親カテゴリIDの中で一番大きな値がつきます。
パッチ
diff -urN eccube-2.0.1.org/data/Smarty/templates/default/admin/products/subnavi.tpl eccube-2.0.1/data/Smarty/templates/default/admin/products/subnavi.tpl --- eccube-2.0.1.org/data/Smarty/templates/default/admin/products/subnavi.tpl 2007-10-29 12:06:29.000000000 +0900 +++ eccube-2.0.1/data/Smarty/templates/default/admin/products/subnavi.tpl 2008-02-02 08:31:58.000000000 +0900 @@ -33,7 +33,9 @@ <tr><td><img src="<!--{$TPL_DIR}-->img/contents/navi_line.gif" width="140" height="2" alt=""></td></tr> <tr><td class=<!--{if $tpl_subno != 'category'}-->"navi"<!--{else}-->"navi-on"<!--{/if}-->><a href="./category.php" onMouseOver="naviStyleChange('category', '#a5a5a5')" <!--{if $tpl_subno != 'category'}-->onMouseOut="naviStyleChange('category', '#636469')"<!--{/if}--> id="category"><img src="<!--{$TPL_DIR}-->img/contents/icon.jpg" width="15" height="9" alt="" border="0"><span class="navi_text">カテゴリー管理</span></a></td></tr> <tr><td><img src="<!--{$TPL_DIR}-->img/contents/navi_line.gif" width="140" height="2" alt=""></td></tr> - <tr><td class=<!--{if $tpl_subno != 'product_rank'}-->"navi"<!--{else}-->"navi-on"<!--{/if}-->><a href="./product_rank.php" onMouseOver="naviStyleChange('product_rank', '#a5a5a5')" <!--{if $tpl_subno != 'product_rank'}-->onMouseOut="naviStyleChange('product_rank', '#636469')"<!--{/if}--> id="product_rank"><img src="<!--{$TPL_DIR}-->img/contents/icon.jpg" width="15" height="9" alt="" border="0"><span class="navi_text">商品並び替え</span></a></td></tr> + <tr><td class=<!--{if $tpl_subno != 'upload_csv_category'}-->"navi"<!--{else}-->"navi-on"<!--{/if}-->><a href="./upload_csv_category.php" onMouseOver="naviStyleChange('upload_csv_category', '#a5a5a5')" <!--{if $tpl_subno != 'upload_csv_category'}-->onMouseOut="naviStyleChange('upload_csv_category', '#636469')"<!--{/if}--> id="upload_csv_category"><img src="<!--{$TPL_DIR}-->img/contents/icon.jpg" width="15" height="9" alt="" border="0"><span class="navi_text">カテゴリーCSV</span></a></td></tr> + <tr><td><img src="<!--{$TPL_DIR}-->img/contents/navi_line.gif" width="140" height="2" alt=""></td></tr> + <tr><td class=<!--{if $tpl_subno != 'product_rank'}-->"navi"<!--{else}-->"navi-on"<!--{/if}-->><a href="./product_rank.php" onMouseOver="naviStyleChange('product_rank', '#a5a5a5')" <!--{if $tpl_subno != 'product_rank'}-->onMouseOut="naviStyleChange('product_rank', '#636469')"<!--{/if}--> id="product_rank"><img src="<!--{$TPL_DIR}-->img/contents/icon.jpg" width="15" height="9" alt="" border="0"><span class="navi_text">商品並び替え</span></a></td></tr> <tr><td><img src="<!--{$TPL_DIR}-->img/contents/navi_line.gif" width="140" height="2" alt=""></td></tr> <tr><td class=<!--{if $tpl_subno != 'review'}-->"navi"<!--{else}-->"navi-on"<!--{/if}-->><a href="./review.php" onMouseOver="naviStyleChange('review', '#a5a5a5')" <!--{if $tpl_subno != 'review'}-->onMouseOut="naviStyleChange('review', '#636469')"<!--{/if}--> id="review"><img src="<!--{$TPL_DIR}-->img/contents/icon.jpg" width="15" height="9" alt="" border="0"><span class="navi_text">レビュー管理</span></a></td></tr> <tr><td><img src="<!--{$TPL_DIR}-->img/contents/navi_line.gif" width="140" height="2" alt=""></td></tr> diff -urN eccube-2.0.1.org/data/Smarty/templates/default/admin/products/upload_csv_category.tpl eccube-2.0.1/data/Smarty/templates/default/admin/products/upload_csv_category.tpl --- eccube-2.0.1.org/data/Smarty/templates/default/admin/products/upload_csv_category.tpl 1970-01-01 09:00:00.000000000 +0900 +++ eccube-2.0.1/data/Smarty/templates/default/admin/products/upload_csv_category.tpl 2008-02-02 08:31:58.000000000 +0900 @@ -0,0 +1,135 @@ +<!--{* +/* + * This file is part of EC-CUBE + * + * Copyright(c) 2000-2007 LOCKON CO.,LTD. All Rights Reserved. + * + * http://www.lockon.co.jp/ + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + */ +*}--> +<!--★★メインコンテンツ★★--> +<form name="form1" id="form1" method="post" action="<!--{$smarty.server.PHP_SELF|escape}-->" enctype="multipart/form-data" onSubmit="winSubmit('','form1', 'upload', 500, 400)"> +<input type="hidden" name="mode" value="csv_upload"> +<table width="878" border="0" cellspacing="0" cellpadding="0" summary=" "> + <tr valign="top"> + <td background="<!--{$TPL_DIR}-->img/contents/navi_bg.gif" height="402"> + <!-- サブナビ --> + <!--{include file=$tpl_subnavi}--> + </td> + <td class="mainbg"> + <table width="737" border="0" cellspacing="0" cellpadding="0" summary=" "> + <!--メインエリア--> + <tr> + <td align="center"> + <table width="706" border="0" cellspacing="0" cellpadding="0" summary=" "> + <tr><td height="14"></td></tr> + <tr> + <td colspan="3"><img src="<!--{$TPL_DIR}-->img/contents/main_top.jpg" width="706" height="14" alt=""></td> + </tr> + <tr> + <td background="<!--{$TPL_DIR}-->img/contents/main_left.jpg"><img src="<!--{$TPL_DIR}-->img/common/_.gif" width="14" height="1" alt=""></td> + <td bgcolor="#cccccc"> + <table width="678" border="0" cellspacing="0" cellpadding="0" summary=" "> + <tr> + <td colspan="3"><img src="<!--{$TPL_DIR}-->img/contents/contents_title_top.gif" width="678" height="7" alt=""></td> + </tr> + <tr> + <td background="<!--{$TPL_DIR}-->img/contents/contents_title_left_bg.gif"><img src="<!--{$TPL_DIR}-->img/contents/contents_title_left.gif" width="22" height="12" alt=""></td> + <td bgcolor="#636469" width="638" class="fs14n"><span class="white"><!--コンテンツタイトル-->カテゴリ登録CSV</span></td> + <td background="<!--{$TPL_DIR}-->img/contents/contents_title_right_bg.gif"><img src="<!--{$TPL_DIR}-->img/common/_.gif" width="18" height="1" alt=""></td> + </tr> + <tr> + <td colspan="3"><img src="<!--{$TPL_DIR}-->img/contents/contents_title_bottom.gif" width="678" height="7" alt=""></td> + </tr> + <tr> + <td colspan="3"><img src="<!--{$TPL_DIR}-->img/contents/main_bar.jpg" width="678" height="10" alt=""></td> + </tr> + </table> + + <!--{if $tpl_errtitle != ""}--> + <table width="678" border="0" cellspacing="1" cellpadding="5" summary=" " bgcolor="#cccccc"> + <tr><td bgcolor="#ffffff"> + <span class="red12"><!--{$tpl_errtitle}--><br><br></span> + <!--{foreach key=key item=item from=$arrCSVErr}--> + <span class="red12"><!--{$item}--> + <!--{if $key != 'blank'}--> + [値:<!--{$arrParam[$key]}-->] + <!--{/if}--> + <br></span> + <!--{/foreach}--> + </td></tr> + </table> + <!--{/if}--> + + <!--▼登録テーブルここから--> + <table width="678" border="0" cellspacing="1" cellpadding="5" summary=" " bgcolor="#cccccc"> + <tr class="fs12n"> + <td bgcolor="#f0f0f0" width="110">CSVファイル</td> + <td bgcolor="#ffffff" width="607"> + <span class="red12"><!--{$arrErr.csv_file}--></span> + <input type="file" name="csv_file" size="60" class="box60" /><span class="red10"> (1行目タイトル行)</span></td> + </tr> + <tr class="fs12n"> + <td bgcolor="#f0f0f0" width="110">登録情報</td> + <td bgcolor="#ffffff" width="607"> + <!--{foreach name=title key=key item=item from=$arrTitle}--> + <!--{$smarty.foreach.title.iteration}-->項目:<!--{$item}--><br> + <!--{/foreach}--> + </td> + </tr> + </table> + <!--▲登録テーブルここまで--> + <table width="678" border="0" cellspacing="0" cellpadding="0" summary=" "> + <tr> + <td bgcolor="#cccccc"><img src="<!--{$TPL_DIR}-->img/common/_.gif" width="1" height="5" alt=""></td> + <td><img src="<!--{$TPL_DIR}-->img/contents/tbl_top.gif" width="676" height="7" alt=""></td> + <td bgcolor="#cccccc"><img src="<!--{$TPL_DIR}-->img/common/_.gif" width="1" height="5" alt=""></td> + </tr> + <tr> + <td bgcolor="#cccccc"><img src="<!--{$TPL_DIR}-->img/common/_.gif" width="1" height="10" alt=""></td> + <td bgcolor="#e9e7de" align="center"> + <table border="0" cellspacing="0" cellpadding="0" summary=" "> + <tr> + <td> + <input type="image" onMouseover="chgImgImageSubmit('<!--{$TPL_DIR}-->img/contents/btn_regist_on.jpg',this)" onMouseout="chgImgImageSubmit('<!--{$TPL_DIR}-->img/contents/btn_regist.jpg',this)" src="<!--{$TPL_DIR}-->img/contents/btn_regist.jpg" width="123" height="24" alt="この内容で登録する" border="0" name="subm" > + </td> + </tr> + </table> + </td> + <td bgcolor="#cccccc"><img src="<!--{$TPL_DIR}-->img/common/_.gif" width="1" height="10" alt=""></td> + </tr> + <tr> + <td colspan="3"><img src="<!--{$TPL_DIR}-->img/contents/tbl_bottom.gif" width="678" height="8" alt=""></td> + </tr> + </table> + </td> + <td background="<!--{$TPL_DIR}-->img/contents/main_right.jpg"><img src="<!--{$TPL_DIR}-->img/common/_.gif" width="14" height="1" alt=""></td> + </tr> + <tr> + <td colspan="3"><img src="<!--{$TPL_DIR}-->img/contents/main_bottom.jpg" width="706" height="14" alt=""></td> + </tr> + <tr><td height="30"></td></tr> + </table> + </td> + </tr> + <!--メインエリア--> + </table> + </td> + </tr> +</form> +</table> +<!--▲CONTENTS--> \ ファイル末尾に改行がありません diff -urN eccube-2.0.1.org/data/class_extends/page_extends/admin/products/LC_Page_Admin_Products_UploadCSVCategory_Ex.php eccube-2.0.1/data/class_extends/page_extends/admin/products/LC_Page_Admin_Products_UploadCSVCategory_Ex.php --- eccube-2.0.1.org/data/class_extends/page_extends/admin/products/LC_Page_Admin_Products_UploadCSVCategory_Ex.php 1970-01-01 09:00:00.000000000 +0900 +++ eccube-2.0.1/data/class_extends/page_extends/admin/products/LC_Page_Admin_Products_UploadCSVCategory_Ex.php 2008-02-02 08:31:58.000000000 +0900 @@ -0,0 +1,363 @@ +<?php +/* + * This file is part of EC-CUBE + * + * Copyright(c) 2000-2007 LOCKON CO.,LTD. All Rights Reserved. + * + * http://www.lockon.co.jp/ + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + */ + +// {{{ requires +require_once(CLASS_PATH . "pages/admin/products/LC_Page_Admin_Products_UploadCSV.php"); + +/** + * CSV アップロード のページクラス(拡張) + * + * LC_Page_Admin_Products_UploadCSV をカスタマイズする場合はこのクラスを編集する. + * + * @package Page + * @author LOCKON CO.,LTD. + * @version $$Id: LC_Page_Admin_Products_UploadCSV_Ex.php 16741 2007-11-08 00:43:24Z adachi $$ + */ +class LC_Page_Admin_Products_UploadCSVCategory_Ex extends LC_Page_Admin_Products_UploadCSV { + + // }}} + // {{{ functions + + /** + * Page を初期化する. + * + * @return void + */ + function init() { + parent::init(); + $this->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登録進捗状況 <br/><br/>\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 . "個になります。</br>\n"; + $err = true; + } else { + // シーケンス配列を格納する。 + $this->objFormParam->setParam($arrCSV, true); + $arrRet = $this->objFormParam->getHashArray(); + $this->objFormParam->setParam($arrRet); + // 入力値の変換 + $this->objFormParam->convParam(); + // <br>なしでエラー取得する。 + $arrCSVErr = $this->lfCheckError(); + } + + // 入力エラーチェック + if(count($arrCSVErr) > 0) { + echo "<font color=\"red\">■" . $line . "行目でエラーが発生しました。</font></br>\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<br />"; + 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 "<br/><a href=\"javascript:window.close()\">→閉じる</a>"; + 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")); + $this->objFormParam->addParam("階層","level",INT_LEN,"n",array("MAX_LENGTH_CHECK","NUM_CHECK")); + $this->objFormParam->addParam("表示順","rank",INT_LEN,"n",array("MAX_LENGTH_CHECK","NUM_CHECK")); + // $this->objFormParam->addParam("削除フラグ","del_flg",INT_LEN,"n",array()); + } + + /** + * カテゴリ登録を行う. + * + * @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(); + foreach($arrRet as $key => $val) { + switch($key) { + case 'parent_category_id': + + break; + default: + if(!ereg("^dummy", $key)) { + $sqlval[$key] = $val; + } + break; + } + } + // 登録時間を生成(DBのnow()だとcommitした際、すべて同一の時間になってしまう) + $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']; + //カテゴリ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; + } + } + + //親カテゴリIDの設定 + if($arrRet['parent_category_id'] == ""){ + $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; + } + + + if($update) { + // UPDATEの実行 + echo "UPDATEの実行"; + $where = "category_id = ?"; + $objQuery->update("dtb_category", $sqlval, $where, array($sqlval['category_id'])); + } else { + // 新規登録 + + $sqlval['create_date'] = $time; + if($arrRet['rank'] == ""){ + // カテゴリ内で最大のランクを割り当てる + $sqlval['rank'] = $objQuery->max("dtb_category", "rank", "parent_category_id = ?", array($arrRet['parent_category_id'])) + 1; + } + // INSERTの実行 + $objQuery->insert("dtb_category", $sqlval); + } + } + + /** + * 入力チェックを行う. + * + * @return void + */ + function lfCheckError() { + // 入力データを渡す。 + $arrRet = $this->objFormParam->getHashArray(); + $objErr = new SC_CheckError($arrRet); + $objErr->arrErr = $this->objFormParam->checkError(false); + if(count($objErr->arrErr) == 0) { + $objQuery = new SC_Query(); + // 存在する親カテゴリIDかチェック + if($arrRet['parent_category_id'] != 0){ + $count = $objQuery->count("dtb_category", "category_id = ?", array($arrRet['parent_category_id'])); + if($count == 0) { + $objErr->arrErr['parent_category_id'] = "※ 指定の親カテゴリID(".$arrRet['parent_category_id'].")は、存在しません。"; + } + } + } + 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 "<font color=\"red\">" + . htmlspecialchars($val, ENT_QUOTES) + . "</font></br>\n"; + } +} +?> diff -urN eccube-2.0.1.org/html/admin/products/upload_csv_category.php eccube-2.0.1/html/admin/products/upload_csv_category.php --- eccube-2.0.1.org/html/admin/products/upload_csv_category.php 1970-01-01 09:00:00.000000000 +0900 +++ eccube-2.0.1/html/admin/products/upload_csv_category.php 2008-02-01 11:54:42.000000000 +0900 @@ -0,0 +1,35 @@ +<?php +/* + * This file is part of EC-CUBE + * + * Copyright(c) 2000-2007 LOCKON CO.,LTD. All Rights Reserved. + * + * http://www.lockon.co.jp/ + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + */ + +// {{{ requires +require_once("../../require.php"); +require_once(CLASS_EX_PATH . "page_extends/admin/products/LC_Page_Admin_Products_UploadCSVCategory_Ex.php"); + +// }}} +// {{{ generate page + +$objPage = new LC_Page_Admin_Products_UploadCSVCategory_Ex(); +register_shutdown_function(array($objPage, "destroy")); +$objPage->init(); +$objPage->process(); +?>
パッチは少し長くなってしまったので添付もします。
Attachments
Change History
comment:2 Changed 15 years ago by nanasess
- Owner changed from somebody to nanasess
- Status changed from new to assigned
上記だと, page_extends は, 自動アップデート機能で更新されない領域ですので, 更新できるようにパッチを作ってみました.
ちょっと動作確認ができない環境にいるため, どなたかテストして頂けると助かります...
パッチも添付しておきます.
Index: data/class_extends/page_extends/admin/products/LC_Page_Admin_Products_UploadCSVCategory_Ex.php =================================================================== --- data/class_extends/page_extends/admin/products/LC_Page_Admin_Products_UploadCSVCategory_Ex.php (revision 17037) +++ data/class_extends/page_extends/admin/products/LC_Page_Admin_Products_UploadCSVCategory_Ex.php (working copy) @@ -1,18 +1,38 @@ <?php - +/* + * This file is part of EC-CUBE + * + * Copyright(c) 2000-2007 LOCKON CO.,LTD. All Rights Reserved. + * + * http://www.lockon.co.jp/ + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + */ // {{{ requires -require_once(CLASS_PATH . "pages/admin/products/LC_Page_Admin_Products_UploadCSV.php"); +require_once(CLASS_PATH . "pages/admin/products/LC_Page_Admin_Products_UploadCSVCategory.php"); /** - * CSV アップロード のページクラス(拡張) + * カテゴリ CSV アップロード のページクラス(拡張) * - * LC_Page_Admin_Products_UploadCSV をカスタマイズする場合はこのクラスを編集する. + * LC_Page_Admin_Products_UploadCSVCategory をカスタマイズする場合はこのクラスを編集する. * * @package Page * @author LOCKON CO.,LTD. - * @version $$Id: LC_Page_Admin_Products_UploadCSV_Ex.php 16741 2007-11-08 00:43:24Z adachi $$ + * @version $Id$ */ -class LC_Page_Admin_Products_UploadCSVCategory_Ex extends LC_Page_Admin_Products_UploadCSV { +class LC_Page_Admin_Products_UploadCSVCategory_Ex extends LC_Page_Admin_Products_UploadCSVCategory { // }}} // {{{ functions @@ -24,10 +44,6 @@ */ function init() { parent::init(); - $this->tpl_mainpage = 'products/upload_csv_category.tpl'; - $this->tpl_subnavi = 'products/subnavi.tpl'; - $this->tpl_mainno = 'products'; - $this->tpl_subno = 'upload_csv_category'; } /** @@ -36,142 +52,7 @@ * @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登録進捗状況 <br/><br/>\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 . "個になります。</br>\n"; - $err = true; - } else { - // シーケンス配列を格納する。 - $this->objFormParam->setParam($arrCSV, true); - $arrRet = $this->objFormParam->getHashArray(); - $this->objFormParam->setParam($arrRet); - // 入力値の変換 - $this->objFormParam->convParam(); - // <br>なしでエラー取得する。 - $arrCSVErr = $this->lfCheckError(); - } - - // 入力エラーチェック - if(count($arrCSVErr) > 0) { - echo "<font color=\"red\">■" . $line . "行目でエラーが発生しました。</font></br>\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<br />"; - 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 "<br/><a href=\"javascript:window.close()\">→閉じる</a>"; - flush(); - exit; - break; - default: - break; - } - - $objView->assignobj($this); - $objView->display(MAIN_FRAME); + parent::process(); } /** @@ -182,134 +63,4 @@ 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")); - $this->objFormParam->addParam("階層","level",INT_LEN,"n",array("MAX_LENGTH_CHECK","NUM_CHECK")); - $this->objFormParam->addParam("表示順","rank",INT_LEN,"n",array("MAX_LENGTH_CHECK","NUM_CHECK")); - // $this->objFormParam->addParam("削除フラグ","del_flg",INT_LEN,"n",array()); - } - - /** - * カテゴリ登録を行う. - * - * @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(); - foreach($arrRet as $key => $val) { - switch($key) { - // case 'recommend_comment6': - // break; - default: - if(!ereg("^dummy", $key)) { - $sqlval[$key] = $val; - } - break; - } - } - // 登録時間を生成(DBのnow()だとcommitした際、すべて同一の時間になってしまう) - $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']; - $count = $objQuery->count("dtb_category", "category_id = ?", array($arrRet['category_id'])); - if($count != 0) { - // UPDATEの実行 - echo "UPDATEの実行"; - $where = "category_id = ?"; - $objQuery->update("dtb_category", $sqlval, $where, array($sqlval['category_id'])); - } else { - // 新規登録 - $sqlval['category_id'] = $arrRet['category_id']; - $sqlval['create_date'] = $time; - if($arrRet['rank'] == ""){ - // カテゴリ内で最大のランクを割り当てる - $sqlval['rank'] = $objQuery->max("dtb_category", "rank", "parent_category_id = ?", array($arrRet['parent_category_id'])) + 1; - } - // INSERTの実行 - $objQuery->insert("dtb_category", $sqlval); - } - } - - /** - * 入力チェックを行う. - * - * @return void - */ - function lfCheckError() { - // 入力データを渡す。 - $arrRet = $this->objFormParam->getHashArray(); - $objErr = new SC_CheckError($arrRet); - $objErr->arrErr = $this->objFormParam->checkError(false); - if(count($objErr->arrErr) == 0) { - $objQuery = new SC_Query(); - // 存在する親カテゴリIDかチェック - if($arrRet['parent_category_id'] != 0){ - $count = $objQuery->count("dtb_category", "category_id = ?", array($arrRet['parent_category_id'])); - if($count == 0) { - $objErr->arrErr['parent_category_id'] = "※ 指定の親カテゴリID(".$arrRet['parent_category_id'].")は、存在しません。"; - } - } - } - 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 "<font color=\"red\">" - . htmlspecialchars($val, ENT_QUOTES) - . "</font></br>\n"; - } -} ?> Index: data/class/pages/admin/products/LC_Page_Admin_Products_UploadCSVCategory.php =================================================================== --- data/class/pages/admin/products/LC_Page_Admin_Products_UploadCSVCategory.php (revision 0) +++ data/class/pages/admin/products/LC_Page_Admin_Products_UploadCSVCategory.php (revision 0) @@ -0,0 +1,335 @@ +<?php +/* + * This file is part of EC-CUBE + * + * Copyright(c) 2000-2007 LOCKON CO.,LTD. All Rights Reserved. + * + * http://www.lockon.co.jp/ + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + */ +// {{{ requires +require_once(CLASS_PATH . "pages/LC_Page.php"); + +/** + * カテゴリを CSV でアップロードする. + * + * LC_Page_Admin_Products_UploadCSV をカスタマイズする場合はこのクラスを編集する. + * + * @package Page + * @author Ryuichi Tokugami + * @version $Id$ + */ +class LC_Page_Admin_Products_UploadCSVCategory extends LC_Page_Admin_Products_UploadCSV { + + // }}} + // {{{ functions + + /** + * Page を初期化する. + * + * @return void + */ + function init() { + parent::init(); + $this->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登録進捗状況 <br/><br/>\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 . "個になります。</br>\n"; + $err = true; + } else { + // シーケンス配列を格納する。 + $this->objFormParam->setParam($arrCSV, true); + $arrRet = $this->objFormParam->getHashArray(); + $this->objFormParam->setParam($arrRet); + // 入力値の変換 + $this->objFormParam->convParam(); + // <br>なしでエラー取得する。 + $arrCSVErr = $this->lfCheckError(); + } + + // 入力エラーチェック + if(count($arrCSVErr) > 0) { + echo "<font color=\"red\">■" . $line . "行目でエラーが発生しました。</font></br>\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<br />"; + 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 "<br/><a href=\"javascript:window.close()\">→閉じる</a>"; + 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")); + $this->objFormParam->addParam("階層","level",INT_LEN,"n",array("MAX_LENGTH_CHECK","NUM_CHECK")); + $this->objFormParam->addParam("表示順","rank",INT_LEN,"n",array("MAX_LENGTH_CHECK","NUM_CHECK")); + // $this->objFormParam->addParam("削除フラグ","del_flg",INT_LEN,"n",array()); + } + + /** + * カテゴリ登録を行う. + * + * @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(); + foreach($arrRet as $key => $val) { + switch($key) { + // case 'recommend_comment6': + // break; + default: + if(!ereg("^dummy", $key)) { + $sqlval[$key] = $val; + } + break; + } + } + // 登録時間を生成(DBのnow()だとcommitした際、すべて同一の時間になってしまう) + $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']; + $count = $objQuery->count("dtb_category", "category_id = ?", array($arrRet['category_id'])); + if($count != 0) { + // UPDATEの実行 + echo "UPDATEの実行"; + $where = "category_id = ?"; + $objQuery->update("dtb_category", $sqlval, $where, array($sqlval['category_id'])); + } else { + // 新規登録 + $sqlval['category_id'] = $arrRet['category_id']; + $sqlval['create_date'] = $time; + if($arrRet['rank'] == ""){ + // カテゴリ内で最大のランクを割り当てる + $sqlval['rank'] = $objQuery->max("dtb_category", "rank", "parent_category_id = ?", array($arrRet['parent_category_id'])) + 1; + } + // INSERTの実行 + $objQuery->insert("dtb_category", $sqlval); + } + } + + /** + * 入力チェックを行う. + * + * @return void + */ + function lfCheckError() { + // 入力データを渡す。 + $arrRet = $this->objFormParam->getHashArray(); + $objErr = new SC_CheckError($arrRet); + $objErr->arrErr = $this->objFormParam->checkError(false); + if(count($objErr->arrErr) == 0) { + $objQuery = new SC_Query(); + // 存在する親カテゴリIDかチェック + if($arrRet['parent_category_id'] != 0){ + $count = $objQuery->count("dtb_category", "category_id = ?", array($arrRet['parent_category_id'])); + if($count == 0) { + $objErr->arrErr['parent_category_id'] = "※ 指定の親カテゴリID(".$arrRet['parent_category_id'].")は、存在しません。"; + } + } + } + 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 "<span style=\"color: #FF0000\">" + . htmlspecialchars($val, ENT_QUOTES) + . "</span><br />\n"; + } +} +?>
comment:3 Changed 15 years ago by nanasess
- Owner changed from nanasess to miningbrownie
- Status changed from assigned to new
Note: See
TracTickets for help on using
tickets.