src/Form/Website/Type/Newsletter/NewsletterType.php line 18

Open in your IDE?
  1. <?php
  2. namespace App\Form\Website\Type\Newsletter;
  3. use Symfony\Component\Form\AbstractType;
  4. use Symfony\Component\Form\Extension\Core\Type\CheckboxType;
  5. use Symfony\Component\Form\Extension\Core\Type\ChoiceType;
  6. use Symfony\Component\Form\Extension\Core\Type\EmailType;
  7. use Symfony\Component\Form\Extension\Core\Type\TextType;
  8. use Symfony\Component\Form\FormBuilderInterface;
  9. use Symfony\Component\Form\FormEvent;
  10. use Symfony\Component\Form\FormEvents;
  11. use Symfony\Component\OptionsResolver\OptionsResolver;
  12. use Symfony\Component\Validator\Constraints\Email;
  13. use Symfony\Component\Validator\Constraints\IsTrue;
  14. use Symfony\Component\Validator\Constraints\NotBlank;
  15. class NewsletterType extends AbstractType
  16. {
  17. public function buildForm(FormBuilderInterface $builder, array $options): void
  18. {
  19. $builder
  20. // Civilité - Radio buttons
  21. ->add('civility', ChoiceType::class, [
  22. 'label' => 'Civilité',
  23. 'required' => true,
  24. 'choices' => [
  25. 'M.' => 'M.',
  26. 'Mme' => 'Mme',
  27. ],
  28. 'expanded' => true,
  29. 'multiple' => false,
  30. 'constraints' => [
  31. new NotBlank([
  32. 'message' => 'Veuillez sélectionner une civilité.',
  33. ]),
  34. ],
  35. ])
  36. // Nom
  37. ->add('lastName', TextType::class, [
  38. 'label' => 'Nom',
  39. 'required' => true,
  40. 'attr' => [
  41. 'placeholder' => 'Nom',
  42. ],
  43. 'constraints' => [
  44. new NotBlank([
  45. 'message' => 'Le nom est obligatoire.',
  46. ]),
  47. ],
  48. ])
  49. // Prénom
  50. ->add('firstName', TextType::class, [
  51. 'label' => 'Prénom',
  52. 'required' => true,
  53. 'attr' => [
  54. 'placeholder' => 'Prénom',
  55. ],
  56. 'constraints' => [
  57. new NotBlank([
  58. 'message' => 'Le prénom est obligatoire.',
  59. ]),
  60. ],
  61. ])
  62. // Email
  63. ->add('email', EmailType::class, [
  64. 'label' => 'Email',
  65. 'required' => true,
  66. 'attr' => [
  67. 'placeholder' => 'email@exemple.fr',
  68. ],
  69. 'constraints' => [
  70. new NotBlank([
  71. 'message' => 'L\'adresse email est obligatoire.',
  72. ]),
  73. new Email([
  74. 'message' => 'Veuillez saisir une adresse email valide.',
  75. ]),
  76. ],
  77. ])
  78. // Confirmation de l'email
  79. ->add('emailConfirmation', EmailType::class, [
  80. 'label' => 'Confirmation de l\'email',
  81. 'required' => true,
  82. 'attr' => [
  83. 'placeholder' => 'email@exemple.fr',
  84. ],
  85. 'constraints' => [
  86. new NotBlank([
  87. 'message' => 'La confirmation de l\'adresse email est obligatoire.',
  88. ]),
  89. new Email([
  90. 'message' => 'Veuillez saisir une adresse email valide.',
  91. ]),
  92. ],
  93. ])
  94. // Checkbox de consentement
  95. ->add('consent', CheckboxType::class, [
  96. 'label' => 'website.forms.newsletter.label.consent',
  97. 'required' => true,
  98. 'constraints' => [
  99. new IsTrue([
  100. 'message' => 'Vous devez accepter l\'exploitation de vos données.',
  101. ]),
  102. ],
  103. ]);
  104. // Validation pour vérifier que les emails correspondent
  105. $builder->addEventListener(FormEvents::POST_SUBMIT, function (FormEvent $event) {
  106. $form = $event->getForm();
  107. $email = $form->get('email')->getData();
  108. $emailConfirmation = $form->get('emailConfirmation')->getData();
  109. if ($email !== $emailConfirmation) {
  110. $form->get('emailConfirmation')->addError(
  111. new \Symfony\Component\Form\FormError('Les adresses email doivent correspondre.')
  112. );
  113. }
  114. });
  115. }
  116. public function configureOptions(OptionsResolver $resolver): void
  117. {
  118. $resolver->setDefaults([
  119. 'csrf_protection' => true,
  120. ]);
  121. }
  122. }