Edited at

[EC-CUBE4] コピペして少し修正して使える INSERT dtb_csv(CSV出力項目設定) マイグレーションファイル


概要

商品登録フォームや会員登録フォームに項目を追加したら管理画面のCSVダウンロード機能でCSVを出力できるようにしたいですよね。

データベーステーブルの dtb_csv に追加した項目の情報をINSERTしてあげればCSVをダウンロードできるようになります。

それでは、表題通り dtb_csv にデータを INSERT するマイグレーションファイルを作ってみましょう。

コピペして少し修正をすれば今すぐ使えるマイグレーションファイルを載せておきます。


コピペして少し修正して使えるマイグレーションファイル

<?php declare(strict_types=1);

namespace DoctrineMigrations;

use Doctrine\DBAL\Schema\Schema;
use Doctrine\Migrations\AbstractMigration;
use Doctrine\ORM\EntityManager;
use Eccube\Entity\Csv;
use Eccube\Entity\Master\CsvType;
use Eccube\Repository\CsvRepository;
use Eccube\Repository\Master\CsvTypeRepository;
use Symfony\Component\DependencyInjection\ContainerAwareInterface;
use Symfony\Component\DependencyInjection\ContainerInterface;

/**
* Auto-generated Migration: Please modify to your needs!
*/

final class Version20190411000001 extends AbstractMigration implements ContainerAwareInterface
{
/** @var ContainerInterface */
private $container;

/** @var EntityManager */
private $em;

/** @var CsvRepository */
private $CsvRepository;

/** @var CsvTypeRepository */
private $CsvTypeRepository;

/** @var array */
private $CsvType;

public function setContainer(ContainerInterface $container = null)
{
$this->container = $container;
$this->em = $this->container->get('doctrine.orm.entity_manager');

$this->CsvRepository = $this->em->getRepository("Eccube\Entity\Csv");
$this->CsvTypeRepository = $this->em->getRepository("Eccube\Entity\Master\CsvType");

$this->CsvType["Product"] = $this->CsvTypeRepository->find(1); // 商品CSV
$this->CsvType["Customer"] = $this->CsvTypeRepository->find(2); // 会員CSV
$this->CsvType["Order"] = $this->CsvTypeRepository->find(3); // 受注CSV
$this->CsvType["Shipping"] = $this->CsvTypeRepository->find(4); // 配送CSV
$this->CsvType["Category"] = $this->CsvTypeRepository->find(5); // カテゴリCSV
}

public function up(Schema $schema) : void
{
// INSERT dtb_csv したい内容
$arr_insert_csv = [
[
"csv_type" => $this->CsvType["Product"], // 商品CSV
"entity_name" => "Eccube\\Entity\\Product", // 追加したい項目はどのEntityにあるか
"disp_name" => "なんとかテキスト", // 表示上の項目名
"field_name" => "nantoka_text", // 項目名
"reference_field_name" => null, // 参照先(field_nameがEntityの場合、Entity先のfeald_nameを文字列で指定してあげる)
"enabled" => true // true : 出力する項目, false : 出力しない項目
], [
"csv_type" => $this->CsvType["Product"],
"entity_name" => "Eccube\\Entity\\Product",
"disp_name" => "なんとかフラグ",
"field_name" => "nantoka_flg",
"reference_field_name" => null,
"enabled" => true
], [
"csv_type" => $this->CsvType["Product"],
"entity_name" => "Eccube\\Entity\\Product",
"disp_name" => "なんとかステータス",
"field_name" => "NantokaStatus",
"reference_field_name" => "name",
"enabled" => true
]
];

$this->em->beginTransaction();

foreach($arr_insert_csv as $c){
$next_sort_no = $this->getCsvNextSortNo($c["csv_type"]);

$Csv = new Csv();
$Csv
->setCsvType($c["csv_type"])
->setEntityName($c["entity_name"])
->setDispName($c["disp_name"])
->setFieldName($c["field_name"])
->setReferenceFieldName($c["reference_field_name"])
->setEnabled($c["enabled"])
->setSortNo($next_sort_no);

$this->em->persist($Csv);
$this->em->flush($Csv);
}

$this->em->commit();
}

public function down(Schema $schema) : void { }

/**
* dtb_csvをCsvTypeで絞り込み、次のsort_noの返却する。
* @param CsvType $CsvType
* @return int
*/

private function getCsvNextSortNo(CsvType $CsvType){
$Csv = $this->CsvRepository->findOneBy(["CsvType" => $CsvType], ['sort_no' => 'DESC']);
return $Csv->getSortNo() + 1;
}
}

up関数内にある $arr_insert_csv の配列の中身を調整してご使用ください。

以上です。