<?php
namespace App\Controller;
use App\Entity\Groupe;
use App\Entity\SearchData;
use App\Entity\User;
use App\Form\GroupeFormType;
use App\Form\SearchFormType;
use DateTime as DateTimeAlias;
use Doctrine\ORM\EntityManagerInterface;
use Doctrine\ORM\Exception\ORMException;
use Symfony\Bridge\Twig\Mime\TemplatedEmail;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Mailer\Exception\TransportExceptionInterface;
use Symfony\Component\Mailer\MailerInterface;
use Symfony\Component\Routing\Annotation\Route;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\IsGranted as IsGranted;
#[Route ('/groupe', name: 'groupe_')]
class GroupeController extends AbstractController
{
// ----------------- Enregristrement d'un groupe -----------------
#[IsGranted('ROLE_USER')]
#[Route('/register', name: 'register')]
public function registerGroup(Request $request,
EntityManagerInterface $entityManager,
MailerInterface $mailer): Response
{
// Creation du groupe pour le formulaire
$groupe = new Groupe();
$form = $this->createForm(GroupeFormType::class, $groupe);
$form->handleRequest($request);
if ($form->isSubmitted() && $form->isValid()) {
//recupération des données et ajout des champs cachés
// association avec l'utilisateur
$user = $this->getUser();
$groupe->setUser($user);
// Valeur par default de l'annulation
$groupe->setAnnule(false);
// Intilitalisation de la date de parution
$groupe->setDateParution(new DateTimeAlias());
$entityManager->persist($groupe);
// Insertion en base
$entityManager->flush();
// Email de confirmation si checkbox
if ($form->get('emailConfirmation')->getData()){
$this->sendEmail($mailer, $user);
}
$this->addFlash('success', 'Le groupe à bien été enregistré ! ');
return $this->redirectToRoute('home');
}
return $this->render('groupe/registerGroupForm.html.twig', [
'groupeForm' => $form->createView(),
]);
}
//-----------------------détail d'un groupe-----------------------
/**
* @param Request $request
* @param EntityManagerInterface $entityManager
* @return Response
*/
#[IsGranted('ROLE_USER')]
#[Route(path: '/{id}', name: 'details', requirements: ['id' => '\d+'], methods: ['GET'])]
public function details(Request $request, EntityManagerInterface $entityManager): Response
{
$id = (int)$request->get('id');
// Récupération du groupe
try {
$groupe = $entityManager->getRepository(Groupe::class)->getGroupById($id);
} catch (ORMException) {
throw $this->createNotFoundException('Vous ne pouvez pas accéder à ce groupe ou vous n\'y avez pas accés,
si cela vous semble incorrect merci de vous rapprocher d\'un des responsables');
}
// Appel de la vue
return $this->render('groupe/details.html.twig', [
'groupe' => $groupe
]);
}
/**
* @param Request $request
* @param EntityManagerInterface $entityManager
* @return Response
*/
#[IsGranted('ROLE_USER')]
#[Route(path: '/modification/{id}', name: 'update', requirements: ['id' => '\d+'], methods: ['GET', 'POST'])]
public function update(Request $request, EntityManagerInterface $entityManager): Response
{
// Récupération user log
$user = $this->getUser();
$id = (int)$request->get('id');
// Récupération du groupe
try {
$groupe = $entityManager->getRepository(Groupe::class)->getGroupById($id);
} catch (ORMException) {
throw $this->createNotFoundException('Aucun élément corresponds');
}
$form = $this->createForm(GroupeFormType::class, $groupe);
$form->handleRequest($request);
// Utilisateur correspond ou est Admin
if ( ($user == $groupe->getUser()) OR ($user->getTypeAdherent()->getNiveau() ==1) ) {
// formulaire valide
if ($form->isSubmitted() && $form->isValid()) {
//récupération des données et modification des champs cachés
$groupe->setDateParution(new DateTimeAlias());
// TODO Gerer l'annulation de groupe checkbox
$entityManager->persist($groupe);
// Insertion en base
$entityManager->flush();
// Appel de la vue
return $this->redirectToRoute('groupe_details', ['id' => $groupe->getId()]);
}
return $this->render('groupe/update.html.twig', [
'groupeForm' => $form->createView()
]);
} else {
$this->addFlash('warning', 'Vous n\'avez pas le droit de modifier ce groupe!');
return $this->redirectToRoute('home');
}
}
//----------------------- Liste de tout les groupes (max 25 resultats)-----------------------
#[Route(path: '/resultats', name: 'list', methods: ['GET', 'POST'])]
public function list(Request $request, EntityManagerInterface $entityManager): Response
{
$userLog = $this->getUser();
// Création du formulaire de recherche
// datas form
$data = new SearchData();
$searchForm = $this->createForm(SearchFormType::class, $data);
$searchForm->handleRequest($request);
// Recupération des groupes de la recherche
$groupesSearch = $entityManager->getRepository(Groupe::class)->search($data);
if (empty($groupesSearch)) {
// Message notification si pas de résultats
$this->addFlash('warning', 'Aucun résultat !');
}
// Affichage des groupes
return $this->render('groupe/list.html.twig', [
'groupes' => $groupesSearch,
'searchForm' => $searchForm->createView(),
'app_user'=>$userLog
]);
}
// Mail function
public function sendEmail(MailerInterface $mailer, User $user): Response
{
$email = (new TemplatedEmail())
->from('audrey@enjin.fr')
->to($user->getEmail())
->subject('Enregistrement d\'un nouveau groupe')
->htmlTemplate('groupe/email_register_confirm.html.twig');
try {
$mailer->send($email);
} catch (TransportExceptionInterface $e) {
$this->addFlash('secondary', $e);
return $this->redirectToRoute('home');
}
// message confirmation mail envoyé
$this->addFlash('success', 'Le groupe à bien été enregistré ! ');
return $this->redirectToRoute('home');
}
}