だ。ログ。

開発とかスノボとかやきうとか。

EC-CUBE3のCSVの新規出力データを作成し画面上でダウンロードできるようにする

CSVファイルで取り込んで連動する。多分今後もなかなかこの手法から脱却するのは難しいと思う。
各システムがその他の事を考えていないし、連動するシステムを想定した作りなんてしない。
だからCSVであればエクスポート可能だよーとしておけば、あとは運用側が創意工夫してなんとかしてね。となる訳で。
EC-CUBEにもCSVファイルを「作る」事は出来ても、項目を追加するのはちょっと手間が掛かる。

マスタデータの追加

設定 > システム情報管理 > マスターデータ管理を開き mtb_csv_type を選択する。
ここでCSVファイル出力用のプルダウンのデータを制御している。
IDには既存の数値とは被らないIDを入れ、Nameには好きな物を入れる。

設定 > 基本情報設定 > CSV出力項目設定を選択しプルダウンをクリックするとマスターデータで追加された項目が追加されている。
ただし問題は、CSV出力する項目が入力されていない。
ここからはSQLを利用する。

DBの流し込み

phpMyAdminを使うと簡単だが、まず設定項目に関してはdtb_csvに格納されている。
csv_idは自動採番なのであまり気にする必要はない。csv_typeはマスタデータで必要となるデータを入れる。
必要なデータはテーブル定義書あたりを参考にすると良い。マスタに既に入っているIDから出力するデータが何かと言う事自体は確認出来るので、それをコピーしてINSERT文を流し込む。
例) 1.商品(dtb_product) 2.会員(dtb_customer) 3.受注(dtb_order)

仮に会員データを取得したい場合はcsv_typeが2のデータを抽出し、マスターデータ管理で追加したIDに書き換えてINSERT文を実行。
csv_idは現在の最大値からネストした数値を割り振る。
新規マスターデータIDが6の場合はこんな感じ。

INSERT INTO `dtb_csv` (`csv_id`, `csv_type`, `creator_id`, `entity_name`, `field_name`, `reference_field_name`, `disp_name`, `rank`, `enable_flg`, `create_date`, `update_date`) VALUES
(999, 6, 1, 'Eccube\\Entity\\Customer', 'id', NULL, '会員ID', 1, 1, '2017-07-12 20:58:58', '2017-07-12 20:58:58'),

任意のページでCSVダウンロード出来るようにする。

間借りする形になるが、会員管理>会員マスター>CSVダウンロードに新たに今回のダウンロード項目を付け足し、管理画面からCSVダウンロード出来るようにする。

フックポイントの作成
/src/Eccube/ControllerProvider/AdminControllerProvider.php

#customerの部分に追加
#_customの部分は自分の好きな名前にしておく。
        $c->match('/customer/export_custom', '\Eccube\Controller\Admin\Customer\CustomerController::export_custom')->bind('admin_customer_export_custom');

イベントの作成
/src/Eccube/Controller/Admin/Customer/CustomerController.php

#public function export(Application $app, Request $request) をコピーする
#_customの部分はフックするポイントに合わせる。
    public function export_custom(Application $app, Request $request)
    {

        // タイムアウトを無効にする.
        set_time_limit(0);

        // sql loggerを無効にする.
        $em = $app['orm.em'];
        $em->getConfiguration()->setSQLLogger(null);

        $response = new StreamedResponse();
        $response->setCallback(function () use ($app, $request) {

            // CSV種別を元に初期化.
	  // ※※ここのinitCsvTypeを今回追加したcsv_typeの番号にする。
            $app['eccube.service.csv.export']->initCsvType(6);
	・
	・
	・
    }

テンプレートの追加
/src/Eccube/Resource/template/admin/Customer/index.twig

              <ul class="dropdown-menu">
                <li><a href="{{ url('admin_customer_export') }}">CSVダウンロード</a></li>
                <li><a href="{{ url('admin_setting_shop_csv', { id : constant('\\Eccube\\Entity\\Master\\CsvType::CSV_TYPE_CUSTOMER') }) }}">出力項目設定</a></li>
                <li><a href="/admin/customer/export_custom">カスタムCSVダウンロード</a></li>

ここまで設定すると、CSVダウンロードの項目にカスタムCSVがダウンロード出来るようになる。
項目は、設定>基本情報設定>CSV出力項目設定
で設定した物が出力されている事を確認。

細かいけど、こう言うカスタマイズって必要な物だから文献としてあって損は無いかなーと。