<?php
namespace App\Form;
use App\Entity\Contact;
use App\Service\ContactService;
use Symfony\Component\Form\FormEvent;
use Symfony\Component\Form\FormEvents;
use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\OptionsResolver\OptionsResolver;
use Symfony\Contracts\Translation\TranslatorInterface;
use Symfony\Component\Form\Extension\Core\Type\TelType;
use Symfony\Component\Form\Extension\Core\Type\EmailType;
use Symfony\Component\Form\Extension\Core\Type\ChoiceType;
use Symfony\Component\Form\Extension\Core\Type\CheckboxType;
class ContactTunnelType extends AbstractType
{
public function __construct(
private TranslatorInterface $translator,
private ContactService $contactService
) {}
public function buildForm(FormBuilderInterface $builder, array $options): void
{
$builder
->add('prenom', null, [
'attr' => [
'class' => 'fac-firstname pl-2 py-2 border border-black border-e-0',
'placeholder' => $this->translator->trans('Prénom'),
'autocomplete' => 'given-name',
],
'required' => true,
])
->add('nom', null, [
'attr' => [
'class' => 'fac-lastname pl-2 py-2 border border-black',
'placeholder' => $this->translator->trans('Nom'),
'autocomplete' => 'family-name',
],
'required' => true,
])
->add('email', EmailType::class, [
'attr' => [
'class' => 'fac-email pl-2 py-2 border border-black border-t-0 border-e-0',
'placeholder' => $this->translator->trans('Email'),
'autocomplete' => 'email',
],
'required' => true,
])
->add('telephone', TelType::class, [
'attr' => [
'class' => 'fac-phone pl-2 py-2 border border-black border-t-0',
'placeholder' => $this->translator->trans('Téléphone'),
'autocomplete' => 'tel',
],
'required' => true,
])
->add('adresse', null, [
'attr' => [
'class' => 'fac-address pl-2 py-2 border border-black border-t-0 border-e-0',
'placeholder' => $this->translator->trans('Rue'),
'autocomplete' => 'street-address',
],
'required' => true,
])
->add('ville', null, [
'attr' => [
'class' => 'fac-city pl-2 py-2 border border-black border-t-0',
'placeholder' => $this->translator->trans('Ville'),
'autocomplete' => 'address-level2',
],
'required' => true,
])
->add('codePostal', null, [
'attr' => [
'class' => 'fac-postal-code pl-2 py-2 border border-black border-t-0 border-e-0',
'autocomplete' => 'postal-code',
'placeholder' => $this->translator->trans('Code Postal'),
],
'required' => true,
])
->add('pays', ChoiceType::class, [
'choices' => [
'France' => 'FR',
'Canada' => 'CA',
'Afghanistan' => 'AF',
'Afrique du sud' => 'ZA',
'Åland, îles' => 'AX',
'Albanie' => 'AL',
'Algérie' => 'DZ',
'Allemagne' => 'DE',
'Andorre' => 'AD',
'Angola' => 'AO',
'Anguilla' => 'AI',
'Antarctique' => 'AQ',
'Antigua et barbuda' => 'AG',
'Arabie saoudite' => 'SA',
'Argentine' => 'AR',
'Arménie' => 'AM',
'Aruba' => 'AW',
'Australie' => 'AU',
'Autriche' => 'AT',
'Azerbaïdjan' => 'AZ',
'Bahamas' => 'BS',
'Bahreïn' => 'BH',
'Bangladesh' => 'BD',
'Barbade' => 'BB',
'Bélarus' => 'BY',
'Belgique' => 'BE',
'Belize' => 'BZ',
'Bénin' => 'BJ',
'Bermudes' => 'BM',
'Bhoutan' => 'BT',
'Bolivie, l\'état plurinational de' => 'BO',
'Bonaire, saint eustache et saba' => 'BQ',
'Bosnie herzégovine' => 'BA',
'Botswana' => 'BW',
'Bouvet, île' => 'BV',
'Brésil' => 'BR',
'Brunei darussalam' => 'BN',
'Bulgarie' => 'BG',
'Burkina faso' => 'BF',
'Burundi' => 'BI',
'Caïmans, îles' => 'KY',
'Cambodge' => 'KH',
'Cameroun' => 'CM',
'Cap vert' => 'CV',
'Centrafricaine, république' => 'CF',
'Chili' => 'CL',
'Chine' => 'CN',
'Christmas, île' => 'CX',
'Chypre' => 'CY',
'Cocos (keeling), îles' => 'CC',
'Colombie' => 'CO',
'Comores' => 'KM',
'Congo' => 'CG',
'Congo, la république démocratique du' => 'CD',
'Cook, îles' => 'CK',
'Corée, république de' => 'KR',
'Corée, république populaire démocratique de' => 'KP',
'Costa rica' => 'CR',
'Côte d\'ivoire' => 'CI',
'Croatie' => 'HR',
'Cuba' => 'CU',
'Curaçao' => 'CW',
'Danemark' => 'DK',
'Djibouti' => 'DJ',
'Dominicaine, république' => 'DO',
'Dominique' => 'DM',
'Égypte' => 'EG',
'El salvador' => 'SV',
'Émirats arabes unis' => 'AE',
'Équateur' => 'EC',
'Érythrée' => 'ER',
'Espagne' => 'ES',
'Estonie' => 'EE',
'États unis' => 'US',
'Éthiopie' => 'ET',
'Falkland, îles (malvinas)' => 'FK',
'Féroé, îles' => 'FO',
'Fidji' => 'FJ',
'Finlande' => 'FI',
'Gabon' => 'GA',
'Gambie' => 'GM',
'Géorgie' => 'GE',
'Géorgie du sud et les îles sandwich du sud' => 'GS',
'Ghana' => 'GH',
'Gibraltar' => 'GI',
'Grèce' => 'GR',
'Grenade' => 'GD',
'Groenland' => 'GL',
'Guadeloupe' => 'GP',
'Guam' => 'GU',
'Guatemala' => 'GT',
'Guernesey' => 'GG',
'Guinée' => 'GN',
'Guinée bissau' => 'GW',
'Guinée équatoriale' => 'GQ',
'Guyana' => 'GY',
'Guyane française' => 'GF',
'Haïti' => 'HT',
'Heard et îles macdonald, île' => 'HM',
'Honduras' => 'HN',
'Hong kong' => 'HK',
'Hongrie' => 'HU',
'Île de man' => 'IM',
'Îles mineures éloignées des états unis' => 'UM',
'Îles vierges britanniques' => 'VG',
'Îles vierges des états unis' => 'VI',
'Inde' => 'IN',
'Indonésie' => 'ID',
'Iran, république islamique d\'' => 'IR',
'Iraq' => 'IQ',
'Irlande' => 'IE',
'Islande' => 'IS',
'Israël' => 'IL',
'Italie' => 'IT',
'Jamaïque' => 'JM',
'Japon' => 'JP',
'Jersey' => 'JE',
'Jordanie' => 'JO',
'Kazakhstan' => 'KZ',
'Kenya' => 'KE',
'Kirghizistan' => 'KG',
'Kiribati' => 'KI',
'Koweït' => 'KW',
'Lao, république démocratique populaire' => 'LA',
'Lesotho' => 'LS',
'Lettonie' => 'LV',
'Liban' => 'LB',
'Libéria' => 'LR',
'Libye' => 'LY',
'Liechtenstein' => 'LI',
'Lituanie' => 'LT',
'Luxembourg' => 'LU',
'Macao' => 'MO',
'Macédoine, l\'ex république yougoslave de' => 'MK',
'Madagascar' => 'MG',
'Malaisie' => 'MY',
'Malawi' => 'MW',
'Maldives' => 'MV',
'Mali' => 'ML',
'Malte' => 'MT',
'Mariannes du nord, îles' => 'MP',
'Maroc' => 'MA',
'Marshall, îles' => 'MH',
'Martinique' => 'MQ',
'Maurice' => 'MU',
'Mauritanie' => 'MR',
'Mayotte' => 'YT',
'Mexique' => 'MX',
'Micronésie, états fédérés de' => 'FM',
'Moldova, république de' => 'MD',
'Monaco' => 'MC',
'Mongolie' => 'MN',
'Monténégro' => 'ME',
'Montserrat' => 'MS',
'Mozambique' => 'MZ',
'Myanmar' => 'MM',
'Namibie' => 'NA',
'Nauru' => 'NR',
'Népal' => 'NP',
'Nicaragua' => 'NI',
'Niger' => 'NE',
'Nigéria' => 'NG',
'Niué' => 'NU',
'Norfolk, île' => 'NF',
'Norvège' => 'NO',
'Nouvelle calédonie' => 'NC',
'Nouvelle zélande' => 'NZ',
'Océan indien, territoire britannique de l\'' => 'IO',
'Oman' => 'OM',
'Ouganda' => 'UG',
'Ouzbékistan' => 'UZ',
'Pakistan' => 'PK',
'Palaos' => 'PW',
'Palestinien occupé, territoire' => 'PS',
'Panama' => 'PA',
'Papouasie nouvelle guinée' => 'PG',
'Paraguay' => 'PY',
'Pays bas' => 'NL',
'Pérou' => 'PE',
'Philippines' => 'PH',
'Pitcairn' => 'PN',
'Pologne' => 'PL',
'Polynésie française' => 'PF',
'Porto rico' => 'PR',
'Portugal' => 'PT',
'Qatar' => 'QA',
'Réunion' => 'RE',
'Roumanie' => 'RO',
'Royaume uni' => 'GB',
'Russie, fédération de' => 'RU',
'Rwanda' => 'RW',
'Sahara occidental' => 'EH',
'Saint barthélemy' => 'BL',
'Sainte hélène, ascension et tristan da cunha' => 'SH',
'Sainte lucie' => 'LC',
'Saint kitts et nevis' => 'KN',
'Saint marin' => 'SM',
'Saint martin(partie française)' => 'MF',
'Saint martin (partie néerlandaise)' => 'SX',
'Saint pierre et miquelon' => 'PM',
'Saint siège (état de la cité du vatican)' => 'VA',
'Saint vincent et les grenadines' => 'VC',
'Salomon, îles' => 'SB',
'Samoa' => 'WS',
'Samoa américaines' => 'AS',
'Sao tomé et principe' => 'ST',
'Sénégal' => 'SN',
'Serbie' => 'RS',
'Seychelles' => 'SC',
'Sierra leone' => 'SL',
'Singapour' => 'SG',
'Slovaquie' => 'SK',
'Slovénie' => 'SI',
'Somalie' => 'SO',
'Soudan' => 'SD',
'Soudan du sud' => 'SS',
'Sri lanka' => 'LK',
'Suède' => 'SE',
'Suisse' => 'CH',
'Suriname' => 'SR',
'Svalbard et île jan mayen' => 'SJ',
'Swaziland' => 'SZ',
'Syrienne, république arabe' => 'SY',
'Tadjikistan' => 'TJ',
'Taïwan, province de chine' => 'TW',
'Tanzanie, république unie de' => 'TZ',
'Tchad' => 'TD',
'Tchèque, république' => 'CZ',
'Terres australes françaises' => 'TF',
'Thaïlande' => 'TH',
'Timor leste' => 'TL',
'Togo' => 'TG',
'Tokelau' => 'TK',
'Tonga' => 'TO',
'Trinité et tobago' => 'TT',
'Tunisie' => 'TN',
'Turkménistan' => 'TM',
'Turks et caïcos, îles' => 'TC',
'Turquie' => 'TR',
'Tuvalu' => 'TV',
'Ukraine' => 'UA',
'Uruguay' => 'UY',
'Vanuatu' => 'VU',
'Venezuela, république bolivarienne du' => 'VE',
'Viet nam' => 'VN',
'Wallis et futuna' => 'WF',
'Yémen' => 'YE',
'Zambie' => 'ZM',
'Zimbabwe' => 'ZW',
],
'attr' => [
'class' => 'fac-country pl-2 py-2 border border-black border-t-0',
],
'required' => true,
])
->add('newsletter', CheckboxType::class, [
'label' => $this->translator->trans("Oui, j'accepte d'être contacté pour recevoir des offres promotionnelles"),
'required' => false,
])
;
$builder->addEventListener(FormEvents::PRE_SUBMIT, function (FormEvent $event) {
$data = $event->getData();
$form = $event->getForm();
if (isset($data['email'])) {
$newEmail = $data['email'];
$existingContact = $this->contactService->findOneByEmail($newEmail);
if ($existingContact) {
$form->setData($existingContact);
} else {
$newContact = new Contact();
$form->setData($newContact);
}
}
});
}
public function configureOptions(OptionsResolver $resolver): void
{
$resolver->setDefaults([
'data_class' => Contact::class,
]);
}
}