<?php
declare(strict_types=1);
namespace BitBag\OpenMarketplace\Component\Core\Shop\Form\Type\Contact;
use BitBag\OpenMarketplace\Component\Core\Shop\Enum\ContactTypes;
use EWZ\Bundle\RecaptchaBundle\Form\Type\EWZRecaptchaV3Type;
use EWZ\Bundle\RecaptchaBundle\Validator\Constraints\IsTrueV3;
use Sylius\Bundle\AddressingBundle\Form\Type\CountryChoiceType;
use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\Extension\Core\Type\CheckboxType;
use Symfony\Component\Form\Extension\Core\Type\ChoiceType;
use Symfony\Component\Form\Extension\Core\Type\EmailType;
use Symfony\Component\Form\Extension\Core\Type\HiddenType;
use Symfony\Component\Form\Extension\Core\Type\TextareaType;
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\Blank;
use Symfony\Component\Validator\Constraints\Email;
use Symfony\Component\Validator\Constraints\IsTrue;
use Symfony\Component\Validator\Constraints\NotBlank;
use Symfony\Contracts\Translation\TranslatorInterface;
final class ContactType extends AbstractType
{
private const ADVICE_CATEGORIES = [
'finding_suppliers',
'finding_products',
'search_for_partners',
'strategic_advice',
];
public const EMAIL = 'email';
public const CONTACT_TYPE = 'contactType';
public const FIRST_NAME = 'firstName';
public const LAST_NAME = 'lastName';
public const COMPANY_NAME = 'companyName';
public function __construct(private TranslatorInterface $translator)
{
}
public function buildForm(FormBuilderInterface $builder, array $options): void
{
$builder
->add(self::FIRST_NAME, TextType::class, [
'label' => 'sylius.ui.first_name',
'required' => true,
'constraints' => [
new NotBlank([
'message' => 'validator.message.contact.first_name_not_blank',
'groups' => [
ContactTypes::NEWSLETTER_TYPE,
ContactTypes::TECH_ADVISORY_TYPE,
ContactTypes::CONTACT_US_TYPE,
],
]),
],
])
->add(self::LAST_NAME, TextType::class, [
'label' => 'sylius.ui.last_name',
'constraints' => [
new NotBlank([
'message' => 'validator.message.contact.last_name_not_blank',
'groups' => [
ContactTypes::NEWSLETTER_TYPE,
ContactTypes::TECH_ADVISORY_TYPE,
ContactTypes::CONTACT_US_TYPE,
],
]),
],
])
->add(self::COMPANY_NAME, TextType::class, [
'label' => 'sylius.ui.company',
'constraints' => [
new NotBlank([
'message' => 'validator.message.contact.company_name_not_blank',
'groups' => [
ContactTypes::NEWSLETTER_TYPE,
ContactTypes::TECH_ADVISORY_TYPE,
ContactTypes::CONTACT_US_TYPE,
],
]),
],
])
->add('country', CountryChoiceType::class, [
'label' => 'sylius.ui.country',
'constraints' => [
new NotBlank([
'message' => 'validator.message.contact.country_not_blank',
'groups' => [
ContactTypes::TECH_ADVISORY_TYPE,
ContactTypes::CONTACT_US_TYPE,
],
]),
new Blank([
'message' => 'validator.message.contact.unexpected_field',
'groups' => [
ContactTypes::NEWSLETTER_TYPE,
],
]),
],
])
->add(self::EMAIL, EmailType::class, [
'label' => 'sylius.ui.email',
'constraints' => [
new NotBlank([
'message' => 'validator.message.contact.email_not_blank',
'groups' => [
ContactTypes::NEWSLETTER_TYPE,
ContactTypes::TECH_ADVISORY_TYPE,
ContactTypes::CONTACT_US_TYPE,
],
]),
new Email([
'message' => 'validator.message.contact.email_not_valid',
'groups' => [
ContactTypes::NEWSLETTER_TYPE,
ContactTypes::TECH_ADVISORY_TYPE,
ContactTypes::CONTACT_US_TYPE,
],
]),
],
])
->add('phoneNumber', TextType::class, [
'label' => 'sylius.ui.phone_number',
'required' => false,
])
->add('message', TextareaType::class, [
'label' => 'sylius.ui.message',
'constraints' => [
new NotBlank([
'message' => 'sylius.contact.message.not_blank',
'groups' => [
ContactTypes::CONTACT_US_TYPE,
],
]),
new Blank([
'message' => 'validator.message.contact.unexpected_field',
'groups' => [
ContactTypes::NEWSLETTER_TYPE,
],
]),
],
])
->add('adviceCategory', ChoiceType::class, [
'label' => 'app.contact.advice_category.name',
'choices' => array_map(function (string $entry) {
$translated = $this->translator->trans(sprintf('app.ui.contact.advice_category.%s', $entry));
return $translated;
}, self::ADVICE_CATEGORIES),
'choice_label' => function (
$choice,
$key,
$value
) {
return $value;
},
'constraints' => [
new NotBlank([
'message' => 'validator.message.contact.category_not_blank',
'groups' => [
ContactTypes::TECH_ADVISORY_TYPE,
],
]),
new Blank([
'message' => 'validator.message.contact.unexpected_field',
'groups' => [
ContactTypes::NEWSLETTER_TYPE,
ContactTypes::CONTACT_US_TYPE,
],
]),
],
])
->add('agreement', CheckboxType::class, [
'label' => 'open_marketplace.contact.agreement',
'constraints' => [
new IsTrue([
'message' => 'validator.message.contact.agreement_not_blank',
'groups' => [
ContactTypes::NEWSLETTER_TYPE,
ContactTypes::CONTACT_US_TYPE,
ContactTypes::TECH_ADVISORY_TYPE,
],
]),
],
])
->add('recaptcha', EWZRecaptchaV3Type::class, [
'label' => false,
'constraints' => [
new IsTrueV3([
'message' => 'validator.message.recaptcha_invalid',
]),
],
])
->add(self::CONTACT_TYPE, HiddenType::class, [
'label' => false,
])
->addEventListener(FormEvents::PRE_SUBMIT, function (FormEvent $event) use ($options): void {
$type = $options[self::CONTACT_TYPE];
$data = $event->getData();
$data[self::CONTACT_TYPE] = $type;
$event->setData($data);
})
;
}
public function configureOptions(OptionsResolver $resolver): void
{
$resolver
->setDefaults([
self::CONTACT_TYPE => null,
])
->setRequired('validation_groups')
;
}
}