Blog スタッフブログ

EC-CUBE システム開発

[EC-CUBE]EC-CUBE4の商品CSV出力項目の追加

システム開発担当のTFです。

※EC-CUBE4系統対応

メーカー管理プラグインのメーカー名を商品CSV出力に追加する手順

やり方

  • メーカー管理プラグインをインストールし、有効化する
  • マイグレーションを作成・実行を行いdtb_csvにデータを入れる

参考

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

サンプル

※プラグインは一部抜粋

<?php

namespace Plugin\Maker4\Entity;

use Doctrine\ORM\Mapping as ORM;
use Eccube\Annotation as Eccube;

/**
 * @Eccube\EntityExtension("Eccube\Entity\Product")
 */
trait ProductTrait
{
    /**
     * @var \Plugin\Maker4\Entity\Maker
     *
     * @ORM\ManyToOne(targetEntity="Plugin\Maker4\Entity\Maker")
     * @ORM\JoinColumns({
     *   @ORM\JoinColumn(name="maker_id", referencedColumnName="id")
     * })
     */
    private $Maker;

    /**
     * @return Maker
     */
    public function getMaker()
    {
        return $this->Maker;
    }

    /**
     * @param Maker|null $Maker
     *
     * @return $this
     */
    public function setMaker(Maker $Maker = null)
    {
        $this->Maker = $Maker;

        return $this;
    }
}
<?php

namespace Plugin\Maker4\Entity;

use Doctrine\ORM\Mapping as ORM;
use Eccube\Entity\AbstractEntity;
use Symfony\Bridge\Doctrine\Validator\Constraints\UniqueEntity;
use Symfony\Component\Validator\Mapping\ClassMetadata;

/**
 * Class Maker.
 *
 * @ORM\Table(name="plg_maker")
 * @ORM\Entity(repositoryClass="Plugin\Maker4\Repository\MakerRepository")
 */
class Maker extends AbstractEntity
{
    /**
     * @var int
     *
     * @ORM\Column(name="id", type="integer", options={"unsigned":true})
     * @ORM\Id
     * @ORM\GeneratedValue(strategy="IDENTITY")
     */
    private $id;

    /**
     * @var string
     *
     * @ORM\Column(name="name", type="string", length=255)
     */
    private $name;

    /**
     * Get id.
     *
     * @return int
     */
    public function getId()
    {
        return $this->id;
    }

    /**
     * Get name.
     *
     * @return string
     */
    public function getName()
    {
        return $this->name;
    }

    /**
     * Set name.
     *
     * @param string $name
     *
     * @return Maker
     */
    public function setName($name)
    {
        $this->name = $name;

        return $this;
    }
}
<?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 Version20220829150653 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"   => "メーカー(ID)",           // 表示上の項目名
                "field_name"  => "Maker",            // 項目名
                "reference_field_name" => "id",             // 参照先(field_nameがEntityの場合、Entity先のfeald_nameを文字列で指定してあげる)
                "enabled"     => true                       // true : 出力する項目, false : 出力しない項目
            ], [
                "csv_type"    => $this->CsvType["Product"],
                "entity_name" => "Eccube\\Entity\\Product",
                "disp_name"   => "メーカー(名前)",
                "field_name"  => "Maker", // ProductTraitで追加したMakerエンティティ
                "reference_field_name" => "name", // Makerエンティティの 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;
    }
}
// プロジェクト直下に移動
cd プロジェクトのパス

// マイグレーションの実行
php bin/console doctrine:migrations:execute 20220829150653 –up