src/Controller/MontheatreInscriptionController.php line 391

Open in your IDE?
  1. <?php
  2. namespace App\Controller;
  3. use App\ClassTheatre\asides;
  4. use App\ClassTheatre\TheatreController;
  5. use App\Service\Functions;
  6. use App\Service\TheatreMail\SendmailTheatre;
  7. use App\Service\TheatreMail\TheatreMail;
  8. use App\Validator\Extranetuser\CheckEmail;
  9. use App\Validator\Extranetuser\CheckNoEmail;
  10. use App\Validator\Extranetuser\CheckNoLogin;
  11. use App\Validator\Recaptcha;
  12. use Doctrine\ORM\EntityManagerInterface;
  13. use Proxies\__CG__\TheatreCore\Entity\Modules;
  14. use Psr\Log\LoggerInterface;
  15. use Symfony\Component\Form\Extension\Core\Type\CheckboxType;
  16. use Symfony\Component\Form\Extension\Core\Type\ChoiceType;
  17. use Symfony\Component\Form\Extension\Core\Type\FormType;
  18. use Symfony\Component\Form\Extension\Core\Type\HiddenType;
  19. use Symfony\Component\Form\Extension\Core\Type\PasswordType;
  20. use Symfony\Component\Form\Extension\Core\Type\RepeatedType;
  21. use Symfony\Component\Form\Extension\Core\Type\SubmitType;
  22. use Symfony\Component\Form\Extension\Core\Type\TextType;
  23. use Symfony\Component\HttpFoundation\Request;
  24. use Symfony\Component\Routing\Annotation\Route;
  25. use Symfony\Component\Security\Core\Authentication\Token\Storage\TokenStorageInterface;
  26. use Symfony\Component\Security\Http\Authentication\AuthenticationUtils;
  27. use Symfony\Contracts\Translation\TranslatorInterface;
  28. use Symfony\Component\Validator\Constraints\Email;
  29. use Symfony\Component\Validator\Constraints\Length;
  30. use Symfony\Component\Validator\Constraints\NotBlank;
  31. use Symfony\Component\Validator\Constraints\Type;
  32. use TheatreCore\Entity\Extranetusers;
  33. use TheatreCore\Entity\Regions;
  34. use TheatreCore\Entity\Subscribers;
  35. use TheatreCore\Form\Type\RecaptchaType;
  36. class MontheatreInscriptionController extends TheatreController
  37. {
  38.     // page d'inscription
  39.     public $page_inscription '/montheatre/inscription';
  40.     // page de validation
  41.     public $page_validation '/montheatre/';
  42.     // page contacts
  43.     public $page_contacts '/site/contacts';
  44.     // page support
  45.     public $page_support '/site/assistance';
  46.     // page changerment mot de passe
  47.     public $page_changer_pass '/montheatre/recuppass/email/';
  48.     // page changerment mot de passe
  49.     public $page_valide_inscription '/montheatre/validation/retry/';
  50.     // titres
  51.     public $titre_confirmation 'Confirmer votre inscription <span class="montheatre_lg"><em>mon théâtre</em></span>';
  52.     public $titre_inscription 'Créer votre compte <span class="montheatre_lg"><em>mon théâtre</em></span>';
  53.     // sujet
  54.     public $subject 'Votre compte sur theatre-contemporain.net';
  55.     // objet user
  56.     public $user null;
  57.     // objet sendmail
  58.     public $sendmail null;
  59.     // provenance
  60.     public $urifrom null;
  61.     public $from_module null;
  62.     protected $type_inscription null;
  63.     // messages email (langterms)
  64.     public $langterm_message_inscription 'message_inscription_montheatre';
  65.     public $langterm_message_inscription_html 'message_inscription_montheatre_html';
  66.     // tableau optionnel à ajouter à params_tr
  67.     public $extra_params_tr null;
  68.     // mode modification
  69.     public $change_mode false;
  70.     // infos sur l'utilisateur
  71.     protected $user_infos = array();
  72.     // parmètres
  73.     public $params = array();
  74.     // les valeurs a enregistrer
  75.     protected $values = array();
  76.     private $logger;
  77.     /** constructeur hérité
  78.      *
  79.      */
  80.     public function __construct(
  81.         EntityManagerInterface $em,
  82.         TranslatorInterface $translator,
  83.         TokenStorageInterface $tokenStorage,
  84.         Functions $functions,
  85.         TheatreMail $TheatreMail,
  86.         LoggerInterface $logger
  87.     )
  88.     {
  89.         parent::__construct($translator$tokenStorage);
  90.         $this->context['controller'] = $this->view->controller 'montheatre';
  91.         $this->em $em;
  92.         $this->func $functions;
  93.         $this->asides = new asides();
  94.         $this->TheatreMail $TheatreMail;
  95.         $this->logger $logger;
  96.     }
  97.     public function InitController($params = [])
  98.     {
  99.         $this->params $params;
  100.         // est-ce qu'on a les infos de l'utilisateur ? (mode modification)
  101.         if(!empty($params['user_infos'])) {
  102.             $this->user_infos $params['user_infos'];
  103.             // supprimer le mot de passe
  104.             unset($this->user_infos['password']);
  105.             // mode modification
  106.             $this->change_mode true;
  107.             $this->context['view']->change_mode $this->change_mode;
  108.         }
  109.         // classe utilisateurs
  110.         $this->user $this->em->getRepository(Extranetusers::class);
  111.         // mettre les constantes
  112.         $this->page_changer_pass getenv('URL_THNET').$this->page_changer_pass;
  113.         $this->page_contacts getenv('URL_THNET').$this->page_contacts;
  114.         $this->page_support getenv('URL_THNET').$this->page_support;
  115.         $this->page_valide_inscription getenv('URL_THNET').$this->page_valide_inscription;
  116.         // voir si on vient d'une partie du site ou d'un autre module
  117.         foreach(array('urifrom','from_module') as $v) {
  118.             if(!empty($_REQUEST[$v])) {
  119.                 $this->$v $_REQUEST[$v];
  120.                 $this->context['view']->$v $this->$v;
  121.                 $this->context['view']->$v $this->$v;
  122.             } else {
  123.                 $this->$v '';
  124.             }
  125.         }
  126.         if(!empty($this->from_module)) {
  127.             $this->context['view']->{$this->from_module} = true;
  128.         }
  129.     }
  130.     // }}}
  131.     // {{{ validation()
  132.     /** Validation
  133.      *
  134.      * @Route("/montheatre/validation/", name="app_validation")
  135.      * @Route("/montheatre/validation/activekey/{p_activekey}", name="app_validation_activekey")
  136.      * @Route("/montheatre/validation/retry/{p_retry}", name="app_validation_retry")
  137.      *
  138.      * @access public
  139.      * @return void
  140.      */
  141.     public function action_validation($p_activekey null$p_retry nullAuthenticationUtils $authenticationUtilsRequest $requestSendmailTheatre $sendmailTheatre)
  142.     {
  143.         $params['activekey'] = $this->context['params']['activekey'] = $p_activekey;
  144.         $params['retry'] = $this->context['params']['retry'] = $p_retry;
  145.         // table login
  146.         $extranetusers $this->em->getRepository(Extranetusers::class);
  147.         // activekey
  148.         $activekey array_key_exists('activekey'$params) ? $params['activekey'] : null;
  149.         $this->view->activekey $activekey;
  150.         // retry
  151.         $retry array_key_exists('retry'$params) ? $params['retry'] : null;
  152.         // si activekey, on essaye d'activer
  153.         if (!empty($activekey)) {
  154.             // verifier si le compte est deja actif
  155.             $act $extranetusers->queryRow('SELECT idextranetuser,verified,active,email,email_validation,enseignant_fonction,enseignant_active
  156.                                          FROM '.$extranetusers->__table.'
  157.                                          WHERE activekey=\''.$extranetusers->escape($activekey).'\'');
  158.             if (empty($act)) {
  159.                 $error['nokey'] = '<strong>Impossible</strong> de trouver l\'utilisateur correspondant à ce code d\'activation. Etes-vous sur du code ou du lien que vous avez suivi ?';
  160.                 $activekey null;
  161.             } else {
  162.                 // verifier si le user est deja actif sauf si email_eduction est présent
  163.                 if (($act['verified']==&& $act['active'] == 0) || !empty($act['email_validation'])) {
  164.                     // maj de extranetusers
  165.                     $fieldstoupdate = array(
  166.                         'active'=> 1,
  167.                         'verified'=> 1
  168.                     );
  169.                     // update uniquement si le code est ok et qu'il n'est pas vérifié
  170.                     $where ' activekey=\''.$extranetusers->escape($activekey).'\' ';
  171.                     $r $extranetusers->autoExecute($extranetusers->__table$fieldstoupdateAUTOQUERY_UPDATE$where);
  172.                     if ($r == "0") {
  173.                         $this->view->active_ok true;
  174.                     } else {
  175.                         //$error['sobj'] = $s_obj->getMessage().' - '.$s_obj->getUserInfo();
  176.                         //throw new TheatreException($r->getDebugInfo());
  177.                         $activekey null;
  178.                         $this->view->error_active true;
  179.                     }
  180.                 } else {
  181.                     $this->view->deja_actif true;
  182.                 }
  183.             }
  184.         }
  185.         // si pas d'activkey, on propose de saisir le code
  186.         // ou de le recevoir par mail
  187.         if (empty($activekey)) {
  188.             // email
  189.             $this->context['form'] = $this->get('form.factory')->createNamedBuilder(''FormType::class, null, [
  190.                 'attr' => [
  191.                     'id' => 'masterform'
  192.                 ]
  193.             ]);
  194.             $this->context['form']->add('email'TextType::class, [
  195.                 'label' => 'Votre adresse de courriel',
  196.                 'constraints' => [
  197.                     new NotBlank([
  198.                         'message' => 'Votre adresse de courriel : veuillez préciser votre adresse de courriel'
  199.                     ]),
  200.                     new Email([
  201.                         'message' => 'Votre adresse de courriel : veuillez verifier votre adresse de courriel'
  202.                     ]),
  203.                     new CheckEmail([
  204.                         'message' => 'Cette adresse email n\'est pas enregistrée sur notre site. Veuillez <a href="'.$this->page_inscription.'">réessayer votre inscription</a> ou <a href="'.$this->page_contacts.'">nous contacter</a>',
  205.                         'extranetuser' => $extranetusers
  206.                     ])
  207.                 ],
  208.                 'attr' => [
  209.                     'size'=>'40'
  210.                 ]
  211.             ]);
  212.             if (!empty($retry)) {
  213.                 $this->context['form']->setData(array('email'=>$retry));
  214.             }
  215. //            $this->context['form']->add('recaptcha', RecaptchaType::class, [
  216. //                'mapped' => false,
  217. //                'empty_data' => '1',
  218. //                'constraints' => [
  219. //                    new Recaptcha([
  220. //                        'request' => $request
  221. //                    ])
  222. //                ]
  223. //            ]);
  224.             // validation
  225.             $this->context['form']->add'validation'SubmitType::class, [
  226.                 'label' => 'Renvoyer le code d\'activation',
  227.                 'attr' => [
  228.                     'class' => 'boutform'
  229.                 ]
  230.             ]);
  231.             $this->context['form'] = $this->context['form']->getForm();
  232.             $this->context['form']->handleRequest($request);
  233.             $this->context['view']->form $this->context['form']->createView();
  234.             if ($this->context['form']->isSubmitted() && $this->context['form']->isValid()) {
  235.                 // on retrouve le user
  236.                 $act $extranetusers->queryRow('SELECT activekey,email,idextranetuser,verified,active 
  237.                                                  FROM '.$extranetusers->__table.
  238.                                                  WHERE email=\''.$extranetusers->escape($this->context['form']->get('email')->getData()).'\'');
  239.                 if(empty($act)) {
  240.                     $error['nokey'] = 'Impossible de trouver l\'utilisateur correspondant';
  241.                 } else {
  242.                     // destinataire
  243.                     $sendmailTheatre->setDestinataire($act['email']);
  244.                     // expediteur et return-path
  245.                     $sendmailTheatre->setExpediteur($_ENV['CONTACT_MAIL']);
  246.                     // sujet
  247.                     $subject 'Votre compte sur theatre-contemporain.net';
  248.                     // paramètres optionnels pour le lien de validation
  249.                     $query_opts = array();
  250.                     foreach(array('urifrom','from_module','type_inscription') as $v) {
  251.                         if (!empty($_REQUEST[$v])) {
  252.                             $query_opts[$v] = $v.'='.$_REQUEST[$v];
  253.                         }
  254.                     }
  255.                     if(!empty($query_opts)) {
  256.                         $query_opts_string '?';
  257.                         $query_opts_string .= join('&',$query_opts);
  258.                     } else {
  259.                         $query_opts_string '';
  260.                     }
  261.                     // corps du mail
  262.                     $params_tr = array(
  263.                         'lien_validation' => $_ENV['URL_THNET'].'/montheatre/validation/activekey/'.$act['activekey'].'/'.$query_opts_string,
  264.                         'code'  => $act['activekey'],
  265.                         'contact_mail'  => $_ENV['CONTACT_MAIL'],
  266.                     );
  267.                     $sendmailTheatre->setSubject(utf8_decode($subject)); // sujet
  268.                     // génération
  269.                     $sendmailTheatre->prepare(
  270.                         'emails/message_recupkey_montheatre.html.twig',
  271.                         $params_tr,
  272.                         'emails/message_recupkey_montheatre.txt.twig'
  273.                     );
  274.                     try {
  275.                         $sendmailTheatre->send();
  276.                         $this->view->reponse['ok'] = 'Le lien d\'activation vient de vous être envoyé';
  277.                         $this->view->mail_envoye true;
  278.                     } catch (\Exception $e) {
  279.                         $this->logger->error($e->getMessage());
  280.                         $this->logger->debug($e->getTraceAsString());
  281.                         $error['no'] = 'Un probl&eacute;me est survenu  pendant l\'envoi du lien et du code d\'activation ! 
  282.                                     Merci de r&eacute;essayer l\'inscription ulti&egrave;rieurement ou de contacter le support technique.';
  283.                     }
  284.                 }
  285.             }
  286.         }
  287.         $this->view->error = (!empty($error)) ? $error : [];
  288.         // titre de la page
  289.         $this->view->title_page 'Création de mon compte sur mon théâtre - Validation de l\'adresse de courriel';
  290.         // fil d'arianne
  291.         $this->view->locate $this->getLocate();
  292.         // rubrique menu et css
  293.         $this->rub_courante 'montheatre';
  294.         $this->view->style_more = array('montheatre');
  295.         return $this->view('montheatre/validation/validation.html.twig');
  296.     }
  297.     // {{{
  298.     /**
  299.      * @Route("/montheatre/inscription", name="montheatre_inscription")
  300.      */
  301.     public function action_inscription(Request $request)
  302.     {
  303.         // page sans menu et sans pide de page
  304.         $this->view->page_simple true;
  305.         // si authentifie, on redirige sur la page du profil
  306.         if($this->getUser() instanceof Extranetusers){
  307.             return $this->redirect('/montheatre/');
  308.         }
  309.         // classe d'inscription
  310.         $this->InitController();
  311.         $this->form([], $request);
  312.         $this->context['form'] = $this->context['form']->getForm();
  313.         $this->context['form']->handleRequest($request);
  314.         $this->validate();
  315.         // titre de la page
  316.         $this->title_page 'Création de mon profil sur mon théâtre';
  317.         $this->view->no_montheatre true;
  318.         // fil d'arianne
  319.         $this->view->locate $this->getLocate();
  320.         // rubrique dans le menu
  321.         $this->rub_courante 'montheatre';
  322.         // js en plus
  323.         $this->view->js_more = array('jquery-validate/jquery.validate.js');
  324.         return $this->view('montheatre/inscription.html.twig', [
  325.             'form' => $this->context['form']->createView()
  326.         ]);
  327.     }
  328.     // }}}
  329.     // {{{ view()
  330.     /** affichage du formulaire
  331.      *
  332.      */
  333.     public function form($params = array(), $request null)
  334.     {
  335.         $this->context['view']->titre_inscription $this->titre_inscription;
  336.         $this->context['view']->titre_confirmation $this->titre_confirmation;
  337.         // si authentifie, on redirige sur la page du profil
  338.         if($this->getUser() instanceof Extranetusers && !$this->change_mode && empty($params['no_redirect'])) {
  339.             return $this->redirect('/montheatre/');
  340.         }
  341.         $this->context['form'] = $this->get('form.factory')->createNamedBuilder(''FormType::class, null, [
  342.             'allow_extra_fields' => true,
  343.             'attr' => [
  344.                 'id' => 'masterform'
  345.             ]
  346.         ]);
  347.         // csrf
  348. //        $this->context['form']->setSecure(true);
  349.         // remplir les champs en modification
  350.         if($this->change_mode) {
  351.             $this->context['form']->setData($this->user_infos);
  352.         }
  353.         // voir si on vient d'une partie du site ou d'un autre module
  354.         foreach(array('urifrom','from_module') as $v) {
  355.             $this->context['form']->add($vHiddenType::class, [
  356.                 'label' => $this->$v
  357.             ]);
  358.         }
  359.         $params_email = array('size'=>'40','id'=>'email','class'=>'required email','remote' =>'/montheatre/checkdata');
  360.         // recaptcha
  361. //        $this->context['form']->add('recaptcha', RecaptchaType::class, [
  362. //            'mapped' => false,
  363. //            'empty_data' => '1',
  364. //            'constraints' => [
  365. //                new Recaptcha([
  366. //                    'request' => $request
  367. //                ])
  368. //            ]
  369. //        ]);
  370.         $email_required false;
  371.         if($this->type_inscription != 'enseignant') {
  372.             $email_required true;
  373.             $constraints_email[] = new NotBlank([
  374.                 'message' => 'Votre adresse de courriel : veuillez préciser votre adresse de courriel'
  375.             ]);
  376.         }
  377.         $constraints_email[] = new Email([
  378.             'message' => 'Votre adresse de courriel : veuillez vérifier votre adresse de courriel'
  379.         ]);
  380.         // email déja pris ?
  381.         if($this->change_mode) {
  382.             if(!empty($_POST['email']) && $_POST['email']!=$this->user_infos['email']) {
  383.                 $email_exist 'Cette adresse de courriel est déjà associée à un compte <em>mon théâtre</em>.';
  384.                 $constraints_email[] = new CheckNoEmail([
  385.                     'message' => $email_exist,
  386.                     'extranetuser' => $this->em->getRepository(Extranetusers::class)
  387.                 ]);
  388.             }
  389.         } else {
  390.             if(!empty($_POST['email'])) {
  391.                 $changer_pass $this->page_changer_pass $_POST['email'];
  392.                 $valide_inscription $this->page_valide_inscription $_POST['email'];
  393.                 $email_exist 'Vous ne pouvez pas créer deux comptes avec la même adresse de courriel.<br />- Si vous avez perdu votre mot de passe, vous pouvez <a href="' $changer_pass '">le modifier</a>.<br />- Vous pouvez également <a href="' $valide_inscription '">valider votre inscription</a> si vous ne l\'avez pas encore fait.';
  394.                 $constraints_email[] = new CheckNoEmail([
  395.                     'message' => $email_exist,
  396.                     'extranetuser' => $this->em->getRepository(Extranetusers::class)
  397.                 ]);
  398.             }
  399.         }
  400.         $this->context['form']->add('email'TextType::class, [
  401.             'label' => 'Votre adresse de courriel',
  402.             'required' => $email_required,
  403.             'constraints' => $constraints_email,
  404.             'attr' => $params_email
  405.         ]); // email
  406.         $this->context['form']->add('login'TextType::class, [
  407.             'label' => ($this->change_mode) ? 'Votre pseudonyme' 'Choisissez un pseudonyme',
  408.             'constraints' => [
  409.                 new NotBlank([
  410.                     'message' => 'Choisissez un pseudonyme : veuillez choisir un pseudonyme'
  411.                 ]),
  412.                 new Length([
  413.                     'min' => 5,
  414.                     'minMessage' => 'Choisissez un pseudonyme : la taille du pseudonyme doit être comprise entre 5 et 30 caractères',
  415.                     'max' => 30,
  416.                     'maxMessage' => 'Choisissez un pseudonyme : la taille du pseudonyme doit être comprise entre 5 et 30 caractères',
  417.                 ]),
  418.                 new Type([
  419.                     'type' => 'alnum',
  420.                     'message' => 'Votre pseudonyme : vous devez choisir un pseudonyme qui contient uniquement des lettres et/ou des chiffres (pas d\'accent, pas d\'espace)'
  421.                 ]),
  422.                 new CheckNoLogin([
  423.                     'extranetuser' => $this->em->getRepository(Extranetusers::class),
  424.                     'ignoreLogin' => $this->change_mode,
  425.                     'login' => ($this->change_mode) ? $this->user_infos['login']: null,
  426.                     'idextranetuser' => ($this->change_mode) ? $this->user_infos['idextranetuser'] : null
  427.                 ])
  428.             ],
  429.             'attr' => [
  430.                 'size'=>'35',
  431.                 'id'=>'login',
  432.                 'class'=>'required',
  433.                 'rangelength'=>'[5,30]',
  434.                 'remote' =>'/montheatre/checkdata'
  435.             ]
  436.         ]); // login
  437.         $disabled_password false;
  438.         if(!$this->change_mode) {
  439.             $disabled_password true;
  440.             $constraints_password[] = new NotBlank([
  441.                 'message' => 'Votre mot de passe : veuillez préciser votre mot de passe'
  442.             ]);
  443.         }
  444.         // taille du mot de passe
  445.         $constraints_password[] = new Length([
  446.             'min' => 8,
  447.             'minMessage' => 'Le mot de passe doit avoir entre 8 et 30 caractères',
  448.             'max' => 30,
  449.             'maxMessage' => 'Le mot de passe doit avoir entre 8 et 30 caractères',
  450.         ]);
  451.         $label_password = ($this->change_mode) ? 'Nouveau mot de passe' 'Choisissez un mot de passe';
  452.         $this->context['form']->add('password'RepeatedType::class, [
  453.             'type' => PasswordType::class,
  454.             'first_options'  => array('label' => $label_password),
  455.             'second_options' => array('label' => 'Confirmez le mot de passe'),
  456.             'invalid_message' => 'Confirmation du mot de passe : veuillez confirmer votre mot de passe',
  457.             'required' => $disabled_password,
  458.             'constraints' => $constraints_password,
  459.             'attr' => [
  460.                 'class' => 'password_field',
  461.                 'id' => 'password'
  462.             ]
  463.         ]); // password
  464.         if(empty($_POST['password'])) {
  465.             $this->context['view']->clear_password true;
  466.         }
  467.         $this->context['form']->add('lastname'TextType::class, [
  468.             'label' => 'Votre nom',
  469.             'constraints' => [
  470.                 new NotBlank([
  471.                     'message' => 'Votre nom : veuillez préciser votre nom'
  472.                 ])
  473.             ],
  474.             'attr' => [
  475.                 'size'=>'40',
  476.                 'id'=>'lastname',
  477.                 'class'=>'required'
  478.             ]
  479.         ]); // nom
  480.         $this->context['form']->add('firstname'TextType::class, [
  481.             'label' => 'Votre prénom',
  482.             'constraints' => [
  483.                 new NotBlank([
  484.                     'message' => 'Votre prénom : veuillez préciser votre prénom'
  485.                 ])
  486.             ],
  487.             'attr' => [
  488.                 'size' => '40',
  489.                 'id' => 'firstname',
  490.                 'class' => 'required'
  491.             ]
  492.         ]); // prenom
  493.         // inscription education (supprimé lors du passage de symfony 4.4 (mai 2020) (retrouvable dans le repository theatre/cris de github)
  494.         $allCountries array_combine(array_flip($this->user->getCountryList()), array_flip($this->user->getCountryList()));
  495.         $this->context['form']->add('country'ChoiceType::class, [
  496.             'label' => 'Votre pays',
  497.             'constraints' => [
  498.                 new NotBlank([
  499.                     'message' => 'Votre pays : veuillez préciser votre pays'
  500.                 ]),
  501.                 new Type([
  502.                     'type' => 'string',
  503.                     'message' => 'Votre pays : veuillez préciser votre pays'
  504.                 ])
  505.             ],
  506.             'choices' => $allCountries,
  507.         ]); // pays
  508.         if(!isset($_POST['country'])) {
  509.             $this->context['form']->get('country')->setData('FR');
  510.         }
  511.         ////// infos facultative
  512.         // secteur d'activite
  513.         $secteur_list = array('1' => 'M&eacute;dias',
  514.             '2' => 'Structures th&eacute;&acirc;trales',
  515.             '3' => 'Universitaires | Scolaires',
  516.             '4' => 'Institutionnels',
  517.             '5' => 'Autre');
  518.         @ksort($secteur_list);
  519.         $this->context['form']->add('secteur'ChoiceType::class, [
  520.             'label' => 'Secteur d\'activit&eacute;',
  521.             'placeholder' => 'Choisissez dans la liste',
  522.             'required' => false,
  523.             'choices' => array_flip($secteur_list)
  524.         ]);
  525.         // phone
  526.         $this->context['form']->add'phone'TextType::class, [
  527.             'label' => 'Téléphone',
  528.             'required' => false,
  529.             'attr' => [
  530.                 'size' => 35,
  531.                 'id' => 'phone'
  532.             ]
  533.         ]);
  534.         $this->context['form']->add('structure'TextType::class, [
  535.             'label' => 'Structure',
  536.             'required' => false,
  537.             'attr' => [
  538.                 'size'=>'40'
  539.             ]
  540.         ]); // structure
  541.         $this->context['form']->add('fonction'TextType::class, [
  542.             'label' => 'Fonction',
  543.             'required' => false,
  544.             'attr' => [
  545.                 'size'=>'40'
  546.             ]
  547.         ]); // fonction
  548.         $this->context['form']->add('address'TextType::class, [
  549.             'label' => 'Adresse',
  550.             'required' => false,
  551.             'attr' => [
  552.                 'size'=>'45'
  553.             ]
  554.         ]); // adresse
  555.         // region
  556.         if($this->change_mode) {
  557.             $regions $this->em->getRepository(Regions::class);
  558.             $this->context['form']->add('idregion'ChoiceType::class, [
  559.                 'label' => 'Région',
  560.                 'placeholder' => false,
  561.                 'choices' => array_flip($regions->getArea()),
  562.                 'required' => false,
  563.                 'attr' => [
  564.                     'id'=>'idregion'
  565.                 ]
  566.             ]); // region
  567.         }
  568.         // si theduc = zip obligatoire
  569.         $constraintsConditions = [];
  570.         if($this->from_module=='theduc' && $this->type_inscription=='enseignant') {
  571.             $params_zip['class'] = 'required';
  572.             $constraintsConditions = [
  573.                 new NotBlank([
  574.                     'message' => '<span class="require_field">Code postal</span> : veuillez préciser ce champ'
  575.                 ])
  576.             ];
  577.         }
  578.         $this->context['form']->add('zip'TextType::class, [
  579.             'label' => 'Code postal',
  580.             'required' => false,
  581.             'constraints' => $constraintsConditions,
  582.             'attr' => [
  583.                 'id' => 'zip',
  584.                 'size'=>'20'
  585.             ]
  586.         ]); // cp
  587.         $this->context['form']->add('city'TextType::class, [
  588.             'label' =>'Ville',
  589.             'required' => false,
  590.             'attr' => [
  591.                 'size'=>'40'
  592.             ]
  593.         ]); // ville
  594.         if (!$this->change_mode) {
  595.             // inscription newsletter
  596.             $this->context['form']->add('thnet'CheckboxType::class, [
  597.                 'label' => 'theatre-contemporain.net',
  598.                 'required' => false,
  599.                 'attr' => [
  600.                     'class'=>'checkbox'
  601.                 ]
  602.             ]);
  603.         }
  604.         // si educ, inscription theduc
  605.         if($this->from_module=='theduc') {
  606.             $checked = & $this->context['form']->addElement('checkbox','theduc','educ.theatre-contemporain.net',null,array('class'=>'checkbox'));
  607.             $checked->setChecked(true);
  608.         }
  609.         if($this->change_mode) {
  610.             $label_validation 'Enregistrer les modifications';
  611.         } else {
  612.             $label_validation 'Continuer l\'inscription >';
  613.         }
  614.         $this->context['form']->add('validation'SubmitType::class, [
  615.             'label' => $label_validation,
  616.             'attr' => [
  617.                 'class'=>'boutform'
  618.             ]
  619.         ]); // validation
  620.         // captcha
  621.         if(!$this->change_mode) {
  622. //            $this->context['form']->add('recaptcha', RecaptchaType::class, [
  623. //                'mapped' => false,
  624. //                'empty_data' => '1',
  625. //                'constraints' => [
  626. //                    new Recaptcha([
  627. //                        'request' => $request
  628. //                    ])
  629. //                ]
  630. //            ]);
  631.         }
  632.     }
  633.     // }}}
  634.     // {{{ validate()
  635.     /** validation du formulaire
  636.      *
  637.      */
  638.     public function validate($supp_values=null)
  639.     {
  640.         // si le formulaire est bien rempli
  641.         if ($this->context['form']->isSubmitted() && $this->context['form']->isValid()) {
  642. //            $this->context['form']->applyFilter('__ALL__', 'strip_and_trim');
  643.             // adresse de courriel, login, mot de passe
  644.             foreach(array('email','login','password','zip','country') as $v) {
  645.                 if($this->context['form']->has($v)) {
  646.                     $$v $this->context['form']->get($v)->getData();
  647.                 } else {
  648.                     $$v null;
  649.                 }
  650.             }
  651.             $idregion 0;
  652.             if($this->context['form']->has('idregion')){
  653.                 $idregion $this->context['form']->get('idregion')->getViewData();
  654.             }
  655.             // tableau pour insertion/modification dans la table extranetusers
  656.             $this->values = array(
  657.                 'lastname' => $this->context['form']->get('lastname')->getData(),
  658.                 'firstname' => $this->context['form']->get('firstname')->getData(),
  659.                 'address' => $this->context['form']->get('address')->getData(),
  660.                 'zip' => $zip,
  661.                 'city' => $this->context['form']->get('city')->getData(),
  662.                 'country' => $this->user->getCountryList()[$country],
  663.                 'secteur' => $this->context['form']->get('secteur')->getData(),
  664.                 'structure' => $this->context['form']->get('structure')->getData(),
  665.                 'fonction' => $this->context['form']->get('fonction')->getData(),
  666.                 'phone' => $this->context['form']->get('phone')->getData(),
  667.             );
  668.             // essayer de trouver la région
  669.             if(empty($idregion) && ($this->func->my_is_int($zip) && $country=='FR')) {
  670. //                $regions = $this->em->getRepository(Regions::class);
  671. //                $idregion = $regions->getIdregionByZip($zip);
  672.                 if(!empty($idregion)) {
  673.                     $this->values['idregion'] = $idregion;
  674.                 }
  675.                 // chercher aussi dans les départements
  676.                 //$this->view->idregion = $regions->getIdDepartementByZip($zip);
  677.             } else {
  678.                 if($idregion==0) {
  679.                     $this->values['idregion'] = NULL;
  680.                 } else {
  681. //                    $regions = $this->em->getRepository(Regions::class);
  682.                     $this->values['idregion'] = $idregion;
  683.                 }
  684.             }
  685.             // insertion
  686.             if(!$this->change_mode) {
  687.                 // si on s'inscrit depuis un autre module
  688.                 if(!empty($this->from_module)) {
  689.                     $this->values['inscription_from'] = $this->from_module;
  690.                 }
  691.                 // generer la cle de controle de l'inscription
  692.                 $code $this->func->codeAlea(30);
  693.                 $this->values += array(
  694.                     'email' => $email,
  695.                     'login' => $login,
  696.                     'token' => $this->func->codeAlea(32,true),
  697.                     'thnetuser' => 1,
  698.                     'address_ip' => $_SERVER['REMOTE_ADDR'],
  699.                     'verified' => 0,
  700.                     'activekey' => $code,
  701.                     'userrights' => 0,
  702.                     'dateinsert' => $this->func->now(),
  703.                     'active' => 0,
  704.                     'stats_acces' => 0
  705.                 );
  706.                 // modification
  707.             } else {
  708.                 // nouveau login et ancien dans old_login
  709.                 if(!empty($login) && $login!=$this->user_infos['login']) {
  710.                     $this->values['login'] = $login;
  711.                     $this->values['old_login'] = $this->user_infos['login'];
  712.                     $change_login true;
  713.                 }
  714.                 // si nouvel email, on enregistre dans other_email
  715.                 if(!empty($email) && $email!=$this->user_infos['email']) {
  716.                     $this->values['other_email'] = $email;
  717.                     $confirm_email true;
  718.                     // generer la cle de controle de l'inscription
  719.                     $code $this->func->codeAlea(30);
  720.                     $this->values['code_chge_email'] = $code;
  721.                 }
  722.             }
  723.             // mot de passe
  724.             if(!empty($password)) {
  725.                 $this->values['password'] = $this->user->getCryptPass($password);
  726.             }
  727.             // enregistrer des champs en plus
  728.             if(!empty($supp_values)) {
  729.                 foreach($supp_values as $k=>$v) {
  730.                     if(!empty($v['qf'])) {
  731.                         $this->values[$k] = $this->context['form']->get($k)->getData();
  732.                     } else {
  733.                         $this->values[$k] = $this->func->strip_and_trim($_POST[$k]);
  734.                     }
  735.                 }
  736.             }
  737.             // ajout de valeur en plus via params
  738.             if(!empty($this->params['values'])) {
  739.                 $this->values += $this->params['values'];
  740.             }
  741.             // champ de la table extranetusers
  742.             $this->user->setUpdateFields($this->values);
  743.             // commencer la transaction
  744. //            if ($this->user->supports('transactions')) {
  745. //                $this->user->beginTransaction();
  746. //            }
  747.             // id de l'extranetuser
  748.             if($this->change_mode) {
  749.                 $idextranetuser $this->user_infos['idextranetuser'];
  750.             } else {
  751.                 $idextranetuser null;
  752.             }
  753.             // insertion dans la table extranetuser et recup de l'idextranetuser'
  754.             try {
  755.                 $r $this->user->setData($idextranetuser,true);
  756.             } catch (\Exception $e) {
  757.                 $this->context['error'] = 'Une erreur est survenue. Merci de réessayer plus tard et de contacter le support technique si le problème persiste.';
  758.                 $this->logger->error($e->getMessage());
  759.                 $this->logger->debug($e->getTraceAsString());
  760.                 // if($this->user->in_transaction) {  // annuler la transaction
  761.                 //     $this->user->rollback();
  762.                 // }
  763.             }
  764.             // nouvel utilisateur => lastInsertID
  765.             if(!$this->change_mode) {
  766.                 $idextranetuser $r;
  767.             }
  768.             // si pas de pb, on insere dans la table newsletters
  769.             if(empty($this->context['error']) && !$this->change_mode) {
  770.                 $newsletters = array();
  771.                 // case a cocher
  772.                 foreach(array('thnet','theduc','lagarce') as $n) {
  773.                     if(!empty($_POST[$n])) {
  774.                         $newsletters[] = $n;
  775.                     }
  776.                 }
  777.                 $country $this->context['form']->get('country')->getViewData();
  778.                 if(empty($country)) {
  779.                     $country 'FR';
  780.                 }
  781.                 // abonnement
  782.                 if(!empty($newsletters)) {
  783.                     // inscription depuis ?
  784.                     if(!empty($this->from_module)) {
  785.                         $orig $this->from_module;
  786.                     } else {
  787.                         $orig 'thnet';
  788.                     }
  789.                     $subscribers $this->em->getRepository(Subscribers::class);
  790.                     $subscribers->setSubscribe($this->values['email'], $newsletters$country$orig);
  791.                 }
  792.             }
  793.             // si pas de pb d'enregistrement, on envoi le message
  794.             if(empty($this->context['error']) && !$this->change_mode) {
  795.                 // si il y a un mail de validation
  796.                 if(!empty($this->values['email_validation'])) {
  797.                     $this->TheatreMail->setDestinataire($this->values['email_validation']);
  798.                 } else {
  799.                     $this->TheatreMail->setDestinataire($this->values['email']); // destinataire
  800.                 }
  801.                 // a afficher
  802.                 $this->context['view']->email_validation $this->TheatreMail->getDestinataire(); //$this->TheatreMail->getDestinataire(); pour les tests : 'boussad.sadadou@gmail.com'
  803.                 $this->TheatreMail->setExpediteur($_ENV['CONTACT_MAIL']); // expediteur et return-path
  804.                 $this->TheatreMail->setSubject(utf8_decode($this->subject)); // sujet
  805.                 // paramètres optionnels pour le lien de validation
  806.                 $query_opts = array();
  807.                 foreach(array('urifrom','from_module','type_inscription') as $v) {
  808.                     if (!empty($this->$v)) {
  809.                         $query_opts[$v] = $v.'='.$this->$v;
  810.                     }
  811.                 }
  812.                 // on vient d'un module => retour sur le module
  813.                 if(!empty($this->from_module)) {
  814.                     if(!empty($this->values['email_pro'])) {
  815.                         $auto_validation true;
  816.                     } else {
  817.                         $auto_validation false;
  818.                     }
  819.                     $this->setInfosModules($auto_validation);
  820.                 }
  821.                 if(!empty($query_opts)) {
  822.                     $query_opts_string '?';
  823.                     $query_opts_string .= join('&',$query_opts);
  824.                 } else {
  825.                     $query_opts_string '';
  826.                 }
  827.                 // corps du mail
  828.                 $params_tr = array(
  829.                     'lien_activation' => $_ENV['URL_THNET'].'/montheatre/validation/activekey/'.$code.'/'.$query_opts_string,
  830.                     'code'  => $code,
  831.                     'login'  => $login,
  832.                     'contact_mail'  => $_ENV['CONTACT_MAIL'],
  833.                 );
  834.                 // params_tr additionnel et optionnel
  835.                 if (!empty($this->extra_params_tr) && is_array($this->extra_params_tr)) {
  836.                     $params_tr += $this->extra_params_tr;
  837.                 }
  838.                 $this->TheatreMail->prepare('emails/message_inscription.html.twig'$params_tr'emails/message_inscription.txt.twig');
  839.                 try {
  840.                     $this->TheatreMail->send();
  841.                     $reponse['ok'] = 'Votre message a bien &eacute;t&eacute; envoy&eacute;.';
  842.                 } catch (\Exception $e) {
  843.                     $this->logger->error($e->getMessage());
  844.                     $this->logger->debug($e->getTraceAsString());
  845.                     $this->context['error']['no'] = 'Un probl&eacute;me est survenu  pendant l\'envoi du message de validation !
  846.                                                         Merci de r&eacute;essayer l\'inscription ulti&egrave;rieurement ou
  847.                                                         de <a href="'.$this->page_support.'">contacter le support technique.</a>';
  848.                 }
  849.             }
  850.             // en modification, on envoi le message si le mail est modifié
  851.             if(empty($this->context['error']) && !empty($confirm_email)) {
  852.                 $this->sendVerificationNewEmail($this->values['other_email'],$this->values['code_chge_email'],$login);
  853.             }
  854.             // si tout OK, on valide la transaction (COMMIT)
  855.             if(empty($this->context['error'])) {
  856. //                if ($this->user->in_transaction) {
  857. //                    $this->user->commit();
  858. //                }
  859.                 if($this->change_mode) {
  860.                     $reponse['trans'] = 'Votre compte <em>mon théâtre</em> a bien été modifié !';
  861.                 } else {
  862.                     $reponse['trans'] = 'Votre compte <em>mon théâtre</em> a bien été créé !';
  863.                 }
  864.                 $this->context['view']->inscription_ok true;
  865.                 if(isset($this->sendmail->destinataire)) {
  866.                     $this->context['view']->email_validation $this->sendmail->destinataire;
  867.                 }
  868.             }
  869.         }
  870.     }
  871.     // {{{ sendVerificationNewEmail()
  872.     /** envoyer le mail de viérification en cas de changement d'email
  873.      *
  874.      * @param string $email nouvel email
  875.      * @param string $code code de vérification
  876.      */
  877.     protected function sendVerificationNewEmail($email,$code,$login)
  878.     {
  879.         // destinataire
  880.         $this->TheatreMail->setDestinataire($email); // sujet
  881.         // expediteur et return-path
  882.         $this->TheatreMail->setExpediteur($_ENV['CONTACT_MAIL']); // sujet
  883.         // sujet
  884.         $this->TheatreMail->setSubject('Vérification de votre adresse'); // sujet
  885.         // corps du mail
  886.         $params_tr = array(
  887.             'lien_activation' => $_ENV['URL_THNET'].'/montheatre/modifieremail/c/'.$code,
  888.             'code'  => $code,
  889.             'login'  => $login,
  890.             'contact_mail'  => $_ENV['CONTACT_MAIL'],
  891.         );
  892.         $this->TheatreMail->prepare('emails/message_modifier_montheatre.html.twig'$params_tr);
  893.         try {
  894.             $this->TheatreMail->send();
  895.             //$reponse['ok'] = 'Votre message a bien &eacute;t&eacute; envoy&eacute;.';
  896.             $this->context['view']->modif_email true;
  897.         } catch (\Exception $e) {
  898.             $this->logger->error($e->getMessage());
  899.             $this->logger->debug($e->getTraceAsString());
  900.             $this->context['error']['no'] = '
  901.                 Un problème est survenu  pendant l\'envoi du message de confirmation de votre nouvelle adresse !
  902.                 Merci de réessayer ultièrieurement ou de contacter le support technique.';
  903.         }
  904.     }
  905.     // }}}
  906.     // {{{ setInfosModules()
  907.     /** déclaration des infos sur le module si autre que thnet
  908.      *
  909.      * @param bool $auto_validation email_pro ou pas ?
  910.      */
  911.     public function setInfosModules($auto_validation=null)
  912.     {
  913.         $infos_modules = array(
  914.             'theduc' => array(
  915.                 'langterm_message_inscription' => 'message_inscription_montheatre_theduc',
  916.                 'langterm_message_inscription_html' => 'message_inscription_montheatre_html_theduc',
  917.             ),
  918.         );
  919.         // spécificité enseignant
  920.         if($this->type_inscription=='enseignant') {
  921.             if($auto_validation) {
  922.                 $infos_modules = array(
  923.                     'theduc' => array(
  924.                         'langterm_message_inscription' => 'message_inscription_enseignant_auto',
  925.                         'langterm_message_inscription_html' => 'message_inscription_enseignant_auto_html',
  926.                     ),
  927.                 );
  928.             } else {
  929.                 $infos_modules = array(
  930.                     'theduc' => array(
  931.                         'langterm_message_inscription' => 'message_inscription_enseignant',
  932.                         'langterm_message_inscription_html' => 'message_inscription_enseignant_html',
  933.                     ),
  934.                 );
  935.             }
  936.         }
  937.         // préciser
  938.         if(!empty($infos_modules[$this->from_module])) {
  939.             foreach($infos_modules[$this->from_module] as $k=>$v) {
  940.                 $this->$k $v;
  941.             }
  942.         }
  943.     }
  944.     // }}}
  945.     // {{{ getLocate()
  946.     /** récupération du fil d'arianne
  947.      *
  948.      */
  949.     public function getLocate() {
  950.         return array(
  951.             '/montheatre/' => '<span class="montheatre_pt"><i>mon th&eacute;&acirc;tre</i></span>',
  952.             '' => 'Inscription'
  953.         );
  954.     }
  955.     // }}}
  956. }