会員グループ管理::会員登録アドオンでの会員グループ選択項目をテキストボックスにする方法です。
テキストボックスを表示させる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>
以上で完成です。