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です。
あとはそこからマスターデータを投入してもらって
※ちゃんとアルファベット順で並ぶのかと思いきや、一番下に表示されていたので、最初は気付かず焦りました。