[EC-CUBE] 2.13 商品登録CSVで規格も新規登録する

商品登録CSVで規格も新規登録するカスタマイズです。下記サイトは詳細に説明してくださっていますが、私はかなり四苦八苦しましたのでメモしておきます。(注 新規サイトをカスタマイズしましたので、既存のサイトでも上手くいくかは素人のため未知の世界です)

とある金髪の電脳技師Ⅱ<システムエンジニア>
EC-CUBE開発コミュニティ・フォーラム 商品登録CSVで規格の有る商品を登録する

phpMyAdmin等で、データベースにアクセスし「dtb_csv」の下記を変更

no=3
parent_classcategory_id → classcategory_id1
親規格分類ID → 規格分類ID1
no=4
classcategory_id → classcategory_id2
規格分類ID → 規格分類ID2

上記の変更は手動で変更するよりSQLを実行すると早かったです

[php]
UPDATE dtb_csv SET col = "classcategory_id1", disp_name = "規格分類ID1" WHERE no = 3;
UPDATE dtb_csv SET col = "classcategory_id2", disp_name = "規格分類ID2" WHERE no = 4;
[/php]

 

data/class_extends/page_extends/admin/products/LC_Page_Admin_Products_UploadCSV_Ex.phpに追記(EC-CUBE本体)

(1)data/class/pages/admin/products/LC_Page_Admin_Products_UploadCSV.phplfCheckErrorDetail() {~}を コピーして
LC_Page_Admin_Products_UploadCSV_Ex.phpの{~}の最後に追記します。

[php]
class LC_Page_Admin_Products_UploadCSV_Ex extends LC_Page_Admin_Products_UploadCSV {

(ココに追記)
}
[/php]

 

(2)さらに下記を、lfCheckErrorDetail() {~}の最後に追記する
[php]
// 規格分類ID1の存在チェック
if (!$this->lfIsDbRecordMulti(‘dtb_classcategory’, ‘classcategory_id’, ‘classcategory_id1’, $item, ‘,’)) {
$arrErr[‘classcategory_id1’] = ‘※ 指定の規格分類ID1は、登録されていません。’;
}
// 規格分類ID2の存在チェック
if (!$this->lfIsDbRecordMulti(‘dtb_classcategory’, ‘classcategory_id’, ‘classcategory_id2’, $item, ‘,’)) {
$arrErr[‘classcategory_id2’] = ‘※ 指定の規格分類ID2は、登録されていません。’;
}
// 商品ID、規格分類ID1、規格分類ID2の組合せチェック
if ($item[‘product_class_id’] == ”) {
if ($this->objDb->sfIsRecord(‘dtb_products_class’, ‘product_id, classcategory_id1, classcategory_id2’
, array($item[‘product_id’], $item[‘classcategory_id1’], $item[‘classcategory_id2’]))
) {
$arrErr[‘classcategory_id’] = ‘※ 指定の商品ID、規格分類ID1、規格分類ID2の組合せは既に登録されています。’;
}
}
[/php]
[php]
public function lfCheckErrorDetail($item, $arrErr) {

(ココに追記)
}
[/php]

 

data/Smarty/templates/admin/products/classcategory.tpl 修正(EC-CUBE本体)

管理画面で規格分類IDが確認できるように、規格名を表示する部分の前にIDを表示するよう変更する。
[php]
<!–{* 規格分類ID *}–><!–{$arrClassCat[cnt].classcategory_id|h}–>: <!–{* 規格名 *}–><!–{$arrClassCat[cnt].name|h}–>
[/php]

 

下記のテーブルを修正(データベース)
  • dtb_productsを空に
  • dtb_products_classを空に
  • dtb_product_categoriesを空に
  • dtb_product_statusを空に
  • dtb_products_class_product_class_id_seqを開いて「sequence」の値を「1」に
  • dtb_products_product_id_seqを開いて「sequence」の値を「1」に
SQLを実行する方が早かったです(上記の変更)

[php]
DELETE FROM dtb_products;
DELETE FROM dtb_products_class;
UPDATE dtb_products_class_product_class_id_seq SET sequence = 0;
ALTER TABLE dtb_products_class_product_class_id_seq AUTO_INCREMENT = 1;
UPDATE dtb_products_product_id_seq SET sequence = 0;
ALTER TABLE dtb_products_product_id_seq AUTO_INCREMENT = 1;
DELETE FROM dtb_product_categories;
DELETE FROM dtb_product_status;
[/php]

 

あとは、管理画面からカテゴリー登録と規格登録をして準備Okです。(管理画面)

  1. 管理画面の商品カテゴリーでカテゴリを登録
  2. 管理画面の規格管理で規格を登録
  3. 商品マスターで [CSVダウンロード] して、データが空のファイルをダウンロード
  4. ダウンロードしたCSVファイルに、下記表を参考に商品データを登録
  5. 商品登録CSVで作成したCSVファイルをアップロード
必須項目一覧
商品ID 規格違いの商品は同じに
商品規格ID 新規登録(空)、更新時は必須
規格分類ID1 規格なしの時は「0」
規格分類ID2 規格なしの時は「0」
商品名 規格違いの商品は同じに
表示ステータス(公開・非公開) 規格違いの商品は同じに(1 or 2)
一覧-メインコメント 規格違いの商品は同じに
詳細-メインコメント 規格違いの商品は同じに
削除フラグ 規格毎に指定/(1 or 0)
販売価格 規格毎に指定
カテゴリID 規格違いの商品は同じにする。
ダブルクオーテーションで括れば複数指定可

 

【重要】「規格有無による登録レコード」の組み合わせについての注意点

参考にさせていただいたサイトに記載のある「規格有無による登録レコード例」の組み合わせは、最初、意味が解らなかったのですが、フォーラムで質問させていただき、ようやく理解(とまではいかないですが)できました。

普通は、下記のような組み合わせで、CSVデータを作成すると思いますが、

[規格id1/1] [規格id2/6] [削除フラグ/0] [バニラ] [Sサイズ] [アイスクリーム]
[規格id1/1] [規格id2/5] [削除フラグ/0] [バニラ] [Mサイズ] [アイスクリーム]
[規格id1/1] [規格id2/4] [削除フラグ/0] [バニラ] [Lサイズ] [アイスクリーム]

もしもアイスクリームの規格を削除した場合、[規格id1/0] [規格id2/0] [削除フラグ/1] [アイスクリーム]の組み合わせがなければ、価格を表示しない等の不具合が起こるのだそうです。

そのため、下記のような組み合わせで作成する必要があります。

[規格id1/0] [規格id2/0] [削除フラグ/1] [アイスクリーム]
[規格id1/1] [規格id2/6] [削除フラグ/0] [バニラ] [Sサイズ] [アイスクリーム]
[規格id1/1] [規格id2/5] [削除フラグ/0] [バニラ] [Mサイズ] [アイスクリーム]
[規格id1/1] [規格id2/4] [削除フラグ/0] [バニラ] [Lサイズ] [アイスクリーム]

 

■インストール直後、商品管理でCSVをダウンロードしてエクセルで開くと下記のようになっています。
 ※管理画面から規格を登録した場合には下記画像のようなデータが作成されます。
excel

 

■カスタマイズ後、規格もCSVで新規登録する場合のデータ例(商品規格IDは自動で振られる:更新時は必須)
excel-4

 

「アイスクリーム」の規格を削除することがないなら、[規格id1/0] [規格id2/0] [削除フラグ/1] の組み合わせは不要との事です。

くれぐれも入念にバックアップするか、テストサイトで試されることをお勧めします。