src/Form/RegistrationFormType.php line 28

Open in your IDE?
  1. <?php
  2. namespace App\Form;
  3. use App\Entity\Address;
  4. use App\Entity\Customer;
  5. use App\Entity\User;
  6. use Symfony\Component\Form\AbstractType;
  7. use Symfony\Component\Form\Extension\Core\Type\CheckboxType;
  8. use Symfony\Component\Form\Extension\Core\Type\ChoiceType;
  9. use Symfony\Component\Form\Extension\Core\Type\CollectionType;
  10. use Symfony\Component\Form\Extension\Core\Type\DateType;
  11. use Symfony\Component\Form\Extension\Core\Type\EmailType;
  12. use Symfony\Component\Form\Extension\Core\Type\PasswordType;
  13. use Symfony\Component\Form\Extension\Core\Type\RepeatedType;
  14. use Symfony\Component\Form\Extension\Core\Type\SubmitType;
  15. use Symfony\Component\Form\Extension\Core\Type\TelType;
  16. use Symfony\Component\Form\Extension\Core\Type\TextType;
  17. use Symfony\Component\Form\FormBuilderInterface;
  18. use Symfony\Component\Form\FormEvent;
  19. use Symfony\Component\Form\FormEvents;
  20. use Symfony\Component\OptionsResolver\OptionsResolver;
  21. use Symfony\Component\Validator\Constraints\IsTrue;
  22. use Symfony\Component\Validator\Constraints\Length;
  23. use Symfony\Component\Validator\Constraints\NotBlank;
  24. use Symfony\Component\Validator\Constraints\Regex;
  25. class RegistrationFormType extends AbstractType
  26. {
  27. public function buildForm(FormBuilderInterface $builder, array $options): void
  28. {
  29. $builder->addEventListener(FormEvents::PRE_SET_DATA, function (FormEvent $event) {
  30. /**
  31. * @var Customer $customer
  32. */
  33. $customer = $event->getData();
  34. $form = $event->getForm();
  35. if (!$customer->getEmail()) {
  36. //if (!method_exists('customer', 'getEmail')) {
  37. $form
  38. ->add('email', EmailType::class, [
  39. 'label' => 'Adresse Email',
  40. 'attr' => array(
  41. 'placeholder' => 'Adresse email',
  42. ),
  43. 'constraints' => [
  44. new NotBlank([
  45. 'message' => "Merci d'entrer un email",
  46. ]),
  47. new Regex(
  48. "/^([a-z0-9]+(?:[._-][a-z0-9]+)*)@([a-z0-9]+(?:[.-][a-z0-9]+)*\.[a-z]{2,})$/",
  49. 'Votre email n\'est pas valide.'
  50. )
  51. ]
  52. ])
  53. ->add('plainPassword', RepeatedType::class, [
  54. 'type' => PasswordType::class,
  55. 'mapped' => false,
  56. 'constraints' => [
  57. new NotBlank([
  58. 'message' => "Merci d'entrer un mot de passe",
  59. ]),
  60. new Length([
  61. 'min' => 6,
  62. // max length allowed by Symfony for security reasons
  63. 'max' => 4096,
  64. ]),
  65. new Regex(
  66. "/^(?=.*?[A-Z])(?=.*?[a-z])(?=.*?[0-9])(?=.*?[#?+!@$%^&*-]).{8,}$/",
  67. 'Votre mot de passe doit comporter au moins 6 caractères, dont des lettres majuscules et minuscules, un chiffre et un symbole.'
  68. )
  69. ],
  70. 'first_options' => array('label' => 'Mot de passe', 'attr' => ['placeholder' => 'Mot de passe']),
  71. 'second_options' => array('label' => 'Répéter le mot de passe', 'attr' => ['placeholder' => 'Confirmer le mot de passe']),
  72. 'invalid_message' => 'Les 2 mots de passes ne correspondent pas.',
  73. ]);
  74. }
  75. else
  76. {
  77. if ($customer->getEmail() && !$customer->getCivility()) {
  78. $form
  79. ->add('civility', ChoiceType::class, [
  80. 'choices' => [
  81. 'Mr' => 'Mr',
  82. 'Mme' => 'Mme',
  83. 'Mlle' => 'Mlle',
  84. ],
  85. 'label' => 'Civilité',
  86. 'placeholder' => 'Sélectionnez votre civilité'
  87. ])
  88. ->add('lastName', TextType::class, [
  89. 'label' => 'Nom',
  90. 'attr' => array(
  91. 'placeholder' => 'Nom'
  92. )
  93. ])
  94. ->add('firstName', TextType::class, [
  95. 'label' => 'Prénom',
  96. 'attr' => array(
  97. 'placeholder' => 'Prénom'
  98. )
  99. ])
  100. ->add('birthDate', DateType::class, [
  101. 'widget' => 'single_text',
  102. 'label' => 'Date de naissance',
  103. 'attr' => array(
  104. 'placeholder' => 'Date de naissance'
  105. )
  106. // this is actually the default format for single_text
  107. ])
  108. ->add('phone', TelType::class, [
  109. 'label' => 'Téléphone',
  110. 'attr' => array(
  111. 'placeholder' => 'Téléphone'
  112. ),
  113. ]);
  114. }
  115. if ($customer->getCivility() && count($customer->getAddresses()) == 0) {
  116. $form->add('agreeTerms', CheckboxType::class, [
  117. 'label' => 'Je certifie que mes informations fournies sont exactes',
  118. 'mapped' => false,
  119. 'constraints' => [
  120. new IsTrue([
  121. 'message' => 'Vous devez accepter les termes pour continuer.',
  122. ]),
  123. ],
  124. ])
  125. ->add('addresses', CollectionType::class, [
  126. 'entry_type' => AddressesType::class,
  127. 'prototype' => false,
  128. 'label' => false,
  129. 'data' => [new Address()]
  130. ]);
  131. }
  132. if (count($customer->getAddresses()) == 1 && !$customer->getKnow()) {
  133. $form
  134. ->add('know', ChoiceType::class, [
  135. 'choices' => [
  136. 'Bouche à oreille' => 'Bouche à oreille',
  137. 'Réseaux sociaux' => 'Réseaux sociaux',
  138. 'En faisant des recharches' => 'En faisant des recharches',
  139. 'Dans une publicité' => 'Dans une publicité',
  140. 'Autre' => 'Autre',
  141. ],
  142. 'expanded' => true,
  143. 'label' => false
  144. ])
  145. ->add('other', TextType::class, [
  146. 'mapped' => false,
  147. 'label' => false,
  148. 'required' => false
  149. ]);
  150. }
  151. }
  152. });
  153. $builder
  154. ->add('save', SubmitType::class);
  155. }
  156. public function configureOptions(OptionsResolver $resolver): void
  157. {
  158. $resolver->setDefaults([
  159. 'data_class' => User::class,
  160. 'attr' => ['id' => 'myForm']
  161. ]);
  162. }
  163. }