10
6

More than 5 years have passed since last update.

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

Last updated at Posted at 2019-04-11

概要

商品登録フォームや会員登録フォームに項目を追加したら管理画面の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 の配列の中身を調整してご使用ください。
以上です。

10
6
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
10
6