<?php
declare(strict_types=1);
/**
* @author Mehrez Labidi
*/
namespace App\Controller\Compte;
use App\Services\MetaTag;
use App\Services\Compte\Profil\ProfilManagers;
use App\Controller\EntityUsingController;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Doctrine\ORM\EntityManagerInterface;
use App\Form\Type\Compte\{
ProfilType
};
use App\Entity\Utilisateur;
use App\Entity\UtilisateursNewsletter;
use App\Entity\UtilisateursNewsletterPartenaires;
use App\Entity\UtilisateursNewsletterPDC;
use App\Services\Mailer;
use Symfony\Bridge\Twig\Mime\TemplatedEmail;
use Symfony\Component\Mailer\MailerInterface;
use Symfony\Component\Mime\Address;
use App\Helper\TransProvider;
class ProfilController extends EntityUsingController {
private $am;
/**
* @var MetaTag
*/
private $metaTag;
/**
* @var TransProvider
*/
private $transProvider;
/**
* @var EntityManagerInterface
*/
protected $em;
/**
*
* @param AnnoncesManagers $am
*/
public function __construct(EntityManagerInterface $em, ProfilManagers $am, MetaTag $metaTag, TransProvider $transProvider) {
$this->am = $am;
$this->em = $em;
$this->metaTag = $metaTag;
$this->transProvider = $transProvider;
}
public function modifierProfil(Request $request, MailerInterface $mailer, $codePays): Response {
$this->denyAccessUnlessGranted('ROLE_USER'); // page inaccessible sans authentification
$user = $this->getUser();
$form = $this->createForm(ProfilType::class, null, [
'action' => $this->generateUrl(
$request->attributes->get('_route'),
[
'codePays' => $codePays,
]
),
'method' => 'POST',
]);
if ($request->isMethod('POST')) {
$form->submit($request->request->get($form->getName()));
if ($form->isSubmitted() && $form->isValid()) {
$data = $form->getData();
if ($form->getClickedButton()->getName() === "submit_profil_form") {
unset($data["password"]);
unset($data["new_password"]);
unset($data["email"]);
$this->am->updateProfil($data, $user);
$this->addFlash('success_profil', 'Vos coordonnées sont modifiées');
}
if ($form->getClickedButton()->getName() === "submit_password_form") {
$arr = [
"password" => $data["password"],
"new_password" => $data["new_password"],
];
$this->am->updateProfil($arr, $user);
$this->addFlash('success_password', 'Votre mot de passe est modifié');
}
if ($form->getClickedButton()->getName() === "submit_email_form") {
// Variable pour savoir si on continue les vérifications, si false, on ne vérifie plus
$proceed = true;
// Si les emails sont identiques, on ajoute une erreur
if ($user->email_utilisateur == $form->get('email')->getData()) {
$form->get('email')->addError(new \Symfony\Component\Form\FormError('Adresse email identique'));
$proceed = false; // On a déjà une erreur, inutile de continuer les vérifications
}
// Si la première vérification est bonne, on continue les autres vérifications
if ($proceed) {
// On verifie ensuite si l'adresse email est déjà utilisée
$emailExists = $this->em->getRepository(Utilisateur::class)->findOneBy(['email_utilisateur' => $form->get('email')->getData()]);
// Si adresse déjà utilisée, on ajoute une erreur
if ($emailExists) {
$form->get('email')->addError(new \Symfony\Component\Form\FormError('Adresse email indisponible'));
}
}
// Si le formulaire est valide et aucune erreur n'a été ajoutée
if ($form->isValid()) {
$oldEmail = $user->email_utilisateur;
$newEmail = $data["email"];
$arr = [
"email" => $newEmail,
];
// On sauvegarde l'adresse email
$this->am->updateProfil($arr, $user);
$this->addFlash('success_email', 'Votre adresse email a été mise à jour');
// On met à jour avec la nouvelle adresse email les newsletters si elles existent
$newsletter = $this->em->getRepository(UtilisateursNewsletter::class)->findOneBy(['email' => $oldEmail, 'etat_utilisateur' => 'inscrit']);
if ($newsletter) {
$newsletter->_set('email', $newEmail);
$this->em->persist($newsletter);
$this->em->flush();
}
$newsletter_partenaire = $this->em->getRepository(UtilisateursNewsletterPartenaires::class)->findOneBy(['email' => $oldEmail]);
if ($newsletter_partenaire) {
$newsletter_partenaire->_set('email', $newEmail);
$this->em->persist($newsletter_partenaire);
$this->em->flush();
}
$newsletter_pdc = $this->em->getRepository(UtilisateursNewsletterPDC::class)->findOneBy(['email' => $oldEmail]);
if ($newsletter_pdc) {
$newsletter_pdc->_set('email', $newEmail);
$this->em->persist($newsletter_pdc);
$this->em->flush();
}
// On envoie un mail sur l'ancienne adresse email pour notifier du changement
$email = (new TemplatedEmail())
->from(new Address(Mailer::$senderAdress['notification'], Mailer::$senderAlias['notification']))
->to($oldEmail)
->subject($this->transChoice("<important> Vous venez de modifier votre adresse email sur FUSACQ"))
->htmlTemplate('compte/profil/email.html.twig')
->context([
'oldEmail' => $oldEmail,
'newEmail' => $newEmail
]);
$mailer->send($email);
}
}
} else {
if ($form->getClickedButton()->getName() === "submit_profil_form") {
$this->addFlash('echec_profil', "Certains champs sont vides ou invalides.");
}
if ($form->getClickedButton()->getName() === "submit_password_form") {
$this->addFlash('echec_password', 'Le mot de passe est invalide');
}
if ($form->getClickedButton()->getName() === "submit_email_form") {
$this->addFlash('echec_email', "L'adresse email est invalide");
}
}
}
$metaTag = $this->metaTag
->setTitle("Compte / Mon profil")
->setDescription("Compte / Mon profil");
return $this->render('compte/profil/modifier-profil.html.twig', [
'form' => $form->createView(), 'metaTag' => $metaTag,
]);
}
/**
* @param $var
* @return mixed|string
*/
private function transChoice($var)
{
if (is_string($var)) {
$var = $this->transProvider
->translate($var, "", "M");
}
if (is_array($var)) {
foreach ($var as $key => $item) {
unset($var[$key]);
$key = $this->transProvider
->translate($key, "", "M");
$var[$key] = $item;
}
}
return $var;
}
}