ECサイトでデータをCSV出力したい場面は、よくあります。
もちろん、EC-CUBE4には、データをCSV出力する機能がデフォルトで備わっています。
CSVで出力する項目の表示や非表示は、管理画面の店舗設定のCSV出力項目設定から設定できます。
しかし、新しくCSV出力する項目を追加する場合は、カスタマイズが必要です。
たとえば、受注データのお問合せのデータを出力したい場合、デフォルトではお問合せのデータは出力されません。
また、Entityをカスタマイズして新しく項目を追加した場合でも、そのままではデータの出力はされません。
出力したいデータがCSV出力されないと不便なため、この記事で、「CSVの出力項目をカスタマイズする方法」について説明します。
環境
EC-CUBE4.1.2
MySQL
結論
やることは以下の2つです。
- dtb_csvテーブルに追加したいレコードを追加する。
- 管理画面の設定から店舗設定のCSV出力項目設定をクリックして、出力する順番を並び替える。
例: 「受注データCSVをカスタマイズしたい。OrderEntityにサンプルテストの項目を追加した。フィールド名はsample_test。」と仮定して説明します。
dtb_csvテーブルに追加したいレコードを追加する。
migrationでもデータベース上で直接追加でもどちらの方法でもできますが、migrationの使用をおすすめします。
なぜなら、データの追加操作はmigrationで管理したほうがわかりやすいと考えるからです。
この記事では、どちらの方法も説明します。
migrationを使用して追加する場合
ターミナルを開いて以下のコマンドを入力してください。
新しいmigrationファイルが生成されます。
php bin/console doctrine:migrations:generate
次のコードを参考にupメソッドを修正します。
受注データCSVのカスタマイズなので、csv_type_idは3となります。
public function up(Schema $schema): void
{
// this up() migration is auto-generated, please modify it to your needs
$this->addSql("INSERT INTO dtb_csv(csv_type_id, creator_id, entity_name, field_name, reference_field_name, disp_name, sort_no, enabled, create_date, update_date, discriminator_type) VALUES(3, null, ?, 'sample_test', null, 'サンプルテスト', 72, 1, CURRENT_TIMESTAMP, CURRENT_TIMESTAMP, 'csv')", ['Eccube\\\\Entity\\\\Order']);
}
php bin/console doctrine:migrations:migrate
※upメソッドを変更して、再度コマンドを使用した時にNo migrations to execueが出る場合は、以下のコマンドを使用してから再度migrationしてください。
php bin/console doctrine:migrations:execute --down {migrationバージョン名}
例: migrationバージョンがVersion20230311002750の場合
php bin/console doctrine:migrations:execute --down 20230311002750
データベース上で直接追加する場合
phpMyAdminから、dtb_csvテーブルをクリックして、挿入をクリックします。
以下の内容を参考に、データを入力して、実行ボタンをクリックします。
レコードが追加されていれば成功です。
csv_type_id | 3 |
entity_name | Eccube\Entity\Order |
field_name | sample_test |
disp_name | サンプルテスト |
sort_no | 72 |
enabled | 1 |
create_date | テーブルを追加した日 |
update_date | テーブルを追加した日 |
discriminator_type | csv |
管理画面からCSV出力項目の出力する順番を並び替える。
dtb_csvにデータを追加したら、後は管理画面からCSV出力項目の順番を変更します。
店舗設定のCSV出力項目設定をクリックして、出力する順番を並び替えましょう。
並び替えたら保存して完了です。
あとは、出力したいCSVをダウンロードしてください。
CSV出力の仕組みについて
EC-CUBE4では、CSVを出力する際、dtb_csvテーブルを参照しています。
対象のEntityは、CSV.phpです。
それぞれのフィールドについて説明します。なお、idやcreate_dateのようなフィールドの説明は省きます。
- csv_type_id
-
mtb_csv_typeを参照しています。
ここで編集したいCSVの対象を指定します。
何も編集していなければ、以下のようになっているはずです。1 商品CSV
2 会員CSV
3 受注CSV
4 配送CSV
5 カテゴリCSV - creator_id
-
レコードを作成した人のIDです。
Eccube\Entity\Memberが対象のEntityです。
商品CSVとしてレコードを追加する場合に1を指定して、その他の場合はnullで大丈夫です。 - entity_name
-
csv_type_idと関連したEntityを指定します。
たとえば、商品CSVの場合は、ProductのEntityもしくは、ProductClassのEntityを指定します。 - field_name
-
Entityのフィールド名です。
関連したEntityを指定することもできます。
たとえば、ProductのEntityに関連しているProductImageやProductTagなどです。 - reference_field_name
-
field_nameがEntityの場合、field_nameで指定しているEntityのフィールド名を指定します。
field_nameがProductImageの場合、file_nameを指定するといった感じです。 - disp_name
-
画面に表示される項目名です。
わかりやすい項目名を設定することができます。 - sort_no
-
項目を表示する順番です。
後ほど説明する注意点も合わせてご欄ください。 - enabled
-
出力するか出力しないかを設定します。
出力する場合は1を、出力しない場合は0を指定します。
注意点
entity_nameは関連したEntityを指定すること
たとえば、商品CSVなのに、CustomerのEntityを指定してもうまくいきません。
関連したEntityを指定するようにしましょう。
sort_noは基本的には何でも良い
レコードを追加する際、この数値は基本的には何でも大丈夫です。
重複していても構いません。
なぜなら、レコードを追加したら、管理画面からCSV出力項目の並び順を操作するからです。
並び順を操作しない場合は、同じcsv_type_idの最大のsort_noにプラスして表示すればベターだと思います。
たとえば、受注CSVだとsort_noの最大が71までなので、72を指定する、といった感じです。
ちなみに、数値が重複したままだとどうなるか試してみました。
実際に試してみたところ、数値が重複していても問題なくCSV出力されました。
ただし、sort_noの意図を考えると数値順であることを想定しているはずなので、できる限り並び順は設定するようにしましょう。
まとめ
EC-CUBE4でCSVの出力項目をカスタマイズする方法について説明しました。
dtb_csvテーブルにレコードを追加すれば良いです。
仕組みさえ理解してしまえば、問題なくCSVの出力項目を追加していけると思います。
CSVの出力項目を追加する方法に悩んでいる方は、参考にしてみてください。