Help us understand the problem. What is going on with this article?

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

More than 1 year has passed since last update.

概要

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

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away