src/Form/RegistrationType.php line 187

Open in your IDE?
  1. <?php
  2. // src/Form/RegistrationType.php
  3. namespace App\Form;
  4. use App\Service\SynchroHubService;
  5. use App\Entity\Contact;
  6. use App\Entity\User;
  7. use App\Entity\Category;
  8. use App\Entity\TypologieStructure;
  9. use App\Repository\TypologieStructureRepository;
  10. use Doctrine\ORM\EntityManagerInterface;
  11. use EWZ\Bundle\RecaptchaBundle\Form\Type\EWZRecaptchaType;
  12. use EWZ\Bundle\RecaptchaBundle\Validator\Constraints\IsTrue as RecaptchaTrue;
  13. use Sulu\Bundle\CategoryBundle\Entity\CategoryRepository;
  14. use Sulu\Bundle\ContactBundle\Entity\Address;
  15. use Sulu\Bundle\ContactBundle\Entity\AddressType;
  16. use Sulu\Bundle\ContactBundle\Entity\ContactAddress;
  17. use Sulu\Bundle\SecurityBundle\Entity\Role;
  18. use Sulu\Bundle\SecurityBundle\Entity\UserRole;
  19. use Symfony\Bridge\Doctrine\Form\Type\EntityType;
  20. use Symfony\Component\Form\AbstractType;
  21. use Symfony\Component\Form\FormBuilderInterface;
  22. use Symfony\Component\Form\FormEvents;
  23. use Symfony\Component\Form\FormInterface;
  24. use Symfony\Component\Form\Extension\Core\Type\CheckboxType;
  25. use Symfony\Component\Form\Extension\Core\Type\ChoiceType;
  26. use Symfony\Component\Form\Extension\Core\Type\CollectionType;
  27. use Symfony\Component\Form\Extension\Core\Type\EmailType;
  28. use Symfony\Component\Form\Extension\Core\Type\FileType;
  29. use Symfony\Component\Form\Extension\Core\Type\HiddenType;
  30. use Symfony\Component\Form\Extension\Core\Type\PasswordType;
  31. use Symfony\Component\Form\Extension\Core\Type\RepeatedType;
  32. use Symfony\Component\Form\Extension\Core\Type\SubmitType;
  33. use Symfony\Component\Form\Extension\Core\Type\TextareaType;
  34. use Symfony\Component\Form\Extension\Core\Type\TextType;
  35. use Symfony\Component\Form\FormError;
  36. use Symfony\Component\Form\FormEvent;
  37. use Symfony\Component\HttpFoundation\Session\Flash\FlashBagInterface;
  38. use Symfony\Component\OptionsResolver\OptionsResolver;
  39. use Symfony\Component\Validator\Constraints as Assert;
  40. class RegistrationType extends AbstractType
  41. {
  42.     private $emi;
  43.     private $flashbag;
  44.     private $SynchroHubService;
  45.     const BUTTON_CSS_CLASS 'CTA center';
  46.     const LABEL_ATTR_CSS_CLASS 'fw400 fs14 lh20';
  47.     public function __construct(
  48.         EntityManagerInterface $emi,
  49.         FlashBagInterface $flashbag,
  50.         SynchroHubService $SynchroHubService
  51.     ) {
  52.         $this->emi $emi;
  53.         $this->flashbag $flashbag;
  54.         $this->SynchroHubService $SynchroHubService;
  55.     }
  56.     /**
  57.      * {@inheritdoc}
  58.      */
  59.     public function buildForm(FormBuilderInterface $builder, array $options)
  60.     {
  61.         $builder->add('firstName'TextType::class, [
  62.             'property_path' => 'contact.firstName',
  63.             'label' => 'Prénom *',
  64.             'required' => true,
  65.             'label_attr' => ['class' => self::LABEL_ATTR_CSS_CLASS],
  66.             'attr' => ['placeholder' => 'Prénom'],
  67.             'constraints' => [
  68.                 new Assert\NotBlank(['message' => 'Le prénom est requis.']),
  69.             ],
  70.         ]);
  71.         $builder->add('lastName'TextType::class, [
  72.             'property_path' => 'contact.lastName',
  73.             'label' => 'Nom *',
  74.             'required' => true,
  75.             'label_attr' => ['class' => self::LABEL_ATTR_CSS_CLASS],
  76.             'attr' => ['placeholder' => 'Nom'],
  77.             'constraints' => [
  78.                 new Assert\NotBlank(['message' => 'Le nom est requis.']),
  79.             ],
  80.         ]);
  81.         $builder->add('mainEmail'EmailType::class, [
  82.             'property_path' => 'contact.mainEmail',
  83.             'label' => 'Email *',
  84.             'required' => true,
  85.             'label_attr' => ["class" => self::LABEL_ATTR_CSS_CLASS],
  86.             'attr' => ['placeholder' => 'Email'],
  87.             'constraints' => [
  88.                 new Assert\NotBlank(['message' => 'L\'email est requis.']),
  89.                 new Assert\Email(['message' => 'L\'email doit être au format valide.']),
  90.             ],
  91.         ]);
  92.         $builder->add('avatar'FileType::class, [
  93.             'mapped' => false,
  94.             'property_path' => 'contact.avatar',
  95.             'required' => false,
  96.             'label_attr' => [
  97.                 'class' => self::LABEL_ATTR_CSS_CLASS,
  98.                 'id' => 'filelabel',
  99.                 'tabindex' => 0
  100.             ]
  101.         ]);
  102.         $builder->add('number'TextType::class, [
  103.             'property_path' => 'contact.mainPhone',
  104.             'required' => true,
  105.             'label' => "Téléphone *",
  106.             'label_attr' => ['class' => self::LABEL_ATTR_CSS_CLASS],
  107.             'attr' => ['placeholder' => 'Téléphone']
  108.         ]);
  109.         $builder->add('socialMediaProfiles'CollectionType::class, [
  110.             'property_path' => 'contact.socialMediaProfiles',
  111.             'entry_type' => SocialMediaType::class,
  112.             'allow_add'  => true,
  113.             'allow_delete'  => true,
  114.             'label_attr' => ['class' => self::LABEL_ATTR_CSS_CLASS],
  115.             'label' => 'Vos réseaux sociaux',
  116.             'attr' => ['class' => 'dflex jcsb mt-1em']
  117.         ]);
  118.         $builder->add('note'TextareaType::class, [
  119.             'property_path' => 'contact.note',
  120.             'required' => false,
  121.             'label' => 'Décrivez ce que vous faites / votre champs d\'action ',
  122.             'label_attr' => ['class' => self::LABEL_ATTR_CSS_CLASS],
  123.             'attr' => ['placeholder' => 'Description''class' => 'br6']
  124.         ]);
  125.         $builder->add('structure'TextType::class, [
  126.             'property_path' => 'contact.structure',
  127.             'required' => true,
  128.             'label' => 'Structure *',
  129.             'label_attr' => ['class' => self::LABEL_ATTR_CSS_CLASS],
  130.             'attr' => ['placeholder' => 'Structure'],
  131.             'constraints' => [
  132.                 new Assert\NotBlank(['message' => 'La structure est requise.']),
  133.             ],
  134.         ]);
  135.         $builder->add('structureText'TextType::class, [
  136.             'mapped' => false,
  137.             'required' => true,
  138.             'label' => 'Typologie de structure *',
  139.             'label_attr' => ['class' => self::LABEL_ATTR_CSS_CLASS],
  140.             'attr' => ['placeholder' => 'Typologie de structure']
  141.         ]);
  142.         $builder->add('zip'TextType::class, [
  143.             'property_path' => 'contact.mainAddress.zip',
  144.             'required' => true,
  145.             'label' => 'Code postal *',
  146.             'label_attr' => ["class" => self::LABEL_ATTR_CSS_CLASS],
  147.             'attr' => ['placeholder' => 'Code postal']
  148.         ]);
  149.         $builder->add('street'TextType::class, [
  150.             'property_path' => 'contact.mainAddress.street',
  151.             'required' => true,
  152.             'label' => 'Adresse *',
  153.             'label_attr' => ["class" => self::LABEL_ATTR_CSS_CLASS],
  154.             'attr' => ['placeholder' => 'Adresse']
  155.         ]);
  156.         $builder->add('city'TextType::class, [
  157.             'property_path' => 'contact.mainAddress.city',
  158.             'required' => true,
  159.             'label' => 'Ville *',
  160.             'label_attr' => ["class" => self::LABEL_ATTR_CSS_CLASS],
  161.             'attr' => ['placeholder' => 'Ville']
  162.         ]);
  163.         $builder->add('typologieStructure'EntityType::class, [
  164.             'property_path' => 'contact.typologieStructure',
  165.             'class' => TypologieStructure::class,
  166.             'multiple' => false,
  167.             'expanded' => true,
  168.             'required' => false,
  169.             'placeholder' => 'Aucune',
  170.             'query_builder' => function (TypologieStructureRepository $sr) {
  171.                 return $sr->createQueryBuilder('sr')
  172.                     ->orderBy('sr.name''ASC');
  173.             },
  174.             'choice_label' => function ($structure) {
  175.                 return $structure->getName();
  176.             },
  177.             'label' => ' ',
  178.             'attr' => ['tabIndex' => 0]
  179.         ]);
  180.         $builder->add(
  181.             'thematiques',
  182.             EntityType::class,
  183.             [
  184.                 'property_path' => 'contact.categories',
  185.                 'class' => Category::class,
  186.                 'multiple' => true,
  187.                 'required' => true,
  188.                 'expanded' => true,
  189.                 'query_builder' => function (CategoryRepository $er) {
  190.                     return $er->createQueryBuilder('c')
  191.                         ->leftJoin('c.parent''p')
  192.                         ->where('p.key = :key')
  193.                         ->setParameter('key''thematiques')
  194.                         ->orderBy('c.key''ASC');
  195.                 },
  196.                 'choice_label' => function ($category) {
  197.                     return $category->findTranslationByLocale('fr')->getTranslation();
  198.                 },
  199.                 'label' => 'Thématiques d\'intervention et d\'intérêt*'
  200.             ]
  201.         );
  202.         $builder->add(
  203.             'optins',
  204.             EntityType::class,
  205.             [
  206.                 'property_path' => 'contact.optins',
  207.                 'class' => Category::class,
  208.                 'multiple' => true,
  209.                 'required' => true,
  210.                 'expanded' => true,
  211.                 'query_builder' => function (CategoryRepository $er) {
  212.                     return $er->createQueryBuilder('c')
  213.                         ->leftJoin('c.parent''p')
  214.                         ->where('p.key = :key')
  215.                         ->setParameter('key''optins')
  216.                         ->orderBy('c.key''ASC');
  217.                 },
  218.                 'choice_label' => function ($category) {
  219.                     return $category->findTranslationByLocale('fr')->getTranslation();
  220.                 },
  221.                 'label' => 'Abonnement aux lettres d\'informations'
  222.             ]
  223.         );
  224.         $builder->add('plainPassword'RepeatedType::class, [
  225.             'mapped' => false,
  226.             'type' => PasswordType::class,
  227.             'invalid_message' => 'Le mot de passe doit correspondre.',
  228.             'options' => ['attr' => ['class' => 'password-field']],
  229.             'required' => true,
  230.             'first_options' => [
  231.                 'label' => 'Choix du mot de passe*',
  232.                 'attr' => [
  233.                     'placeholder' => 'Mot de passe',
  234.                     'autocomplete' => 'new-password'
  235.                 ],
  236.                 'label_attr' => ['class' => self::LABEL_ATTR_CSS_CLASS],
  237.                 'constraints' => [
  238.                     new Assert\NotBlank(['message' => 'Le mot de passe est requis.']),
  239.                     new Assert\Length([
  240.                         'min' => 8,
  241.                         'minMessage' => 'Le mot de passe doit comporter au moins {{ limit }} caractères.',
  242.                     ]),
  243.                 ],
  244.             ],
  245.             'second_options' => [
  246.                 'label' => 'Confirmez le mot de passe*',
  247.                 'attr' => [
  248.                     'placeholder' => 'Confirmez le mot de passe',
  249.                     'autocomplete' => 'new-password'
  250.                 ],
  251.                 'label_attr' => ['class' => self::LABEL_ATTR_CSS_CLASS],
  252.             ],
  253.         ]);
  254.         $builder->add('visibleAnnuaire'ChoiceType::class, [
  255.             'property_path' => 'contact.visibleAnnuaire',
  256.             'expanded' => true,
  257.             'multiple' => false,
  258.             'choices' => [
  259.                 'Oui' => 1,
  260.                 'Non' => 0
  261.             ],
  262.             'data' => 0,
  263.             'required' => true,
  264.             'label' => 'Souhaitez-vous que votre profil soit visible sur l\'annuaire ?*',
  265.             'label_attr' => ['class' => 'mb-1em']
  266.         ]);
  267.         $builder->add(
  268.             'terms',
  269.             CheckboxType::class,
  270.             [
  271.                 'mapped' => false,
  272.                 'required' => true,
  273.                 'label' => 'J\'accepte que les données saisies soient utilisées par PQN-A',
  274.                 'label_attr' => ['class' => self::LABEL_ATTR_CSS_CLASS]
  275.             ]
  276.         );
  277.         $builder->add('typologieActeurValue'ChoiceType::class, [
  278.             'label' => 'Type d\'acteur *',
  279.             'label_attr' => ['class' => self::LABEL_ATTR_CSS_CLASS],
  280.             'choices' => [
  281.                 'Selectionner votre typologie d\'acteur *' => '',
  282.                 'Equipe technique des territoires et ingénierie associée' => 'Equipe technique des territoires et ingénierie associée',
  283.                 'Décideurs locaux' => 'Décideurs locaux',
  284.                 'Partenaires' => 'Partenaires',
  285.                 'Opérateurs' => 'Opérateurs',
  286.                 'Autres' => 'Autres',
  287.             ],
  288.             'choice_attr' => ['Selectionner votre typologie d\'acteur *' => ['disabled' => '']],
  289.             'required' => true,
  290.         ]);
  291.         $builder->add('autresTypologieActeur'TextType::class, [
  292.             'property_path' => 'contact.autresTypologieActeur',
  293.             'required' => true,
  294.             'label' => 'Précisez :',
  295.             'label_attr' => ['class' => self::LABEL_ATTR_CSS_CLASS'id' => 'autres-typologie']
  296.         ]);
  297.         $builder->add('departement'EntityType::class, [
  298.             'property_path' => 'contact.departement',
  299.             'class' => Category::class,
  300.             'multiple' => false,
  301.             'expanded' => false,
  302.             'query_builder' => function (CategoryRepository $cr) {
  303.                 return $cr->createQueryBuilder('c')
  304.                     ->leftJoin('c.parent''p')
  305.                     ->where('p.key = :key')
  306.                     ->setParameter('key''departements')
  307.                     ->orderBy('c.key''ASC');
  308.             },
  309.             'choice_label' => function ($category) {
  310.                 return $category->findTranslationByLocale('fr')->getTranslation();
  311.             },
  312.             'placeholder' => 'Sélectionnez votre département *',
  313.             'required' => true,
  314.             'empty_data' => '',
  315.             'label_attr' => ['class' => self::LABEL_ATTR_CSS_CLASS],
  316.             'label' => 'Département *'
  317.         ]);
  318.         $builder->add('territoireIntervention'EntityType::class, [
  319.             'property_path' => 'contact.territoireInterv',
  320.             'class' => Category::class,
  321.             'multiple' => false,
  322.             'expanded' => false,
  323.             'query_builder' => function (CategoryRepository $cr) {
  324.                 return $cr->createQueryBuilder('c')
  325.                     ->leftJoin('c.parent''p')
  326.                     ->orderBy('c.key''ASC');
  327.             },
  328.             'choice_label' => function ($category) {
  329.                 return $category->findTranslationByLocale('fr')->getTranslation();
  330.             },
  331.             'required' => false,
  332.             'label_attr' => ['class' => self::LABEL_ATTR_CSS_CLASS]
  333.         ]);
  334.         $builder->add('username'HiddenType::class);
  335.         $builder->add('email'HiddenType::class);
  336.         $builder->add('submit'SubmitType::class, [
  337.             'label' => 'Valider',
  338.             'attr' => ['class' => self::BUTTON_CSS_CLASS]
  339.         ]);
  340.         $builder->add('submit2'SubmitType::class, [
  341.             'label' => 'Valider',
  342.             'attr' => ['class' => self::BUTTON_CSS_CLASS]
  343.         ]);
  344.         $builder->add('recaptcha'EWZRecaptchaType::class, [
  345.             'attr' => [
  346.                 'options' => [
  347.                     'theme' => 'light',
  348.                     'type'  => 'image',
  349.                     'size' => 'normal',
  350.                 ],
  351.             ],
  352.             'mapped' => false,
  353.             'constraints' => [
  354.                 new RecaptchaTrue()
  355.             ],
  356.         ]);
  357.         $builder->add('submit3'SubmitType::class, [
  358.             'label' => 'S\'inscrire',
  359.             'attr' => ['class' => self::BUTTON_CSS_CLASS]
  360.         ]);
  361.         $builder->addEventListener(
  362.             FormEvents::PRE_SUBMIT,
  363.             function (FormEvent $event) {
  364.                 $form $event->getForm();
  365.                 $data $event->getData();
  366.                 $typologie $data['typologieActeurValue'] ?? null;
  367.                 if ($typologie === 'Autres') {
  368.                     $form->add('autresTypologieActeur'TextType::class, [
  369.                         'property_path' => 'contact.autresTypologieActeur',
  370.                         'required' => true,
  371.                         'label' => 'Précisez :',
  372.                         'label_attr' => ['class' => self::LABEL_ATTR_CSS_CLASS'id' => 'autres-typologie']
  373.                     ]);
  374.                 } else {
  375.                     // Define the choices for fonction based on the selected typologie
  376.                     $fonctionChoices = [];
  377.                     if ($typologie === 'Equipe technique des territoires et ingénierie associée') {
  378.                         $fonctionChoices = [
  379.                             'Directeur régional/DGA/DGS' => 'Directeur régional/DGA/DGS',
  380.                             'Chargé de mission' => 'Chargé de mission',
  381.                             'Chef de projet' => 'Chef de projet',
  382.                             'Coordinateur' => 'Coordinateur',
  383.                             'Animateur' => 'Animateur',
  384.                             'Assistant / Secrétaire' => 'Assistant / Secrétaire',
  385.                             'Délégué du préfet' => 'Délégué du préfet',
  386.                             'Directeur de services' => 'Directeur de services',
  387.                             'Responsable' => 'Responsable',
  388.                             'Conseiller' => 'Conseiller',
  389.                             'Administrateur' => 'Administrateur',
  390.                             'Médiateur' => 'Médiateur',
  391.                             'Journaliste' => 'Journaliste',
  392.                             'Chargé de communication' => 'Chargé de communication',
  393.                             'Habitants / membres des CC ou de CD / Collectifs citoyens' => 'Habitants / membres des CC ou de CD / Collectifs citoyens',
  394.                             'Opérateur' => 'Opérateur',
  395.                             'Partenaire' => 'Partenaire'
  396.                             // Add more fonction choices for this typologie
  397.                         ];
  398.                     } elseif ($typologie === 'Décideurs locaux') {
  399.                         $fonctionChoices = [
  400.                             'Maire' => 'Maire',
  401.                             'Maire-adjoint' => 'Maire-adjoint',
  402.                             'Président Intercommunalité' => 'Président Intercommunalité',
  403.                             'Vice-Président Intercommunalité' => 'Vice-Président Intercommunalité',
  404.                             'Conseiller régional' => 'Conseiller régional',
  405.                             'Conseiller départemental' => 'Conseiller départemental',
  406.                             'Conseiller communautaire' => 'Conseiller communautaire',
  407.                             'Conseiller municipal' => 'Conseiller municipal',
  408.                             'Préfet/sous-Préfet' => 'Préfet/sous-Préfet'
  409.                             // Add more fonction choices for this typologie
  410.                         ];
  411.                     }
  412.                     // Add more elseif blocks for other typologie options
  413.                     $form->add('fonction'ChoiceType::class, [
  414.                         'label' => 'Fonction / poste occupé *',
  415.                         'choices' => $fonctionChoices,
  416.                         'required' => true,
  417.                         'label_attr' => ['class' => self::LABEL_ATTR_CSS_CLASS]
  418.                     ]);
  419.                 }
  420.                 if (array_key_exists('mainEmail'$data)) {
  421.                     $data['username'] = $data['mainEmail'];
  422.                     $data['email'] = $data['mainEmail'];
  423.                 }
  424.                 $event->setData($data);
  425.             }
  426.         );
  427.         $builder->addEventListener(FormEvents::POST_SUBMIT, function (FormEvent $event) {
  428.             $form $event->getForm();
  429.             if (!isset($_POST['g-recaptcha-response'])) {
  430.                 $form->addError(new FormError('Le captcha n\'est pas valide.'));
  431.                 $event->stopPropagation();
  432.                 return;
  433.             }
  434.             if (isset($_POST['g-recaptcha-response'])) {
  435.                 $isCaptchValid $this->isCaptchaValid($_POST['g-recaptcha-response'], $_ENV['EWZ_RECAPTCHA_SECRET']);
  436.                 if (!$isCaptchValid) {
  437.                     $form->addError(new FormError('Le captcha n\'est pas valide.'));
  438.                     $event->stopPropagation();
  439.                 }
  440.             }
  441.             if (!$form->isValid()) {
  442.                 $this->addValidationErrorsToFlashBag($form$this->flashbag);
  443.             }
  444.             if ($form->isValid()) {
  445.                 $datasArray = [
  446.                     'nom' => $form->get('lastName')->getData(),
  447.                     'prnom' => $form->get('firstName')->getData(),
  448.                     'e_mail' => $form->get('mainEmail')->getData(),
  449.                     'tl__fixedirectportable_' => $this->ifValueReturnValueOrNothing($form'number'),
  450.                     'adresse' => $this->ifValueReturnValueOrNothing($form'street'),
  451.                     'ville' => $this->ifValueReturnValueOrNothing($form'city'),
  452.                     'cp' => $this->ifValueReturnValueOrNothing($form'zip'),
  453.                     'dpartement' => $this->getDepartmentValueOrNothing($form),
  454.                     'fonction_dtaille__texte_libre_' => $this->ifValueReturnValueOrNothing($form'note'),
  455.                     'fonction_type_dacteurs' => $this->ifValueReturnValueOrNothing($form'typologieActeurValue'),
  456.                     'fonction__poste_occup' => $this->ifValueReturnValueOrNothing($form'fonction'),
  457.                     'structure' => $this->ifValueReturnValueOrNothing($form'structure'),
  458.                     'typologie_de_structure' => $this->ifValueReturnValueOrNothing($form'structureText')
  459.                 ];
  460.                 foreach ($form->get('thematiques')->getData() as $data) {
  461.                     if ($data->getKey() === "europe" || $data->getKey() === "developpement-territorial" || $data->getKey() === "participation-citoyenne") continue;
  462.                     $datasArray[$data->getKey()] = '1';
  463.                 }
  464.                 foreach ($form->get('optins')->getData() as $data) {
  465.                     $datasArray[$data->getKey()] = '1';
  466.                 }
  467.                 $this->SynchroHubService->createHubUser($datasArray''$_SERVER['SYNCHRO_HUB_DATABASE_ID']);
  468.             }
  469.         });
  470.     }
  471.     /**
  472.      * {@inheritdoc}
  473.      */
  474.     public function configureOptions(OptionsResolver $resolver)
  475.     {
  476.         $constraints = [
  477.             'recaptcha' => new RecaptchaTrue()
  478.         ];
  479.         $resolver->setDefaults(
  480.             [
  481.                 'constraints' => $constraints,
  482.                 'data_class' => User::class,
  483.                 'validation_groups' => ['registration'],
  484.                 'attr' => ['id' => 'submit-form''class' => 'recaptcha-form'],
  485.                 'empty_data' => function (FormInterface $form) {
  486.                     $user = new User();
  487.                     $contact = new Contact();
  488.                     $address = new Address();
  489.                     $address->setCity($form->get('city')->getData());
  490.                     $address->setZip($form->get('zip')->getData());
  491.                     $address->setStreet($form->get('street')->getData());
  492.                     $addressType $this->emi->getReference(AddressType::class, 1);
  493.                     $address->setAddressType($addressType);
  494.                     $mainAddress = new ContactAddress();
  495.                     $mainAddress->setMain(true);
  496.                     $mainAddress->setAddress($address);
  497.                     $mainAddress->setContact($contact);
  498.                     $contact->addContactAddress($mainAddress);
  499.                     $user->setContact($contact);
  500.                     /**
  501.                      * peut servir pour ajouter plusieurs roles
  502.                      */
  503.                     /* $roleQuery = $this->emi->createQueryBuilder()
  504.                         ->select('r')
  505.                         ->from(Role::class, 'r')
  506.                         ->where("r.name = 'PqnaGtEdit'");
  507.                     $roleQueryResult = $roleQuery->getQuery()->execute();
  508.                     if (sizeof($roleQueryResult) > 0) {
  509.                         $editRole = new UserRole();
  510.                         $editRole->setRole($roleQueryResult[0]);
  511.                         $editRole->setLocale('["fr"]');
  512.                         $editRole->setUser($user);
  513.                         $this->emi->persist($editRole);
  514.                         $user->addUserRole($editRole);
  515.                     } */
  516.                     $this->emi->persist($contact);
  517.                     $this->emi->persist($user);
  518.                     return $user;
  519.                 },
  520.                 'error_mapping' => [
  521.                     'data.email' => 'form.email',
  522.                     'data.mainEmail' => 'form.mainEmail'
  523.                 ],
  524.                 'error_bubbling' => true
  525.             ]
  526.         );
  527.     }
  528.     private function isCaptchaValid($response$secret): ?bool
  529.     {
  530.         try {
  531.             $url 'https://www.google.com/recaptcha/api/siteverify';
  532.             $data = [
  533.                 'secret'   => $secret,
  534.                 'response' => $response,
  535.                 'remoteip' => $_SERVER['REMOTE_ADDR']
  536.             ];
  537.             $options = [
  538.                 'http' => [
  539.                     'header'  => "Content-type: application/x-www-form-urlencoded\r\n",
  540.                     'method'  => 'POST',
  541.                     'content' => http_build_query($data)
  542.                 ]
  543.             ];
  544.             $context  stream_context_create($options);
  545.             $result file_get_contents($urlfalse$context);
  546.             return json_decode($result)->success;
  547.         } catch (\Exception $e) {
  548.             return null;
  549.         }
  550.     }
  551.     private function addValidationErrorsToFlashBag(FormInterface $formFlashBagInterface $flashBag)
  552.     {
  553.         foreach ($form->getErrors(truefalse) as $error) {
  554.             $flashBag->add('error'$error->getMessage());
  555.         }
  556.     }
  557.     private function ifValueReturnValueOrNothing(FormInterface $formstring $value)
  558.     {
  559.         if ($form->has($value) && method_exists($form->get($value), 'getData'))
  560.             return !empty($form->get($value)->getData()) ? $form->get($value)->getData() : '';
  561.         return '';
  562.     }
  563.     private function getDepartmentValueOrNothing(FormInterface $form)
  564.     {
  565.         if ($form->get('departement') && method_exists($form->get('departement'), 'getData'))
  566.             return !empty($form->get('departement')->getData()) ? explode('_'$form->get('departement')->getData()->getKey())[0] : '';
  567.         return '';
  568.     }
  569. }