src/Form/ContactTunnelType.php line 18

Open in your IDE?
  1. <?php
  2. namespace App\Form;
  3. use App\Entity\Contact;
  4. use App\Service\ContactService;
  5. use Symfony\Component\Form\FormEvent;
  6. use Symfony\Component\Form\FormEvents;
  7. use Symfony\Component\Form\AbstractType;
  8. use Symfony\Component\Form\FormBuilderInterface;
  9. use Symfony\Component\OptionsResolver\OptionsResolver;
  10. use Symfony\Contracts\Translation\TranslatorInterface;
  11. use Symfony\Component\Form\Extension\Core\Type\TelType;
  12. use Symfony\Component\Form\Extension\Core\Type\EmailType;
  13. use Symfony\Component\Form\Extension\Core\Type\ChoiceType;
  14. use Symfony\Component\Form\Extension\Core\Type\CheckboxType;
  15. class ContactTunnelType extends AbstractType
  16. {
  17.     public function __construct(
  18.         private TranslatorInterface $translator,
  19.         private ContactService $contactService
  20.     ) {}
  21.     
  22.     public function buildForm(FormBuilderInterface $builder, array $options): void
  23.     {
  24.         $builder
  25.             ->add('prenom'null, [
  26.                 'attr' => [
  27.                     'class' => 'fac-firstname pl-2 py-2 border border-black border-e-0',
  28.                     'placeholder' => $this->translator->trans('Prénom'),
  29.                     'autocomplete' => 'given-name',
  30.                 ],
  31.                 'required' => true,
  32.             ])
  33.             ->add('nom'null, [
  34.                 'attr' => [
  35.                     'class' => 'fac-lastname pl-2 py-2 border border-black',
  36.                     'placeholder' => $this->translator->trans('Nom'),
  37.                     'autocomplete' => 'family-name',
  38.                 ],
  39.                 'required' => true,
  40.             ])
  41.             ->add('email'EmailType::class, [
  42.                 'attr' => [
  43.                     'class' => 'fac-email pl-2 py-2 border border-black border-t-0 border-e-0',
  44.                     'placeholder' => $this->translator->trans('Email'),
  45.                     'autocomplete' => 'email',
  46.                 ],
  47.                 'required' => true,
  48.             ])
  49.             ->add('telephone'TelType::class, [
  50.                 'attr' => [
  51.                     'class' => 'fac-phone pl-2 py-2 border border-black border-t-0',
  52.                     'placeholder' => $this->translator->trans('Téléphone'),
  53.                     'autocomplete' => 'tel',
  54.                 ],
  55.                 'required' => true,
  56.             ])
  57.             ->add('adresse'null, [
  58.                 'attr' => [
  59.                     'class' => 'fac-address pl-2 py-2 border border-black border-t-0 border-e-0',
  60.                     'placeholder' => $this->translator->trans('Rue'),
  61.                     'autocomplete' => 'street-address',
  62.                 ],
  63.                 'required' => true,
  64.             ])
  65.             ->add('ville'null, [
  66.                 'attr' => [
  67.                     'class' => 'fac-city pl-2 py-2 border border-black border-t-0',
  68.                     'placeholder' => $this->translator->trans('Ville'),
  69.                     'autocomplete' => 'address-level2',
  70.                 ],
  71.                 'required' => true,
  72.             ])
  73.             ->add('codePostal'null, [
  74.                 'attr' => [
  75.                     'class' => 'fac-postal-code pl-2 py-2 border border-black border-t-0 border-e-0',
  76.                     'autocomplete' => 'postal-code',
  77.                     'placeholder' => $this->translator->trans('Code Postal'),
  78.                 ],
  79.                 'required' => true,
  80.             ])
  81.             ->add('pays'ChoiceType::class, [
  82.                 'choices' => [
  83.                     'France' => 'FR',
  84.                     'Canada' => 'CA',
  85.                     'Afghanistan' => 'AF',
  86.                     'Afrique du sud' => 'ZA',
  87.                     'Åland, îles' => 'AX',
  88.                     'Albanie' => 'AL',
  89.                     'Algérie' => 'DZ',
  90.                     'Allemagne' => 'DE',
  91.                     'Andorre' => 'AD',
  92.                     'Angola' => 'AO',
  93.                     'Anguilla' => 'AI',
  94.                     'Antarctique' => 'AQ',
  95.                     'Antigua et barbuda' => 'AG',
  96.                     'Arabie saoudite' => 'SA',
  97.                     'Argentine' => 'AR',
  98.                     'Arménie' => 'AM',
  99.                     'Aruba' => 'AW',
  100.                     'Australie' => 'AU',
  101.                     'Autriche' => 'AT',
  102.                     'Azerbaïdjan' => 'AZ',
  103.                     'Bahamas' => 'BS',
  104.                     'Bahreïn' => 'BH',
  105.                     'Bangladesh' => 'BD',
  106.                     'Barbade' => 'BB',
  107.                     'Bélarus' => 'BY',
  108.                     'Belgique' => 'BE',
  109.                     'Belize' => 'BZ',
  110.                     'Bénin' => 'BJ',
  111.                     'Bermudes' => 'BM',
  112.                     'Bhoutan' => 'BT',
  113.                     'Bolivie, l\'état plurinational de' => 'BO',
  114.                     'Bonaire, saint eustache et saba' => 'BQ',
  115.                     'Bosnie herzégovine' => 'BA',
  116.                     'Botswana' => 'BW',
  117.                     'Bouvet, île' => 'BV',
  118.                     'Brésil' => 'BR',
  119.                     'Brunei darussalam' => 'BN',
  120.                     'Bulgarie' => 'BG',
  121.                     'Burkina faso' => 'BF',
  122.                     'Burundi' => 'BI',
  123.                     'Caïmans, îles' => 'KY',
  124.                     'Cambodge' => 'KH',
  125.                     'Cameroun' => 'CM',
  126.                     'Cap vert' => 'CV',
  127.                     'Centrafricaine, république' => 'CF',
  128.                     'Chili' => 'CL',
  129.                     'Chine' => 'CN',
  130.                     'Christmas, île' => 'CX',
  131.                     'Chypre' => 'CY',
  132.                     'Cocos (keeling), îles' => 'CC',
  133.                     'Colombie' => 'CO',
  134.                     'Comores' => 'KM',
  135.                     'Congo' => 'CG',
  136.                     'Congo, la république démocratique du' => 'CD',
  137.                     'Cook, îles' => 'CK',
  138.                     'Corée, république de' => 'KR',
  139.                     'Corée, république populaire démocratique de' => 'KP',
  140.                     'Costa rica' => 'CR',
  141.                     'Côte d\'ivoire' => 'CI',
  142.                     'Croatie' => 'HR',
  143.                     'Cuba' => 'CU',
  144.                     'Curaçao' => 'CW',
  145.                     'Danemark' => 'DK',
  146.                     'Djibouti' => 'DJ',
  147.                     'Dominicaine, république' => 'DO',
  148.                     'Dominique' => 'DM',
  149.                     'Égypte' => 'EG',
  150.                     'El salvador' => 'SV',
  151.                     'Émirats arabes unis' => 'AE',
  152.                     'Équateur' => 'EC',
  153.                     'Érythrée' => 'ER',
  154.                     'Espagne' => 'ES',
  155.                     'Estonie' => 'EE',
  156.                     'États unis' => 'US',
  157.                     'Éthiopie' => 'ET',
  158.                     'Falkland, îles (malvinas)' => 'FK',
  159.                     'Féroé, îles' => 'FO',
  160.                     'Fidji' => 'FJ',
  161.                     'Finlande' => 'FI',
  162.                     'Gabon' => 'GA',
  163.                     'Gambie' => 'GM',
  164.                     'Géorgie' => 'GE',
  165.                     'Géorgie du sud et les îles sandwich du sud' => 'GS',
  166.                     'Ghana' => 'GH',
  167.                     'Gibraltar' => 'GI',
  168.                     'Grèce' => 'GR',
  169.                     'Grenade' => 'GD',
  170.                     'Groenland' => 'GL',
  171.                     'Guadeloupe' => 'GP',
  172.                     'Guam' => 'GU',
  173.                     'Guatemala' => 'GT',
  174.                     'Guernesey' => 'GG',
  175.                     'Guinée' => 'GN',
  176.                     'Guinée bissau' => 'GW',
  177.                     'Guinée équatoriale' => 'GQ',
  178.                     'Guyana' => 'GY',
  179.                     'Guyane française' => 'GF',
  180.                     'Haïti' => 'HT',
  181.                     'Heard et îles macdonald, île' => 'HM',
  182.                     'Honduras' => 'HN',
  183.                     'Hong kong' => 'HK',
  184.                     'Hongrie' => 'HU',
  185.                     'Île de man' => 'IM',
  186.                     'Îles mineures éloignées des états unis' => 'UM',
  187.                     'Îles vierges britanniques' => 'VG',
  188.                     'Îles vierges des états unis' => 'VI',
  189.                     'Inde' => 'IN',
  190.                     'Indonésie' => 'ID',
  191.                     'Iran, république islamique d\'' => 'IR',
  192.                     'Iraq' => 'IQ',
  193.                     'Irlande' => 'IE',
  194.                     'Islande' => 'IS',
  195.                     'Israël' => 'IL',
  196.                     'Italie' => 'IT',
  197.                     'Jamaïque' => 'JM',
  198.                     'Japon' => 'JP',
  199.                     'Jersey' => 'JE',
  200.                     'Jordanie' => 'JO',
  201.                     'Kazakhstan' => 'KZ',
  202.                     'Kenya' => 'KE',
  203.                     'Kirghizistan' => 'KG',
  204.                     'Kiribati' => 'KI',
  205.                     'Koweït' => 'KW',
  206.                     'Lao, république démocratique populaire' => 'LA',
  207.                     'Lesotho' => 'LS',
  208.                     'Lettonie' => 'LV',
  209.                     'Liban' => 'LB',
  210.                     'Libéria' => 'LR',
  211.                     'Libye' => 'LY',
  212.                     'Liechtenstein' => 'LI',
  213.                     'Lituanie' => 'LT',
  214.                     'Luxembourg' => 'LU',
  215.                     'Macao' => 'MO',
  216.                     'Macédoine, l\'ex république yougoslave de' => 'MK',
  217.                     'Madagascar' => 'MG',
  218.                     'Malaisie' => 'MY',
  219.                     'Malawi' => 'MW',
  220.                     'Maldives' => 'MV',
  221.                     'Mali' => 'ML',
  222.                     'Malte' => 'MT',
  223.                     'Mariannes du nord, îles' => 'MP',
  224.                     'Maroc' => 'MA',
  225.                     'Marshall, îles' => 'MH',
  226.                     'Martinique' => 'MQ',
  227.                     'Maurice' => 'MU',
  228.                     'Mauritanie' => 'MR',
  229.                     'Mayotte' => 'YT',
  230.                     'Mexique' => 'MX',
  231.                     'Micronésie, états fédérés de' => 'FM',
  232.                     'Moldova, république de' => 'MD',
  233.                     'Monaco' => 'MC',
  234.                     'Mongolie' => 'MN',
  235.                     'Monténégro' => 'ME',
  236.                     'Montserrat' => 'MS',
  237.                     'Mozambique' => 'MZ',
  238.                     'Myanmar' => 'MM',
  239.                     'Namibie' => 'NA',
  240.                     'Nauru' => 'NR',
  241.                     'Népal' => 'NP',
  242.                     'Nicaragua' => 'NI',
  243.                     'Niger' => 'NE',
  244.                     'Nigéria' => 'NG',
  245.                     'Niué' => 'NU',
  246.                     'Norfolk, île' => 'NF',
  247.                     'Norvège' => 'NO',
  248.                     'Nouvelle calédonie' => 'NC',
  249.                     'Nouvelle zélande' => 'NZ',
  250.                     'Océan indien, territoire britannique de l\'' => 'IO',
  251.                     'Oman' => 'OM',
  252.                     'Ouganda' => 'UG',
  253.                     'Ouzbékistan' => 'UZ',
  254.                     'Pakistan' => 'PK',
  255.                     'Palaos' => 'PW',
  256.                     'Palestinien occupé, territoire' => 'PS',
  257.                     'Panama' => 'PA',
  258.                     'Papouasie nouvelle guinée' => 'PG',
  259.                     'Paraguay' => 'PY',
  260.                     'Pays bas' => 'NL',
  261.                     'Pérou' => 'PE',
  262.                     'Philippines' => 'PH',
  263.                     'Pitcairn' => 'PN',
  264.                     'Pologne' => 'PL',
  265.                     'Polynésie française' => 'PF',
  266.                     'Porto rico' => 'PR',
  267.                     'Portugal' => 'PT',
  268.                     'Qatar' => 'QA',
  269.                     'Réunion' => 'RE',
  270.                     'Roumanie' => 'RO',
  271.                     'Royaume uni' => 'GB',
  272.                     'Russie, fédération de' => 'RU',
  273.                     'Rwanda' => 'RW',
  274.                     'Sahara occidental' => 'EH',
  275.                     'Saint barthélemy' => 'BL',
  276.                     'Sainte hélène, ascension et tristan da cunha' => 'SH',
  277.                     'Sainte lucie' => 'LC',
  278.                     'Saint kitts et nevis' => 'KN',
  279.                     'Saint marin' => 'SM',
  280.                     'Saint martin(partie française)' => 'MF',
  281.                     'Saint martin (partie néerlandaise)' => 'SX',
  282.                     'Saint pierre et miquelon' => 'PM',
  283.                     'Saint siège (état de la cité du vatican)' => 'VA',
  284.                     'Saint vincent et les grenadines' => 'VC',
  285.                     'Salomon, îles' => 'SB',
  286.                     'Samoa' => 'WS',
  287.                     'Samoa américaines' => 'AS',
  288.                     'Sao tomé et principe' => 'ST',
  289.                     'Sénégal' => 'SN',
  290.                     'Serbie' => 'RS',
  291.                     'Seychelles' => 'SC',
  292.                     'Sierra leone' => 'SL',
  293.                     'Singapour' => 'SG',
  294.                     'Slovaquie' => 'SK',
  295.                     'Slovénie' => 'SI',
  296.                     'Somalie' => 'SO',
  297.                     'Soudan' => 'SD',
  298.                     'Soudan du sud' => 'SS',
  299.                     'Sri lanka' => 'LK',
  300.                     'Suède' => 'SE',
  301.                     'Suisse' => 'CH',
  302.                     'Suriname' => 'SR',
  303.                     'Svalbard et île jan mayen' => 'SJ',
  304.                     'Swaziland' => 'SZ',
  305.                     'Syrienne, république arabe' => 'SY',
  306.                     'Tadjikistan' => 'TJ',
  307.                     'Taïwan, province de chine' => 'TW',
  308.                     'Tanzanie, république unie de' => 'TZ',
  309.                     'Tchad' => 'TD',
  310.                     'Tchèque, république' => 'CZ',
  311.                     'Terres australes françaises' => 'TF',
  312.                     'Thaïlande' => 'TH',
  313.                     'Timor leste' => 'TL',
  314.                     'Togo' => 'TG',
  315.                     'Tokelau' => 'TK',
  316.                     'Tonga' => 'TO',
  317.                     'Trinité et tobago' => 'TT',
  318.                     'Tunisie' => 'TN',
  319.                     'Turkménistan' => 'TM',
  320.                     'Turks et caïcos, îles' => 'TC',
  321.                     'Turquie' => 'TR',
  322.                     'Tuvalu' => 'TV',
  323.                     'Ukraine' => 'UA',
  324.                     'Uruguay' => 'UY',
  325.                     'Vanuatu' => 'VU',
  326.                     'Venezuela, république bolivarienne du' => 'VE',
  327.                     'Viet nam' => 'VN',
  328.                     'Wallis et futuna' => 'WF',
  329.                     'Yémen' => 'YE',
  330.                     'Zambie' => 'ZM',
  331.                     'Zimbabwe' => 'ZW',
  332.                 ],
  333.                 'attr' => [
  334.                     'class' => 'fac-country pl-2 py-2 border border-black border-t-0',
  335.                 ],
  336.                 'required' => true,
  337.             ])
  338.             ->add('newsletter'CheckboxType::class, [
  339.                 'label' => $this->translator->trans("Oui, j'accepte d'être contacté pour recevoir des offres promotionnelles"),
  340.                 'required' => false,
  341.             ])
  342.         ;
  343.         $builder->addEventListener(FormEvents::PRE_SUBMIT, function (FormEvent $event) {
  344.             $data $event->getData();
  345.             $form $event->getForm();
  346.             if (isset($data['email'])) {
  347.                 $newEmail $data['email'];
  348.                 $existingContact $this->contactService->findOneByEmail($newEmail);
  349.                 if ($existingContact) {
  350.                     $form->setData($existingContact);
  351.                 } else {
  352.                     $newContact = new Contact();
  353.                     $form->setData($newContact);
  354.                 }
  355.             }
  356.         });
  357.     }
  358.     public function configureOptions(OptionsResolver $resolver): void
  359.     {
  360.         $resolver->setDefaults([
  361.             'data_class' => Contact::class,
  362.         ]);
  363.     }
  364. }