<?php
/*
* Copyright(c) 2020 RACCOON HOLDINGS, Inc. All rights reserved.
* https://paid.jp/
*/
namespace Plugin\Paid4\Form\Type;
use Eccube\Common\EccubeConfig;
use Eccube\Form\Type\AddressType;
use Eccube\Form\Type\PostalType;
use Eccube\Form\Validator\Email;
use Plugin\Paid4\Service\AddFormOptionService;
use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\Extension\Core\Type\CheckboxType;
use Symfony\Component\Form\Extension\Core\Type\EmailType;
use Symfony\Component\Form\Extension\Core\Type\TextType;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\Form\FormEvent;
use Symfony\Component\Form\FormEvents;
use Symfony\Component\OptionsResolver\OptionsResolver;
use Symfony\Component\Validator\Constraints as Assert;
use Symfony\Component\Validator\Constraints\NotBlank;
class PaidEntryType extends AbstractType
{
/**
* @var EccubeConfig
*/
protected $eccubeConfig;
/**
* @var AddFormOptionService
*/
public $addFormOptionService;
/**
* EntryType constructor.
* EntryType constructor.
*
* @param EccubeConfig $eccubeConfig
* @param AddFormOptionService $addFormOptionService
*/
public function __construct(
EccubeConfig $eccubeConfig,
AddFormOptionService $addFormOptionService
)
{
$this->eccubeConfig = $eccubeConfig;
$this->addFormOptionService = $addFormOptionService;
}
/**
* @param FormBuilderInterface $builder
* @param array $options
*/
public function buildForm(FormBuilderInterface $builder, array $options)
{
$required = $options['newPaidCustomer'];
$prefClass = '';
$keyupEvent = 'setZipCode()';
$blurEvent = 'getAddress()';
$zipClass = '';
$address01Class= '';
$address02Class = '';
if($required) {
$prefClass = 'p-region-id';
$keyupEvent = '';
$blurEvent = '';
$zipClass = 'p-postal-code';
$address01Class = 'p-locality p-street-address';
$address02Class = 'p-extended-address';
}
$builder
->add('company_name', TextType::class, [
'required' => $required,
'constraints' => [],
])
->add('company_name_kana', PaidTextKanaType::class, [
'required' => $required,
'constraints' => [],
])
->add('representative', PaidNameType::class, [
'required' => $required,
])
->add('representative_kana', PaidNameKanaType::class, [
'required' => $required,
'lastname_name' => 'representative_sei_kana',
'firstname_name' => 'representative_mei_kana',
])
->add('zip_code', PostalType::class, [
'required' => $required,
'constraints' => [new Assert\Length(['max' => $this->eccubeConfig['eccube_postal_code']-1])],
'attr' => [
'class' => $zipClass,
'placeholder' => 'common.postal_code_sample',
'onkeyup' => $keyupEvent,
'onblur' => $blurEvent,
],
])
->add('address', AddressType::class, [
'required' => $required,
'pref_name' => 'prefecture',
'addr01_name' => 'address1',
'addr02_name' => 'address2',
'pref_options' => ['constraints' => [], 'attr' => ['class' => $prefClass]],
'addr01_options' => [
'constraints' => [
new Assert\Length(['max' => $this->eccubeConfig['paid4.stext_len']]),
],
'attr' => [
'class' => $address01Class,
'placeholder' => 'common.address_sample_01',
],
],
'addr02_options' => [
'constraints' => [
new Assert\Length(['max' => $this->eccubeConfig['paid4.stext_len']]),
],
'attr' => [
'class' => $address02Class,
'placeholder' => 'common.address_sample_02',
],
],
])
->add('clerk', PaidNameType::class, [
'required' => $required,
])
->add('clerk_kana', PaidNameKanaType::class, [
'required' => $required,
'lastname_name' => 'clerk_sei_kana',
'firstname_name' => 'clerk_mei_kana',
])
->add('tell', PaidTellType::class, [
'required' => $required,
'attr' => [
'placeholder' => '例:111-222-333',
],
])
->add('email', PaidRepeatedEmailType::class, [
'required' => $required,
]);
// 管理画面->paid登録用フォーム設定
if ($options['admin_mode']) {
$builder
->add('company_name', TextType::class, [
'required' => $required,
'constraints' => [
new Assert\Length([
'max' => $this->eccubeConfig['paid4.stext_len'],
]),
new NotBlank(),
],
])
->add('company_name_kana', PaidTextKanaType::class, [
'required' => $required,
'constraints' => [
new Assert\Length([
'max' => $this->eccubeConfig['paid4.stext_len'],
]),
new NotBlank(),
],
])
->add('email', EmailType::class, [
'required' => true,
'constraints' => [
new Assert\NotBlank(),
//new Email(['strict' => $this->eccubeConfig['eccube_rfc_email_check']]),
new Email(['mode' => $this->eccubeConfig['eccube_rfc_email_check'] ? 'strict' : 'loose']),
new Assert\Length(['max' => $this->eccubeConfig['paid4.email_len']]),
],
'attr' => [
'placeholder' => 'common.mail_address_sample',
],
]);
$builder->addEventListener(FormEvents::POST_SUBMIT, function (FormEvent $event) use ($options, $required) {
$form = $event->getForm();
$this->addFormOptionService->setTellNotHyphenMessage($form, 'tell');
});
}
// フロント->paid登録用フォーム設定
if (!$options['admin_mode']) {
$builder->addEventListener(FormEvents::PRE_SET_DATA, function (FormEvent $event) use ($required) {
$form = $event->getForm();
$form->add('user_policy_check', CheckboxType::class, [
'required' => $required,
'label' => null,
'mapped' => false,
]);
});
$builder->addEventListener(FormEvents::POST_SUBMIT, function (FormEvent $event) use ($options, $required) {
if ($required) {
$form = $event->getForm();
$this->addFormOptionService->setFormOption($form, 'company_name', [
new Assert\Length([
'max' => $this->eccubeConfig['paid4.stext_len'],
]),
new NotBlank(),
]);
$this->addFormOptionService->setFormOption($form, 'company_name_kana', [
new Assert\Length([
'max' => $this->eccubeConfig['paid4.stext_len'],
]),
new NotBlank(),
]);
$this->addFormOptionService->setFormOption($form, 'user_policy_check', [new NotBlank()]);
$email = $form->get('email');
$this->addFormOptionService->setFormOption($email, 'first', [new NotBlank(),]);
$this->addFormOptionService->setFormOption($email, 'second', [new NotBlank(),]);
$this->addFormOptionService->setTellNotHyphenMessage($form, 'tell');
}
});
}
}
/**
* @param OptionsResolver $resolver
*/
public function configureOptions(OptionsResolver $resolver)
{
$resolver->setDefaults([
'data_class' => 'Plugin\Paid4\Entity\PaidCustomer',
'newPaidCustomer' => true,
'admin_mode' => false,
]);
}
/**
* {@inheritdoc}
*/
public function getBlockPrefix()
{
return 'paid_entry';
}
}