src/Form/RegistrationFormType.php line 18

Open in your IDE?
  1. <?php
  2. namespace App\Form;
  3. use App\Entity\User;
  4. use Symfony\Component\Form\AbstractType;
  5. use Symfony\Component\Form\Extension\Core\Type\CheckboxType;
  6. use Symfony\Component\Form\Extension\Core\Type\EmailType;
  7. use Symfony\Component\Form\Extension\Core\Type\PasswordType;
  8. use Symfony\Component\Form\Extension\Core\Type\TextType;
  9. use Symfony\Component\Form\FormBuilderInterface;
  10. use Symfony\Component\OptionsResolver\OptionsResolver;
  11. use Symfony\Component\Validator\Constraints\IsTrue;
  12. use Symfony\Component\Validator\Constraints\Length;
  13. use Symfony\Component\Validator\Constraints\NotBlank;
  14. use Symfony\Component\Validator\Constraints\Regex;
  15. class RegistrationFormType extends AbstractType
  16. {
  17.     public function buildForm(FormBuilderInterface $builder, array $options): void
  18.     {
  19.         $builder
  20.             ->add('surname'TextType::class, [
  21.                 'attr' => [
  22.                     'class' => 'form-control mb-3 p-4 formValidationName' ,
  23.                     'placeholder' => 'Prénom',
  24.                     'style' => 'text-transform: none'
  25.                 ],
  26.                 'constraints' => [
  27.                     new Regex([
  28.                         'pattern' => '/^[A-Za-zÀ-ÿ\s-]+$/',
  29.                         'message' => 'Le prénom ne peut contenir que des lettres, espaces et tirets.'
  30.                     ])
  31.                 ]                
  32.             ])
  33.             ->add('firstname'TextType::class, [
  34.                 'attr' => [
  35.                     'class' => 'form-control mb-3 p-4 formValidationFamilyName',
  36.                     'placeholder' => 'Nom'
  37.                 ],
  38.                 'constraints' => [
  39.                     new Regex([
  40.                         'pattern' => '/^[A-Za-zÀ-ÿ\s-]+$/',
  41.                         'message' => 'Le nom ne peut contenir que des lettres, espaces et tirets.'
  42.                     ])
  43.                 ]                
  44.             ])
  45.             ->add('phone'TextType::class, [
  46.                 'attr' => [
  47.                     'class' => 'form-control mb-3 p-4 formValidationPhone',
  48.                     'placeholder' => 'Téléphone'
  49.                 ],
  50.                 'required' => false,
  51.                 'constraints' => [
  52.                     new Regex([
  53.                         'pattern' => '/^\+?[0-9\s.-]{7,15}$/',
  54.                         'message' => 'Numéro de téléphone invalide.'
  55.                     ])
  56.                 ]                
  57.             ])
  58.             ->add('adress'TextType::class, [
  59.                 'attr' => [
  60.                     'class' => 'form-control mb-3 p-4 formValidationStreet',
  61.                     'placeholder' => 'Adresse'
  62.                 ],
  63.                 'constraints' => [
  64.                     new Regex([
  65.                         'pattern' => '/^[0-9A-Za-zÀ-ÿ\s,.-]+$/',
  66.                         'message' => 'L\'adresse ne peut contenir que des lettres, chiffres, espaces, virgules, points et tirets.'
  67.                     ])
  68.                 ]                
  69.             ])
  70.             ->add('additionalAdressInformation'TextType::class, [
  71.                 'attr' => [
  72.                     'class' => 'form-control mb-3 p-4 formValidationText',
  73.                     'placeholder' => 'Information supplémentaires'
  74.                 ],
  75.                 'required' => false,
  76.                 'constraints' => [
  77.                     new Length([
  78.                         'min' => 1,
  79.                         'max' => 64,
  80.                         'minMessage' => 'Les informations supplémentaires doivent contenir au moins {{ limit }} caractère.',
  81.                         'maxMessage' => 'Les informations supplémentaires ne peuvent pas dépasser {{ limit }} caractères.'
  82.                     ]),
  83.                     new Regex([
  84.                         'pattern' => '/^[^<>\\"\'\{\}\[\]\(\)]+$/',
  85.                         'message' => 'Les informations supplémentaires ne doivent pas contenir de code informatique ou de caractères spéciaux interdits.'
  86.                     ])
  87.                 ]                
  88.             ])
  89.             ->add('city'TextType::class, [
  90.                 'attr' => [
  91.                     'class' => 'form-control mb-3 p-4 formValidationCity',
  92.                     'placeholder' => 'Ville'
  93.                 ],
  94.                 'constraints' => [
  95.                     new Regex([
  96.                         'pattern' => '/^[A-Za-zÀ-ÿ\s-]+$/',
  97.                         'message' => 'Le nom de la ville ne peut contenir que des lettres, espaces et tirets.'
  98.                     ])
  99.                 ]                
  100.             ])
  101.             ->add('zipcode'TextType::class, [
  102.                 'attr' => [
  103.                     'class' => 'form-control mb-3 p-4 formValidationZipCode',
  104.                     'placeholder' => 'Code postal'
  105.                 ],
  106.                 'constraints' => [
  107.                     new Regex([
  108.                         'pattern' => '/^\d{5}$/',
  109.                         'message' => 'Le code postal doit contenir exactement 5 chiffres.'
  110.                     ])
  111.                 ]                
  112.             ])
  113.             ->add('email'EmailType::class, [
  114.                 'attr' => [
  115.                     'class' => 'form-control mb-3 p-4 formValidationMail',
  116.                     'placeholder' => 'Votre Email'
  117.                 ],
  118.                 'constraints' => [
  119.                     new Regex([
  120.                         'pattern' => '/^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$/',
  121.                         'message' => 'Adresse email invalide.'
  122.                     ])
  123.                 ]                
  124.             ])
  125.             ->add('agreeTerms'CheckboxType::class, [
  126.                 'mapped' => false,
  127.                 'required' => true,
  128.                 'constraints' => [
  129.                     new IsTrue([
  130.                         'message' => 'You should agree to our terms.',
  131.                     ]),
  132.                 ],
  133.                 'label' => 'J\'accepte les conditions générales de vente:'
  134.             ])
  135.             ->add('plainPassword'PasswordType::class, [
  136.                 // instead of being set onto the object directly,
  137.                 // this is read and encoded in the controller
  138.                 'mapped' => false,
  139.                 'attr' => ['autocomplete' => 'new-password'],
  140.                 'required' => true,
  141.                 'constraints' => [
  142.                     new NotBlank([
  143.                         'message' => 'Please enter a password',
  144.                     ]),
  145.                     new Length([
  146.                         'min' => 8,
  147.                         'minMessage' => 'Votre mot de passe dois faire au moins {{ limit }} caractères',
  148.                         'max' => 64,
  149.                         'maxMessage' => 'Le mot de passe ne peut pas dépasser {{ limit }} caractères'
  150.                     ]),
  151.                     // Validation de caractères interdits dans le mot de passe
  152.                     new Regex([
  153.                         'pattern' => '/[^!@#]+/',  // Les caractères interdits (ex: !, @, #)
  154.                         'match' => true,  // Cette expression signifie que tout caractère doit être différent de ceux indiqués dans le pattern
  155.                         'message' => 'Le mot de passe ne peut pas contenir les caractères !, @, #.',
  156.                     ]),
  157.                     // Validation contre les caractères dangereux
  158.                     new Regex([
  159.                         'pattern' => '/^[^\x22\x27\x28\x29\x3C\x3E\x60]+$/'// Interdit les guillemets, parenthèses et autres caractères dangereux
  160.                         'message' => 'Le mot de passe contient des caractères interdits.',
  161.                     ]),
  162.                     // Validation contre les mots de passe vides
  163.                     new NotBlank([
  164.                         'message' => 'Le mot de passe ne peut pas être vide.',
  165.                     ]),                    
  166.                 ],
  167.                 'attr' => [
  168.                     'class' => 'form-control mb-3 p-4 formValidationCode',
  169.                     'placeholder' => 'Votre mot de passe'
  170.                 ]
  171.             ])
  172.         ;
  173.     }
  174.     public function configureOptions(OptionsResolver $resolver): void
  175.     {
  176.         $resolver->setDefaults([
  177.             'data_class' => User::class,
  178.             'attr' => ['id' => 'registration_form',
  179.             'class' => 'form-group flex-wrap'
  180.             ]
  181.         ]);
  182.     }
  183. }