会員グループ管理::会員登録アドオンでの会員グループ選択項目をテキストボックスにする方法

会員グループ管理::会員登録アドオンでの会員グループ選択項目をテキストボックスにする方法です。

テキストボックスを表示させるTypeExtensionを用意

app/Customize/Form/Extension/EntryTypeExtension.phpを作成して以下のコードをコピペしてください。

<?php

namespace Customize\Form\Extension;

use Doctrine\ORM\EntityManagerInterface;
use Eccube\Entity\Customer;
use Eccube\Form\Type\Front\EntryType;
use Plugin\CustomerGroup42\Entity\Group;
use Symfony\Component\Form\AbstractTypeExtension;
use Symfony\Component\Form\Extension\Core\Type\HiddenType;
use Symfony\Component\Form\Extension\Core\Type\TextType;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\Form\FormError;
use Symfony\Component\Form\FormEvent;
use Symfony\Component\Form\FormEvents;
use Symfony\Component\Security\Core\Security;

class EntryTypeExtension extends AbstractTypeExtension
{
    /**
     * @var Security
     */
    private $security;

    /**
     * @var EntityManagerInterface
     */
    private $entityManager;

    public function __construct(
        Security               $security,
        EntityManagerInterface $entityManager
    )
    {
        $this->security = $security;
        $this->entityManager = $entityManager;
    }

    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $user = $this->security->getUser();
        if ($user instanceof Customer) {
            return;
        }

        $builder
            ->add('group_name', TextType::class, [
                'mapped' => false,
            ])
            ->add('group_id', HiddenType::class, [
                'mapped' => false,
            ]);

        $builder
            ->addEventListener(FormEvents::SUBMIT, function (FormEvent $event) {
                $form = $event->getForm();

                $name = $form->get('group_name')->getData();

                /** @var Group $group */
                $group = $this->entityManager->getRepository(Group::class)
                    ->findOneBy(['name' => $name]);
                if (null === $group) {
                    $form->get('group_name')->addError(new FormError('会員グループがありません'));
                } else {
                    $form->add('group_name', TextType::class, [
                        'mapped' => false,
                        'data' => $name,
                    ]);
                    $form->add('group_id', HiddenType::class, [
                        'mapped' => false,
                        'data' => $group->getId(),
                    ]);
                }
            });

        $builder
            ->addEventListener(FormEvents::POST_SUBMIT, function (FormEvent $event) {
                $form = $event->getForm();
                /** @var Customer $data */
                $data = $event->getData();

                if ($form->isValid() && $form->has('group_id')) {
                    $group_id = $form->get('group_id')->getData();
                    if ($group_id) {
                        $group = $this->entityManager->getRepository(Group::class)
                            ->find($group_id);
                        $data->addGroup($group);
                    }
                }
            });
    }

    public static function getExtendedTypes(): iterable
    {
        yield EntryType::class;
    }
}

既存のEntryTypeExtensionを上書きする

既存のEntryTypeExtensionを上書きするため以下のファイルを用意してください。

app/Customize/Resource/config/services.yaml

services:
  Plugin\CustomerGroupEntry42\Form\Extension\EntryTypeExtension:
    class: Customize\Form\Extension\EntryTypeExtension

会員登録入力ページにコードを追記

テキストボックスを表示させるため、コンテンツ管理>ページ管理>会員登録(入力ページ)の任意の場所に以下のコードを入力してください。

<dl>
 <dt>
  {{ form_label(form.group_name, 'customer_group_entry.front.group.label', { 'label_attr': { 'class': 'ec-label' }}) }}
 </dt>
 <dd>
  <div class="ec-input{{ has_errors(form.group_name) ? ' error' }}">
   {{ form_widget(form.group_name) }}
   {{ form_errors(form.group_name) }}
   {{ form_widget(form.group_id) }}
  </div>
 </dd>
</dl>

会員登録確認ページにコードを追記

テキストボックスを表示させるため、コンテンツ管理>ページ管理>会員登録(確認ページ)の任意の場所に以下のコードを入力してください。

<dl>
 <dt>
  {{ form_label(form.groups, 'customer_group_entry.front.group.label', { 'label_attr': { 'class': 'ec-label' }}) }}
 </dt>
 <dd>
  {{ form.group_name.vars.data }}
  {{ form_widget(form.group_name, {type: 'hidden'}) }}
  {{ form_widget(form.group_id, {type: 'hidden'}) }}
 </dd>
</dl>

以上で完成です。

お気軽にコメントをどうぞ