ECCube4でマスターテーブル作成

2021/09/15

ECCube4でマスターテーブルを追加するときの手順を残しておきます。

まずはProxyクラスを生成。

bin/console eccube:generate:proxies

次にEntityクラスの作成

Customize\Entity\Master\[Entity名].php

<?php

namespace Customize\Entity\Master;
use Doctrine\ORM\Mapping as ORM;

/** 
 * @ORM\Table(name="mtb_[Entity名]")
 * @ORM\InheritanceType("SINGLE_TABLE")
 * @ORM\DiscriminatorColumn(name="discriminator_type", type="string", length=255)
 * @ORM\HasLifecycleCallbacks()
 * @ORM\Entity(repositoryClass="Customize\Repository\Master\[Repository名]")
 * @ORM\Cache(usage="NONSTRICT_READ_WRITE")
 */
class [Entity名] extends \Eccube\Entity\Master\AbstractMasterEntity
{
}

次にRepositoryクラスを作成

Customize\Repository\Master\[Repository名].php

<?php

namespace Customize\Repository\Master;

use Customize\Entity\Master\[Entity名];
use Eccube\Repository\AbstractRepository;
use Symfony\Bridge\Doctrine\RegistryInterface;

class [Repository名] extends AbstractRepository
{
    public function __construct(RegistryInterface $registry)
    {
        parent::__construct($registry, [Entity名]::class);
    }
}

ここまで出来たら、

bin/console doctrine:schema:update --dump-sql

このコマンドで発行されるSQLを確認。ちゃんと想定通りのCREATE文が表示されていれば、

bin/console doctrine:schema:update --dump-sql --force

で、実行する。

そうすると、DBの方にマスターテーブルが追加されます。

ただ、この状態では管理画面のマスターデータ管理に表示されないので、以下のファイルを作成する必要がある。

どうやら、マスターデータに表示されるテーブルリストはnamespaceのEccube/Entityのファイルを読み込んで作成されているっぽいので、Customize/Entityのファイルも読み込まれるように拡張しないとダメなよう。

app/Customize/Form/Extension/MasterdataTypeExtension.php

<?php

namespace Customize\Form\Extension;

use Doctrine\ORM\EntityManager;
use Eccube\Form\Type\Admin\MasterdataType;
use Symfony\Component\Form\AbstractTypeExtension;
use Symfony\Component\Form\Extension\Core\Type\ChoiceType;
use Symfony\Component\Form\FormBuilderInterface;

class MasterdataTypeExtension extends AbstractTypeExtension
{
    private $entityManager;

    public function __construct(EntityManager $entityManager)
    {
        $this->entityManager = $entityManager;
    }

    /**
     * {@inheritdoc}
     */
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $masterdata = [];

        /** @var MappingDriverChain $driverChain */
        $driverChain = $this->entityManager->getConfiguration()->getMetadataDriverImpl();
        /** @var MappingDriver[] $drivers */
        $drivers = $driverChain->getDrivers();

        foreach ($drivers as $namespace => $driver) {
            if ($namespace == 'Eccube\Entity' || $namespace == 'Customize\Entity') {
                $classNames = $driver->getAllClassNames();
                foreach ($classNames as $className) {
                    /** @var ClassMetadata $meta */
                    $meta = $this->entityManager->getMetadataFactory()->getMetadataFor($className);
                    if (strpos($meta->rootEntityName, 'Master') !== false
                        && $meta->hasField('id')
                        && $meta->hasField('name')
                        && $meta->hasField('sort_no')
                    ) {
                        $metadataName = str_replace('\\', '-', $meta->getName());
                        $masterdata[$metadataName] = $meta->getTableName();
                    }
                }
            }
        }

        $options = $builder->get('masterdata')->getOptions();
        $options['choices'] = array_flip($masterdata);

        $builder
            ->add('masterdata', ChoiceType::class, $options);
    }

    /**
     * {@inheritdoc}
     */
    public function getExtendedType()
    {
        return MasterdataType::class;
    }
}

最後にキャッシュをクリアして

bin\console cache:clear --no-warmup

マスターデータ管理にアクセスし、プルダウンに表示されていればOKです。

あとはそこからマスターデータを投入してもらって

※ちゃんとアルファベット順で並ぶのかと思いきや、一番下に表示されていたので、最初は気付かず焦りました。

contact us お問い合わせ

Contact お問い合わせ・ご相談

Webサービス・システム開発の
ご相談はお気軽にご連絡ください。

Recruit 求人へのご応募

サニージェムでは現在、プロジェクトの推進を
担う仲間を募集しています。