概要
EC-CUBEの案件で、旧サイトから改装したサイトに商品情報を移す際
新しく追加したカラムが登録されなかったというバグがあったので、
その解決方法をシェアします。
今回解説では、商品に材料(material)カラムを追加した想定で説明します。
EC-CUBEの基礎を理解されている方向けです。
目次
-
CSVファイルフォーマットに新しく追加したカラムを追加する
-
CSV登録の際新しく追加したカラムの情報も登録される様にする
1.CSVファイルフォーマットに新しく追加したカラムを追加する
管理者画面の商品管理、商品CSV登録にあるCSVファイルフォーマットに新しく追加したカラムを追加します。
src/Customize/Controller/Admin/Product/CsvImportController.php
を編集
(私はappにコピーしてからそれを編集しています。)
/**
* 商品登録CSVヘッダー定義
*
* @return array
*/
protected function getProductCsvHeader()
{
return [
trans('admin.product.product_csv.product_id_col') => [
'id' => 'id',
'description' => 'admin.product.product_csv.product_id_description',
'required' => false,
],
{# 省略 #}
trans('admin.product.product_csv.product_class_visible_flag_col') => [
'id' => 'product_class_visible_flg',
'description' => 'admin.product.product_csv.product_class_visible_flag_description',
'required' => false,
],
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 追加カラム ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ここから ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
trans('admin.product.product_csv.material_col') => [
'id' => 'material',
'description' => 'admin.product.product_csv.material_description',
'required' => false,
],
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ここまで ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
];
}
※一様今回は見本に倣ってmessages.ja.yaml
から文字列を持ってくる様にしたので、
src/Eccube/Resource/locale/messages.ja.yaml
も編集します
(こちらもappにコピーしそれを編集したほうが良いと思います。)
# どこか適当なところに...
admin.product.product_csv.material_col: 材料
admin.product.product_csv.material_description: ''
2.CSV登録の際新しく追加したカラムの情報も登録される様にする
CSVファイルをアップロード
から新しいカラムの情報を含むCSVファイルを登録したときに、
データベースに登録される様に処理を追加します。
実際にcsvアップロードの処理は先ほどと同じCsvImportController.php
の
csvProduct
メソッドで行っています。
CsvImportController.php
の350行目あたりにこのコードを追加します。
if (isset($row[$headerByKey['material']])) {
if (StringUtil::isNotBlank($row[$headerByKey['material']])) {
$Product->setMaterial(StringUtil::trimAll($row[$headerByKey['material']]));
} else {
$Product->setMaterial(null);
}
}
これで完了!
まとめ
EC-CUBEはもともと作り込まれたシステムにカスタマイズする形なので、
コメントアウトも多く、コピペすればなんとなくできてしまいました。。。
コードリーディングさえできれば初心者でも取っ掛かりやすいですね!