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

 
                
この投稿へのコメント