EC-CUBEめも

EC-CUBE4.0.2にてマスタテーブルを新たに作成します。
テーブル作成後、少し触ってやらないと管理画面のマスタデータ管理では表示されないので注意が必要です。

app/Customize/ 以下に Entity と Repository をそれぞれ作成します。
namespace は Eccube から Customize へ変更します。

以下のコマンドでProxyクラスを生成します。

bin/console eccube:generate:proxies

続いて実行されるSQLを確認します。

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

SQLを実行します。これでテーブルが作成されます。

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

namespace が Eccube\Entity のものしか読み込まないため、管理画面に表示させるには MasterdataType を拡張する必要があります。

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;
    }
}

トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2021-09-19 (日) 19:09:21