ECCube4でマスターテーブル作成
ECCube4でマスターテーブルを追加するときの手順を残しておきます。
まずはProxyクラスを生成。
bin/console eccube:generate:proxies次にEntityクラスの作成
Customize\Entity\Master\[Entity名].php
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
<?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
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
<?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); } } |
ここまで出来たら、
1 |
bin/console doctrine:schema:update --dump-sql |
このコマンドで発行されるSQLを確認。ちゃんと想定通りのCREATE文が表示されていれば、
1 |
bin/console doctrine:schema:update --dump-sql --force |
で、実行する。
そうすると、DBの方にマスターテーブルが追加されます。
ただ、この状態では管理画面のマスターデータ管理に表示されないので、以下のファイルを作成する必要がある。
どうやら、マスターデータに表示されるテーブルリストはnamespaceのEccube/Entityのファイルを読み込んで作成されているっぽいので、Customize/Entityのファイルも読み込まれるように拡張しないとダメなよう。
app/Customize/Form/Extension/MasterdataTypeExtension.php
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 |
<?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; } } |
最後にキャッシュをクリアして
1 |
bin\console cache:clear --no-warmup |
マスターデータ管理にアクセスし、プルダウンに表示されていればOKです。
あとはそこからマスターデータを投入してもらって
※ちゃんとアルファベット順で並ぶのかと思いきや、一番下に表示されていたので、最初は気付かず焦りました。
この投稿へのトラックバック
トラックバックはありません。
- トラックバック URL
この投稿へのコメント