<?php
namespace App\Controller;
use App\ClassTheatre\asides;
use App\ClassTheatre\TheatreController;
use App\Service\Functions;
use App\Service\TheatreMail\SendmailTheatre;
use App\Service\TheatreMail\TheatreMail;
use App\Validator\Extranetuser\CheckEmail;
use App\Validator\Extranetuser\CheckNoEmail;
use App\Validator\Extranetuser\CheckNoLogin;
use App\Validator\Recaptcha;
use Doctrine\ORM\EntityManagerInterface;
use Proxies\__CG__\TheatreCore\Entity\Modules;
use Psr\Log\LoggerInterface;
use Symfony\Component\Form\Extension\Core\Type\CheckboxType;
use Symfony\Component\Form\Extension\Core\Type\ChoiceType;
use Symfony\Component\Form\Extension\Core\Type\FormType;
use Symfony\Component\Form\Extension\Core\Type\HiddenType;
use Symfony\Component\Form\Extension\Core\Type\PasswordType;
use Symfony\Component\Form\Extension\Core\Type\RepeatedType;
use Symfony\Component\Form\Extension\Core\Type\SubmitType;
use Symfony\Component\Form\Extension\Core\Type\TextType;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\Routing\Annotation\Route;
use Symfony\Component\Security\Core\Authentication\Token\Storage\TokenStorageInterface;
use Symfony\Component\Security\Http\Authentication\AuthenticationUtils;
use Symfony\Contracts\Translation\TranslatorInterface;
use Symfony\Component\Validator\Constraints\Email;
use Symfony\Component\Validator\Constraints\Length;
use Symfony\Component\Validator\Constraints\NotBlank;
use Symfony\Component\Validator\Constraints\Type;
use TheatreCore\Entity\Extranetusers;
use TheatreCore\Entity\Regions;
use TheatreCore\Entity\Subscribers;
use TheatreCore\Form\Type\RecaptchaType;
class MontheatreInscriptionController extends TheatreController
{
// page d'inscription
public $page_inscription = '/montheatre/inscription';
// page de validation
public $page_validation = '/montheatre/';
// page contacts
public $page_contacts = '/site/contacts';
// page support
public $page_support = '/site/assistance';
// page changerment mot de passe
public $page_changer_pass = '/montheatre/recuppass/email/';
// page changerment mot de passe
public $page_valide_inscription = '/montheatre/validation/retry/';
// titres
public $titre_confirmation = 'Confirmer votre inscription <span class="montheatre_lg"><em>mon théâtre</em></span>';
public $titre_inscription = 'Créer votre compte <span class="montheatre_lg"><em>mon théâtre</em></span>';
// sujet
public $subject = 'Votre compte sur theatre-contemporain.net';
// objet user
public $user = null;
// objet sendmail
public $sendmail = null;
// provenance
public $urifrom = null;
public $from_module = null;
protected $type_inscription = null;
// messages email (langterms)
public $langterm_message_inscription = 'message_inscription_montheatre';
public $langterm_message_inscription_html = 'message_inscription_montheatre_html';
// tableau optionnel à ajouter à params_tr
public $extra_params_tr = null;
// mode modification
public $change_mode = false;
// infos sur l'utilisateur
protected $user_infos = array();
// parmètres
public $params = array();
// les valeurs a enregistrer
protected $values = array();
private $logger;
/** constructeur hérité
*
*/
public function __construct(
EntityManagerInterface $em,
TranslatorInterface $translator,
TokenStorageInterface $tokenStorage,
Functions $functions,
TheatreMail $TheatreMail,
LoggerInterface $logger
)
{
parent::__construct($translator, $tokenStorage);
$this->context['controller'] = $this->view->controller = 'montheatre';
$this->em = $em;
$this->func = $functions;
$this->asides = new asides();
$this->TheatreMail = $TheatreMail;
$this->logger = $logger;
}
public function InitController($params = [])
{
$this->params = $params;
// est-ce qu'on a les infos de l'utilisateur ? (mode modification)
if(!empty($params['user_infos'])) {
$this->user_infos = $params['user_infos'];
// supprimer le mot de passe
unset($this->user_infos['password']);
// mode modification
$this->change_mode = true;
$this->context['view']->change_mode = $this->change_mode;
}
// classe utilisateurs
$this->user = $this->em->getRepository(Extranetusers::class);
// mettre les constantes
$this->page_changer_pass = getenv('URL_THNET').$this->page_changer_pass;
$this->page_contacts = getenv('URL_THNET').$this->page_contacts;
$this->page_support = getenv('URL_THNET').$this->page_support;
$this->page_valide_inscription = getenv('URL_THNET').$this->page_valide_inscription;
// voir si on vient d'une partie du site ou d'un autre module
foreach(array('urifrom','from_module') as $v) {
if(!empty($_REQUEST[$v])) {
$this->$v = $_REQUEST[$v];
$this->context['view']->$v = $this->$v;
$this->context['view']->$v = $this->$v;
} else {
$this->$v = '';
}
}
if(!empty($this->from_module)) {
$this->context['view']->{$this->from_module} = true;
}
}
// }}}
// {{{ validation()
/** Validation
*
* @Route("/montheatre/validation/", name="app_validation")
* @Route("/montheatre/validation/activekey/{p_activekey}", name="app_validation_activekey")
* @Route("/montheatre/validation/retry/{p_retry}", name="app_validation_retry")
*
* @access public
* @return void
*/
public function action_validation($p_activekey = null, $p_retry = null, AuthenticationUtils $authenticationUtils, Request $request, SendmailTheatre $sendmailTheatre)
{
$params['activekey'] = $this->context['params']['activekey'] = $p_activekey;
$params['retry'] = $this->context['params']['retry'] = $p_retry;
// table login
$extranetusers = $this->em->getRepository(Extranetusers::class);
// activekey
$activekey = array_key_exists('activekey', $params) ? $params['activekey'] : null;
$this->view->activekey = $activekey;
// retry
$retry = array_key_exists('retry', $params) ? $params['retry'] : null;
// si activekey, on essaye d'activer
if (!empty($activekey)) {
// verifier si le compte est deja actif
$act = $extranetusers->queryRow('SELECT idextranetuser,verified,active,email,email_validation,enseignant_fonction,enseignant_active
FROM '.$extranetusers->__table.'
WHERE activekey=\''.$extranetusers->escape($activekey).'\'');
if (empty($act)) {
$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 ?';
$activekey = null;
} else {
// verifier si le user est deja actif sauf si email_eduction est présent
if (($act['verified']==0 && $act['active'] == 0) || !empty($act['email_validation'])) {
// maj de extranetusers
$fieldstoupdate = array(
'active'=> 1,
'verified'=> 1
);
// update uniquement si le code est ok et qu'il n'est pas vérifié
$where = ' activekey=\''.$extranetusers->escape($activekey).'\' ';
$r = $extranetusers->autoExecute($extranetusers->__table, $fieldstoupdate, AUTOQUERY_UPDATE, $where);
if ($r == "0") {
$this->view->active_ok = true;
} else {
//$error['sobj'] = $s_obj->getMessage().' - '.$s_obj->getUserInfo();
//throw new TheatreException($r->getDebugInfo());
$activekey = null;
$this->view->error_active = true;
}
} else {
$this->view->deja_actif = true;
}
}
}
// si pas d'activkey, on propose de saisir le code
// ou de le recevoir par mail
if (empty($activekey)) {
// email
$this->context['form'] = $this->get('form.factory')->createNamedBuilder('', FormType::class, null, [
'attr' => [
'id' => 'masterform'
]
]);
$this->context['form']->add('email', TextType::class, [
'label' => 'Votre adresse de courriel',
'constraints' => [
new NotBlank([
'message' => 'Votre adresse de courriel : veuillez préciser votre adresse de courriel'
]),
new Email([
'message' => 'Votre adresse de courriel : veuillez verifier votre adresse de courriel'
]),
new CheckEmail([
'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>',
'extranetuser' => $extranetusers
])
],
'attr' => [
'size'=>'40'
]
]);
if (!empty($retry)) {
$this->context['form']->setData(array('email'=>$retry));
}
// $this->context['form']->add('recaptcha', RecaptchaType::class, [
// 'mapped' => false,
// 'empty_data' => '1',
// 'constraints' => [
// new Recaptcha([
// 'request' => $request
// ])
// ]
// ]);
// validation
$this->context['form']->add( 'validation', SubmitType::class, [
'label' => 'Renvoyer le code d\'activation',
'attr' => [
'class' => 'boutform'
]
]);
$this->context['form'] = $this->context['form']->getForm();
$this->context['form']->handleRequest($request);
$this->context['view']->form = $this->context['form']->createView();
if ($this->context['form']->isSubmitted() && $this->context['form']->isValid()) {
// on retrouve le user
$act = $extranetusers->queryRow('SELECT activekey,email,idextranetuser,verified,active
FROM '.$extranetusers->__table.'
WHERE email=\''.$extranetusers->escape($this->context['form']->get('email')->getData()).'\'');
if(empty($act)) {
$error['nokey'] = 'Impossible de trouver l\'utilisateur correspondant';
} else {
// destinataire
$sendmailTheatre->setDestinataire($act['email']);
// expediteur et return-path
$sendmailTheatre->setExpediteur($_ENV['CONTACT_MAIL']);
// sujet
$subject = 'Votre compte sur theatre-contemporain.net';
// paramètres optionnels pour le lien de validation
$query_opts = array();
foreach(array('urifrom','from_module','type_inscription') as $v) {
if (!empty($_REQUEST[$v])) {
$query_opts[$v] = $v.'='.$_REQUEST[$v];
}
}
if(!empty($query_opts)) {
$query_opts_string = '?';
$query_opts_string .= join('&',$query_opts);
} else {
$query_opts_string = '';
}
// corps du mail
$params_tr = array(
'lien_validation' => $_ENV['URL_THNET'].'/montheatre/validation/activekey/'.$act['activekey'].'/'.$query_opts_string,
'code' => $act['activekey'],
'contact_mail' => $_ENV['CONTACT_MAIL'],
);
$sendmailTheatre->setSubject(utf8_decode($subject)); // sujet
// génération
$sendmailTheatre->prepare(
'emails/message_recupkey_montheatre.html.twig',
$params_tr,
'emails/message_recupkey_montheatre.txt.twig'
);
try {
$sendmailTheatre->send();
$this->view->reponse['ok'] = 'Le lien d\'activation vient de vous être envoyé';
$this->view->mail_envoye = true;
} catch (\Exception $e) {
$this->logger->error($e->getMessage());
$this->logger->debug($e->getTraceAsString());
$error['no'] = 'Un probléme est survenu pendant l\'envoi du lien et du code d\'activation !
Merci de réessayer l\'inscription ultièrieurement ou de contacter le support technique.';
}
}
}
}
$this->view->error = (!empty($error)) ? $error : [];
// titre de la page
$this->view->title_page = 'Création de mon compte sur mon théâtre - Validation de l\'adresse de courriel';
// fil d'arianne
$this->view->locate = $this->getLocate();
// rubrique menu et css
$this->rub_courante = 'montheatre';
$this->view->style_more = array('montheatre');
return $this->view('montheatre/validation/validation.html.twig');
}
// {{{
/**
* @Route("/montheatre/inscription", name="montheatre_inscription")
*/
public function action_inscription(Request $request)
{
// page sans menu et sans pide de page
$this->view->page_simple = true;
// si authentifie, on redirige sur la page du profil
if($this->getUser() instanceof Extranetusers){
return $this->redirect('/montheatre/');
}
// classe d'inscription
$this->InitController();
$this->form([], $request);
$this->context['form'] = $this->context['form']->getForm();
$this->context['form']->handleRequest($request);
$this->validate();
// titre de la page
$this->title_page = 'Création de mon profil sur mon théâtre';
$this->view->no_montheatre = true;
// fil d'arianne
$this->view->locate = $this->getLocate();
// rubrique dans le menu
$this->rub_courante = 'montheatre';
// js en plus
$this->view->js_more = array('jquery-validate/jquery.validate.js');
return $this->view('montheatre/inscription.html.twig', [
'form' => $this->context['form']->createView()
]);
}
// }}}
// {{{ view()
/** affichage du formulaire
*
*/
public function form($params = array(), $request = null)
{
$this->context['view']->titre_inscription = $this->titre_inscription;
$this->context['view']->titre_confirmation = $this->titre_confirmation;
// si authentifie, on redirige sur la page du profil
if($this->getUser() instanceof Extranetusers && !$this->change_mode && empty($params['no_redirect'])) {
return $this->redirect('/montheatre/');
}
$this->context['form'] = $this->get('form.factory')->createNamedBuilder('', FormType::class, null, [
'allow_extra_fields' => true,
'attr' => [
'id' => 'masterform'
]
]);
// csrf
// $this->context['form']->setSecure(true);
// remplir les champs en modification
if($this->change_mode) {
$this->context['form']->setData($this->user_infos);
}
// voir si on vient d'une partie du site ou d'un autre module
foreach(array('urifrom','from_module') as $v) {
$this->context['form']->add($v, HiddenType::class, [
'label' => $this->$v
]);
}
$params_email = array('size'=>'40','id'=>'email','class'=>'required email','remote' =>'/montheatre/checkdata');
// recaptcha
// $this->context['form']->add('recaptcha', RecaptchaType::class, [
// 'mapped' => false,
// 'empty_data' => '1',
// 'constraints' => [
// new Recaptcha([
// 'request' => $request
// ])
// ]
// ]);
$email_required = false;
if($this->type_inscription != 'enseignant') {
$email_required = true;
$constraints_email[] = new NotBlank([
'message' => 'Votre adresse de courriel : veuillez préciser votre adresse de courriel'
]);
}
$constraints_email[] = new Email([
'message' => 'Votre adresse de courriel : veuillez vérifier votre adresse de courriel'
]);
// email déja pris ?
if($this->change_mode) {
if(!empty($_POST['email']) && $_POST['email']!=$this->user_infos['email']) {
$email_exist = 'Cette adresse de courriel est déjà associée à un compte <em>mon théâtre</em>.';
$constraints_email[] = new CheckNoEmail([
'message' => $email_exist,
'extranetuser' => $this->em->getRepository(Extranetusers::class)
]);
}
} else {
if(!empty($_POST['email'])) {
$changer_pass = $this->page_changer_pass . $_POST['email'];
$valide_inscription = $this->page_valide_inscription . $_POST['email'];
$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.';
$constraints_email[] = new CheckNoEmail([
'message' => $email_exist,
'extranetuser' => $this->em->getRepository(Extranetusers::class)
]);
}
}
$this->context['form']->add('email', TextType::class, [
'label' => 'Votre adresse de courriel',
'required' => $email_required,
'constraints' => $constraints_email,
'attr' => $params_email
]); // email
$this->context['form']->add('login', TextType::class, [
'label' => ($this->change_mode) ? 'Votre pseudonyme' : 'Choisissez un pseudonyme',
'constraints' => [
new NotBlank([
'message' => 'Choisissez un pseudonyme : veuillez choisir un pseudonyme'
]),
new Length([
'min' => 5,
'minMessage' => 'Choisissez un pseudonyme : la taille du pseudonyme doit être comprise entre 5 et 30 caractères',
'max' => 30,
'maxMessage' => 'Choisissez un pseudonyme : la taille du pseudonyme doit être comprise entre 5 et 30 caractères',
]),
new Type([
'type' => 'alnum',
'message' => 'Votre pseudonyme : vous devez choisir un pseudonyme qui contient uniquement des lettres et/ou des chiffres (pas d\'accent, pas d\'espace)'
]),
new CheckNoLogin([
'extranetuser' => $this->em->getRepository(Extranetusers::class),
'ignoreLogin' => $this->change_mode,
'login' => ($this->change_mode) ? $this->user_infos['login']: null,
'idextranetuser' => ($this->change_mode) ? $this->user_infos['idextranetuser'] : null
])
],
'attr' => [
'size'=>'35',
'id'=>'login',
'class'=>'required',
'rangelength'=>'[5,30]',
'remote' =>'/montheatre/checkdata'
]
]); // login
$disabled_password = false;
if(!$this->change_mode) {
$disabled_password = true;
$constraints_password[] = new NotBlank([
'message' => 'Votre mot de passe : veuillez préciser votre mot de passe'
]);
}
// taille du mot de passe
$constraints_password[] = new Length([
'min' => 8,
'minMessage' => 'Le mot de passe doit avoir entre 8 et 30 caractères',
'max' => 30,
'maxMessage' => 'Le mot de passe doit avoir entre 8 et 30 caractères',
]);
$label_password = ($this->change_mode) ? 'Nouveau mot de passe' : 'Choisissez un mot de passe';
$this->context['form']->add('password', RepeatedType::class, [
'type' => PasswordType::class,
'first_options' => array('label' => $label_password),
'second_options' => array('label' => 'Confirmez le mot de passe'),
'invalid_message' => 'Confirmation du mot de passe : veuillez confirmer votre mot de passe',
'required' => $disabled_password,
'constraints' => $constraints_password,
'attr' => [
'class' => 'password_field',
'id' => 'password'
]
]); // password
if(empty($_POST['password'])) {
$this->context['view']->clear_password = true;
}
$this->context['form']->add('lastname', TextType::class, [
'label' => 'Votre nom',
'constraints' => [
new NotBlank([
'message' => 'Votre nom : veuillez préciser votre nom'
])
],
'attr' => [
'size'=>'40',
'id'=>'lastname',
'class'=>'required'
]
]); // nom
$this->context['form']->add('firstname', TextType::class, [
'label' => 'Votre prénom',
'constraints' => [
new NotBlank([
'message' => 'Votre prénom : veuillez préciser votre prénom'
])
],
'attr' => [
'size' => '40',
'id' => 'firstname',
'class' => 'required'
]
]); // prenom
// inscription education (supprimé lors du passage de symfony 4.4 (mai 2020) (retrouvable dans le repository theatre/cris de github)
$allCountries = array_combine(array_flip($this->user->getCountryList()), array_flip($this->user->getCountryList()));
$this->context['form']->add('country', ChoiceType::class, [
'label' => 'Votre pays',
'constraints' => [
new NotBlank([
'message' => 'Votre pays : veuillez préciser votre pays'
]),
new Type([
'type' => 'string',
'message' => 'Votre pays : veuillez préciser votre pays'
])
],
'choices' => $allCountries,
]); // pays
if(!isset($_POST['country'])) {
$this->context['form']->get('country')->setData('FR');
}
////// infos facultative
// secteur d'activite
$secteur_list = array('1' => 'Médias',
'2' => 'Structures théâtrales',
'3' => 'Universitaires | Scolaires',
'4' => 'Institutionnels',
'5' => 'Autre');
@ksort($secteur_list);
$this->context['form']->add('secteur', ChoiceType::class, [
'label' => 'Secteur d\'activité',
'placeholder' => 'Choisissez dans la liste',
'required' => false,
'choices' => array_flip($secteur_list)
]);
// phone
$this->context['form']->add( 'phone', TextType::class, [
'label' => 'Téléphone',
'required' => false,
'attr' => [
'size' => 35,
'id' => 'phone'
]
]);
$this->context['form']->add('structure', TextType::class, [
'label' => 'Structure',
'required' => false,
'attr' => [
'size'=>'40'
]
]); // structure
$this->context['form']->add('fonction', TextType::class, [
'label' => 'Fonction',
'required' => false,
'attr' => [
'size'=>'40'
]
]); // fonction
$this->context['form']->add('address', TextType::class, [
'label' => 'Adresse',
'required' => false,
'attr' => [
'size'=>'45'
]
]); // adresse
// region
if($this->change_mode) {
$regions = $this->em->getRepository(Regions::class);
$this->context['form']->add('idregion', ChoiceType::class, [
'label' => 'Région',
'placeholder' => false,
'choices' => array_flip($regions->getArea()),
'required' => false,
'attr' => [
'id'=>'idregion'
]
]); // region
}
// si theduc = zip obligatoire
$constraintsConditions = [];
if($this->from_module=='theduc' && $this->type_inscription=='enseignant') {
$params_zip['class'] = 'required';
$constraintsConditions = [
new NotBlank([
'message' => '<span class="require_field">Code postal</span> : veuillez préciser ce champ'
])
];
}
$this->context['form']->add('zip', TextType::class, [
'label' => 'Code postal',
'required' => false,
'constraints' => $constraintsConditions,
'attr' => [
'id' => 'zip',
'size'=>'20'
]
]); // cp
$this->context['form']->add('city', TextType::class, [
'label' =>'Ville',
'required' => false,
'attr' => [
'size'=>'40'
]
]); // ville
if (!$this->change_mode) {
// inscription newsletter
$this->context['form']->add('thnet', CheckboxType::class, [
'label' => 'theatre-contemporain.net',
'required' => false,
'attr' => [
'class'=>'checkbox'
]
]);
}
// si educ, inscription theduc
if($this->from_module=='theduc') {
$checked = & $this->context['form']->addElement('checkbox','theduc','educ.theatre-contemporain.net',null,array('class'=>'checkbox'));
$checked->setChecked(true);
}
if($this->change_mode) {
$label_validation = 'Enregistrer les modifications';
} else {
$label_validation = 'Continuer l\'inscription >';
}
$this->context['form']->add('validation', SubmitType::class, [
'label' => $label_validation,
'attr' => [
'class'=>'boutform'
]
]); // validation
// captcha
if(!$this->change_mode) {
// $this->context['form']->add('recaptcha', RecaptchaType::class, [
// 'mapped' => false,
// 'empty_data' => '1',
// 'constraints' => [
// new Recaptcha([
// 'request' => $request
// ])
// ]
// ]);
}
}
// }}}
// {{{ validate()
/** validation du formulaire
*
*/
public function validate($supp_values=null)
{
// si le formulaire est bien rempli
if ($this->context['form']->isSubmitted() && $this->context['form']->isValid()) {
// $this->context['form']->applyFilter('__ALL__', 'strip_and_trim');
// adresse de courriel, login, mot de passe
foreach(array('email','login','password','zip','country') as $v) {
if($this->context['form']->has($v)) {
$$v = $this->context['form']->get($v)->getData();
} else {
$$v = null;
}
}
$idregion = 0;
if($this->context['form']->has('idregion')){
$idregion = $this->context['form']->get('idregion')->getViewData();
}
// tableau pour insertion/modification dans la table extranetusers
$this->values = array(
'lastname' => $this->context['form']->get('lastname')->getData(),
'firstname' => $this->context['form']->get('firstname')->getData(),
'address' => $this->context['form']->get('address')->getData(),
'zip' => $zip,
'city' => $this->context['form']->get('city')->getData(),
'country' => $this->user->getCountryList()[$country],
'secteur' => $this->context['form']->get('secteur')->getData(),
'structure' => $this->context['form']->get('structure')->getData(),
'fonction' => $this->context['form']->get('fonction')->getData(),
'phone' => $this->context['form']->get('phone')->getData(),
);
// essayer de trouver la région
if(empty($idregion) && ($this->func->my_is_int($zip) && $country=='FR')) {
// $regions = $this->em->getRepository(Regions::class);
// $idregion = $regions->getIdregionByZip($zip);
if(!empty($idregion)) {
$this->values['idregion'] = $idregion;
}
// chercher aussi dans les départements
//$this->view->idregion = $regions->getIdDepartementByZip($zip);
} else {
if($idregion==0) {
$this->values['idregion'] = NULL;
} else {
// $regions = $this->em->getRepository(Regions::class);
$this->values['idregion'] = $idregion;
}
}
// insertion
if(!$this->change_mode) {
// si on s'inscrit depuis un autre module
if(!empty($this->from_module)) {
$this->values['inscription_from'] = $this->from_module;
}
// generer la cle de controle de l'inscription
$code = $this->func->codeAlea(30);
$this->values += array(
'email' => $email,
'login' => $login,
'token' => $this->func->codeAlea(32,true),
'thnetuser' => 1,
'address_ip' => $_SERVER['REMOTE_ADDR'],
'verified' => 0,
'activekey' => $code,
'userrights' => 0,
'dateinsert' => $this->func->now(),
'active' => 0,
'stats_acces' => 0
);
// modification
} else {
// nouveau login et ancien dans old_login
if(!empty($login) && $login!=$this->user_infos['login']) {
$this->values['login'] = $login;
$this->values['old_login'] = $this->user_infos['login'];
$change_login = true;
}
// si nouvel email, on enregistre dans other_email
if(!empty($email) && $email!=$this->user_infos['email']) {
$this->values['other_email'] = $email;
$confirm_email = true;
// generer la cle de controle de l'inscription
$code = $this->func->codeAlea(30);
$this->values['code_chge_email'] = $code;
}
}
// mot de passe
if(!empty($password)) {
$this->values['password'] = $this->user->getCryptPass($password);
}
// enregistrer des champs en plus
if(!empty($supp_values)) {
foreach($supp_values as $k=>$v) {
if(!empty($v['qf'])) {
$this->values[$k] = $this->context['form']->get($k)->getData();
} else {
$this->values[$k] = $this->func->strip_and_trim($_POST[$k]);
}
}
}
// ajout de valeur en plus via params
if(!empty($this->params['values'])) {
$this->values += $this->params['values'];
}
// champ de la table extranetusers
$this->user->setUpdateFields($this->values);
// commencer la transaction
// if ($this->user->supports('transactions')) {
// $this->user->beginTransaction();
// }
// id de l'extranetuser
if($this->change_mode) {
$idextranetuser = $this->user_infos['idextranetuser'];
} else {
$idextranetuser = null;
}
// insertion dans la table extranetuser et recup de l'idextranetuser'
try {
$r = $this->user->setData($idextranetuser,true);
} catch (\Exception $e) {
$this->context['error'] = 'Une erreur est survenue. Merci de réessayer plus tard et de contacter le support technique si le problème persiste.';
$this->logger->error($e->getMessage());
$this->logger->debug($e->getTraceAsString());
// if($this->user->in_transaction) { // annuler la transaction
// $this->user->rollback();
// }
}
// nouvel utilisateur => lastInsertID
if(!$this->change_mode) {
$idextranetuser = $r;
}
// si pas de pb, on insere dans la table newsletters
if(empty($this->context['error']) && !$this->change_mode) {
$newsletters = array();
// case a cocher
foreach(array('thnet','theduc','lagarce') as $n) {
if(!empty($_POST[$n])) {
$newsletters[] = $n;
}
}
$country = $this->context['form']->get('country')->getViewData();
if(empty($country)) {
$country = 'FR';
}
// abonnement
if(!empty($newsletters)) {
// inscription depuis ?
if(!empty($this->from_module)) {
$orig = $this->from_module;
} else {
$orig = 'thnet';
}
$subscribers = $this->em->getRepository(Subscribers::class);
$subscribers->setSubscribe($this->values['email'], $newsletters, $country, $orig);
}
}
// si pas de pb d'enregistrement, on envoi le message
if(empty($this->context['error']) && !$this->change_mode) {
// si il y a un mail de validation
if(!empty($this->values['email_validation'])) {
$this->TheatreMail->setDestinataire($this->values['email_validation']);
} else {
$this->TheatreMail->setDestinataire($this->values['email']); // destinataire
}
// a afficher
$this->context['view']->email_validation = $this->TheatreMail->getDestinataire(); //$this->TheatreMail->getDestinataire(); pour les tests : 'boussad.sadadou@gmail.com'
$this->TheatreMail->setExpediteur($_ENV['CONTACT_MAIL']); // expediteur et return-path
$this->TheatreMail->setSubject(utf8_decode($this->subject)); // sujet
// paramètres optionnels pour le lien de validation
$query_opts = array();
foreach(array('urifrom','from_module','type_inscription') as $v) {
if (!empty($this->$v)) {
$query_opts[$v] = $v.'='.$this->$v;
}
}
// on vient d'un module => retour sur le module
if(!empty($this->from_module)) {
if(!empty($this->values['email_pro'])) {
$auto_validation = true;
} else {
$auto_validation = false;
}
$this->setInfosModules($auto_validation);
}
if(!empty($query_opts)) {
$query_opts_string = '?';
$query_opts_string .= join('&',$query_opts);
} else {
$query_opts_string = '';
}
// corps du mail
$params_tr = array(
'lien_activation' => $_ENV['URL_THNET'].'/montheatre/validation/activekey/'.$code.'/'.$query_opts_string,
'code' => $code,
'login' => $login,
'contact_mail' => $_ENV['CONTACT_MAIL'],
);
// params_tr additionnel et optionnel
if (!empty($this->extra_params_tr) && is_array($this->extra_params_tr)) {
$params_tr += $this->extra_params_tr;
}
$this->TheatreMail->prepare('emails/message_inscription.html.twig', $params_tr, 'emails/message_inscription.txt.twig');
try {
$this->TheatreMail->send();
$reponse['ok'] = 'Votre message a bien été envoyé.';
} catch (\Exception $e) {
$this->logger->error($e->getMessage());
$this->logger->debug($e->getTraceAsString());
$this->context['error']['no'] = 'Un probléme est survenu pendant l\'envoi du message de validation !
Merci de réessayer l\'inscription ultièrieurement ou
de <a href="'.$this->page_support.'">contacter le support technique.</a>';
}
}
// en modification, on envoi le message si le mail est modifié
if(empty($this->context['error']) && !empty($confirm_email)) {
$this->sendVerificationNewEmail($this->values['other_email'],$this->values['code_chge_email'],$login);
}
// si tout OK, on valide la transaction (COMMIT)
if(empty($this->context['error'])) {
// if ($this->user->in_transaction) {
// $this->user->commit();
// }
if($this->change_mode) {
$reponse['trans'] = 'Votre compte <em>mon théâtre</em> a bien été modifié !';
} else {
$reponse['trans'] = 'Votre compte <em>mon théâtre</em> a bien été créé !';
}
$this->context['view']->inscription_ok = true;
if(isset($this->sendmail->destinataire)) {
$this->context['view']->email_validation = $this->sendmail->destinataire;
}
}
}
}
// {{{ sendVerificationNewEmail()
/** envoyer le mail de viérification en cas de changement d'email
*
* @param string $email nouvel email
* @param string $code code de vérification
*/
protected function sendVerificationNewEmail($email,$code,$login)
{
// destinataire
$this->TheatreMail->setDestinataire($email); // sujet
// expediteur et return-path
$this->TheatreMail->setExpediteur($_ENV['CONTACT_MAIL']); // sujet
// sujet
$this->TheatreMail->setSubject('Vérification de votre adresse'); // sujet
// corps du mail
$params_tr = array(
'lien_activation' => $_ENV['URL_THNET'].'/montheatre/modifieremail/c/'.$code,
'code' => $code,
'login' => $login,
'contact_mail' => $_ENV['CONTACT_MAIL'],
);
$this->TheatreMail->prepare('emails/message_modifier_montheatre.html.twig', $params_tr);
try {
$this->TheatreMail->send();
//$reponse['ok'] = 'Votre message a bien été envoyé.';
$this->context['view']->modif_email = true;
} catch (\Exception $e) {
$this->logger->error($e->getMessage());
$this->logger->debug($e->getTraceAsString());
$this->context['error']['no'] = '
Un problème est survenu pendant l\'envoi du message de confirmation de votre nouvelle adresse !
Merci de réessayer ultièrieurement ou de contacter le support technique.';
}
}
// }}}
// {{{ setInfosModules()
/** déclaration des infos sur le module si autre que thnet
*
* @param bool $auto_validation email_pro ou pas ?
*/
public function setInfosModules($auto_validation=null)
{
$infos_modules = array(
'theduc' => array(
'langterm_message_inscription' => 'message_inscription_montheatre_theduc',
'langterm_message_inscription_html' => 'message_inscription_montheatre_html_theduc',
),
);
// spécificité enseignant
if($this->type_inscription=='enseignant') {
if($auto_validation) {
$infos_modules = array(
'theduc' => array(
'langterm_message_inscription' => 'message_inscription_enseignant_auto',
'langterm_message_inscription_html' => 'message_inscription_enseignant_auto_html',
),
);
} else {
$infos_modules = array(
'theduc' => array(
'langterm_message_inscription' => 'message_inscription_enseignant',
'langterm_message_inscription_html' => 'message_inscription_enseignant_html',
),
);
}
}
// préciser
if(!empty($infos_modules[$this->from_module])) {
foreach($infos_modules[$this->from_module] as $k=>$v) {
$this->$k = $v;
}
}
}
// }}}
// {{{ getLocate()
/** récupération du fil d'arianne
*
*/
public function getLocate() {
return array(
'/montheatre/' => '<span class="montheatre_pt"><i>mon théâtre</i></span>',
'' => 'Inscription'
);
}
// }}}
}