src/Form/PrescriberRegistrationType.php line 88

Open in your IDE?
  1. <?php
  2. namespace App\Form;
  3. use App\Entity\Country;
  4. use App\Entity\Prescriber;
  5. use App\Entity\PrescriberSpeciality;
  6. use Symfony\Bridge\Doctrine\Form\Type\EntityType;
  7. use Symfony\Component\Form\AbstractType;
  8. use Symfony\Component\Form\Extension\Core\Type\CheckboxType;
  9. use Symfony\Component\Form\Extension\Core\Type\EmailType;
  10. use Symfony\Component\Form\Extension\Core\Type\PasswordType;
  11. use Symfony\Component\Form\Extension\Core\Type\RepeatedType;
  12. use Symfony\Component\Form\Extension\Core\Type\TextType;
  13. use Symfony\Component\Form\Extension\Core\Type\ChoiceType;
  14. use Symfony\Component\Form\FormBuilderInterface;
  15. use Symfony\Component\OptionsResolver\OptionsResolver;
  16. use Doctrine\ORM\EntityRepository;
  17. use Symfony\Component\Validator\Constraints\Email;
  18. use Symfony\Component\Validator\Constraints\IsTrue;
  19. use Symfony\Component\Validator\Constraints\Length;
  20. use Symfony\Component\Validator\Constraints\NotBlank;
  21. use Symfony\Component\Validator\Constraints\Regex;
  22. class PrescriberRegistrationType extends AbstractType
  23. {
  24.     public function buildForm(FormBuilderInterface $builder, array $options): void
  25.     {
  26.         $builder
  27.             ->add('firstname'TextType::class, [
  28.                 'label' => 'Prénom',
  29.                 'attr' => [
  30.                     'autocomplete' => 'given-name'
  31.                 ],
  32.                 'constraints' => [
  33.                     new NotBlank(['message' => 'Veuillez entrer votre prénom']),
  34.                     new Length(['min' => 2'max' => 50'minMessage' => 'Votre prénom doit comporter au moins {{ limit }} caractères''maxMessage' => 'Votre prénom ne peut pas dépasser {{ limit }} caractères']),
  35.                 ],
  36.             ])
  37.             ->add('lastname'TextType::class, [
  38.                 'label' => 'Nom',
  39.                 'attr' => [
  40.                     'autocomplete' => 'family-name'
  41.                 ],
  42.                 'constraints' => [
  43.                     new NotBlank(['message' => 'Veuillez entrer votre nom']),
  44.                     new Length(['min' => 2'max' => 50'minMessage' => 'Votre nom doit comporter au moins {{ limit }} caractères''maxMessage' => 'Votre nom ne peut pas dépasser {{ limit }} caractères']),
  45.                     new Regex(['pattern' => '/^[a-zA-Z\- ]+$/''message' => 'Le nom ne peut contenir que des lettres, des tirets et des espaces.']),
  46.                 ],
  47.             ])
  48.             ->add('civility'ChoiceType::class, [
  49.                 'label' => 'Civilité',
  50.                 'required' => false,
  51.                 'choices' => [
  52.                     'M.' => 'M.',
  53.                     'Mme' => 'Mme',
  54.                     'Dr' => 'Dr',
  55.                     'Pr' => 'Pr',
  56.                     'Autre' => 'Autre'
  57.                 ],
  58.                 'placeholder' => 'Civilité',
  59.             ])
  60.             ->add('rppsNumber'TextType::class, [
  61.                 'label' => 'Numéro RPPS',
  62.                 'required' => false,
  63.                 'constraints' => [
  64.                     new Length(['min' => 11'max' => 11'exactMessage' => 'Le numéro RPPS doit comporter exactement {{ limit }} chiffres.']),
  65.                     new Regex(['pattern' => '/^\d{11}$/''message' => 'Le numéro RPPS ne peut contenir que des chiffres.']),
  66.                 ],
  67.             ])
  68.             ->add('sirenNumber'TextType::class, [
  69.                 'label' => 'Numéro SIREN',
  70.                 'required' => true,
  71.                 'constraints' => [
  72.                     new NotBlank(['message' => 'Le numéro SIREN est obligatoire.']),
  73.                     new Length(['min' => 9'max' => 9'exactMessage' => 'Le numéro SIREN doit comporter exactement {{ limit }} chiffres.']),
  74.                     new Regex(['pattern' => '/^\d{9}$/''message' => 'Le numéro SIREN ne peut contenir que 9 chiffres.']),
  75.                 ]
  76.             ])
  77.             ->add('mainSpeciality'EntityType::class, [
  78.                 'class' => PrescriberSpeciality::class,
  79.                 'choice_label' => 'name',
  80.                 'placeholder' => 'Sélectionnez votre spécialité',
  81.                 'label' => 'Votre spécialité',
  82.                 'attr' => [
  83.                     'class' => 'form-control select2 select2-height-fix'
  84.                 ],
  85.                 'query_builder' => function (EntityRepository $er) {
  86.                     return $er->createQueryBuilder('s')
  87.                         ->orderBy('s.name''ASC');
  88.                 },
  89.                 'constraints' => [
  90.                     new NotBlank(['message' => 'Veuillez sélectionner votre spécialité']),
  91.                 ],
  92.             ])
  93.             ->add('company'TextType::class, [
  94.                 'label' => 'Nom de votre société',
  95.                 'required' => false,
  96.                 'constraints' => [
  97.                     new Length(['max' => 255'maxMessage' => 'Le nom de votre société ne peut pas dépasser {{ limit }} caractères']),
  98.                 ],
  99.             ])
  100.             ->add('email'EmailType::class, [
  101.                 'label' => 'Email',
  102.                 'attr' => [
  103.                     'autocomplete' => 'email',
  104.                     'placeholder' => 'votre.email@exemple.com',
  105.                     'inputmode' => 'email'
  106.                 ],
  107.                 'constraints' => [
  108.                     new NotBlank(['message' => 'Veuillez entrer votre adresse email']),
  109.                     new Email(['message' => 'L\'adresse email "{{ value }}" n\'est pas valide.']),
  110.                 ],
  111.             ])
  112.             ->add('username'TextType::class, [
  113.                 'label' => 'Identifiant',
  114.                 'attr' => ['class' => 'lowercase'],
  115.                 'constraints' => [
  116.                     new NotBlank(['message' => 'Veuillez choisir un identifiant']),
  117.                     new Length(['min' => 3'max' => 25'minMessage' => 'Votre identifiant doit comporter au moins {{ limit }} caractères''maxMessage' => 'Votre identifiant ne peut pas dépasser {{ limit }} caractères']),
  118.                 ],
  119.             ])
  120.             ->add('plainPassword'RepeatedType::class, [
  121.                 'type' => PasswordType::class,
  122.                 'mapped' => false,
  123.                 'first_options' => [
  124.                     'label' => 'Mot de passe',
  125.                     'constraints' => [
  126.                         new NotBlank(['message' => 'Veuillez entrer un mot de passe']),
  127.                         new Length(['min' => 6'minMessage' => 'Votre mot de passe doit comporter au moins {{ limit }} caractères''max' => 4096]),
  128.                     ],
  129.                 ],
  130.                 'second_options' => ['label' => 'Confirmer le mot de passe'],
  131.                 'invalid_message' => 'Les mots de passe doivent correspondre.',
  132.             ])
  133.             ->add('address'TextType::class, [
  134.                 'label' => 'Adresse',
  135.                 'attr' => [
  136.                     'autocomplete' => 'street-address'
  137.                 ],
  138.                 'constraints' => [
  139.                     new NotBlank(['message' => 'Veuillez entrer votre adresse']),
  140.                 ],
  141.             ])
  142.             ->add('address2'TextType::class, [
  143.                 'label' => 'Complément d\'adresse',
  144.                 'required' => false,
  145.             ])
  146.             ->add('postalCode'TextType::class, [
  147.                 'label' => 'Code postal',
  148.                 'attr' => [
  149.                     'autocomplete' => 'postal-code'
  150.                 ],
  151.                 'constraints' => [
  152.                     new NotBlank(['message' => 'Veuillez entrer votre code postal']),
  153.                 ],
  154.             ])
  155.             ->add('city'TextType::class, [
  156.                 'label' => 'Ville',
  157.                 'attr' => [
  158.                     'autocomplete' => 'address-level2'
  159.                 ],
  160.                 'constraints' => [
  161.                     new NotBlank(['message' => 'Veuillez entrer votre ville']),
  162.                 ],
  163.             ])
  164.             ->add('country'EntityType::class, [
  165.                 'class' => Country::class,
  166.                 'choice_label' => 'name',
  167.                 'placeholder' => 'Sélectionnez votre pays',
  168.                 'label' => 'Pays',
  169.                 'attr' => [
  170.                     'autocomplete' => 'country'
  171.                 ],
  172.                 'constraints' => [
  173.                     new NotBlank(['message' => 'Veuillez sélectionner votre pays']),
  174.                 ],
  175.             ])
  176.             ->add('phone'TextType::class, [
  177.                 'label' => 'Téléphone',
  178.                 'attr' => [
  179.                     'autocomplete' => 'tel'
  180.                 ],
  181.                 'constraints' => [
  182.                     new NotBlank(['message' => 'Veuillez entrer votre numéro de téléphone']),
  183.                 ],
  184.             ])
  185.             ->add('sourceDiscovery'ChoiceType::class, [
  186.                 'label' => 'Comment nous avez-vous connus ?',
  187.                 'required' => false,
  188.                 'placeholder' => 'Sélectionnez une option',
  189.                 'choices' => [
  190.                     'Recommandations d\'un confrère/consœur' => 'colleague_recommendation',
  191.                     'Recommandations d\'un(e) ami(e)/familiale' => 'friend_family_recommendation',
  192.                     'Recherche sur Internet' => 'internet_search',
  193.                     'Réseaux sociaux' => 'social_media',
  194.                     'Réseaux BIONOPS (promoteurs, direction)' => 'bionops_network',
  195.                     'Evènements professionnels (salons, symposium, formations)' => 'professional_events',
  196.                     'Demande d\'un patient' => 'patient_request',
  197.                     'Autre' => 'other'
  198.                 ],
  199.                 'attr' => [
  200.                     'class' => 'form-select'
  201.                 ]
  202.             ])
  203.             ->add('agreeTerms'CheckboxType::class, [
  204.                 'mapped' => false,
  205.                 'label' => 'J\'accepte les CGU du Club Espace Professionnel BIONOPS',
  206.                 'constraints' => [
  207.                     new IsTrue(['message' => 'Vous devez accepter nos conditions générales d\'utilisation pour vous inscrire.']),
  208.                 ],
  209.             ])
  210.         ;
  211.     }
  212.     public function configureOptions(OptionsResolver $resolver): void
  213.     {
  214.         $resolver->setDefaults([
  215.             'data_class' => Prescriber::class,
  216.         ]);
  217.     }