EventController.php 7.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196
  1. <?php
  2. namespace App\Controller\Admin;
  3. use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
  4. use Symfony\Component\HttpFoundation\Request;
  5. use Symfony\Component\HttpFoundation\Response;
  6. use Symfony\Component\Routing\Requirement\Requirement;
  7. use Symfony\Component\Routing\Attribute\Route;
  8. use Doctrine\ORM\EntityManagerInterface;
  9. use Symfony\Component\String\Slugger\AsciiSlugger;
  10. use Symfony\Component\DependencyInjection\ParameterBag\ParameterBagInterface;
  11. use App\Entity\Event;
  12. use App\Form\EventType;
  13. use App\Repository\EventRepository;
  14. use App\Service\PictureService;
  15. final class EventController extends AbstractController
  16. {
  17. /*
  18. * Lister tous les événements
  19. */
  20. #[Route('/admin/event', name: 'app_admin_event')]
  21. public function index(EventRepository $repository): Response
  22. {
  23. $events = $repository->findAll();
  24. return $this->render('admin/event/index.html.twig', [
  25. 'events' => $events,
  26. ]);
  27. }
  28. /*
  29. * Supprimer un événement
  30. */
  31. #[Route('/admin/event/{id}/delete', name: 'app_admin_event_delete', requirements: ['id' => Requirement::UUID_V7], methods: ['GET'])]
  32. public function delete(?Event $event, EntityManagerInterface $manager, ParameterBagInterface $params): Response
  33. {
  34. // Effacer toutes images associée
  35. if ($event->getPicture()) {
  36. $fullPath = $params->get('upload_images_directory') . '/events/' . $event->getPicture();
  37. unlink($fullPath);
  38. }
  39. $manager->remove($event);
  40. $manager->flush();
  41. $this->addFlash('success', 'Événement supprimé avec succès.');
  42. return $this->redirectToRoute('app_admin_event');
  43. }
  44. /*
  45. * Supprimer l'image d'un événement
  46. */
  47. #[Route('/admin/event/{id}/del-pic', name: 'app_admin_event_del_pic', requirements: ['id' => Requirement::UUID_V7], methods: ['GET'])]
  48. public function deletePicture(?Event $event, EntityManagerInterface $manager, ParameterBagInterface $params): Response
  49. {
  50. // Effacer toutes images associée
  51. if ($event->getPicture()) {
  52. $fullPath = $params->get('upload_images_directory') . '/events/' . $event->getPicture();
  53. unlink($fullPath);
  54. }
  55. $event->setPicture(null);
  56. $manager->flush();
  57. $this->addFlash('success', 'Illustration supprimée avec succès.');
  58. return $this->redirectToRoute('app_admin_event_edit', ['id' => $event->getId()]);
  59. }
  60. /*
  61. * Modifier un jeu
  62. */
  63. #[Route('/admin/event/{id}/edit', name: 'app_admin_event_edit', requirements: ['id' => Requirement::UUID_V7], methods: ['GET', 'POST'])]
  64. public function edit(?Event $event, Request $request, EntityManagerInterface $manager, PictureService $pictureService): Response
  65. {
  66. $form = $this->createForm(EventType::class, $event);
  67. $form->handleRequest($request);
  68. if ($form->isSubmitted() && $form->isValid()) {
  69. $slug = $form->get('slug')->getData();
  70. // Aucun slug n'a été proposé par l'utilisateur
  71. if (!$slug) {
  72. $slugger = new AsciiSlugger('fr_FR');
  73. $slug = $slugger->slug(strtolower($event->getName()));
  74. $event->setSlug($slug);
  75. }
  76. // Traiter l'image proposée
  77. $tmpPicture = $form->get('picture')->getData();
  78. if ($tmpPicture) {
  79. $picture = $pictureService->banner($tmpPicture, '/events/', $slug);
  80. $event->setPicture($picture);
  81. }
  82. $manager->persist($event);
  83. $manager->flush();
  84. $this->addFlash('success', 'Événement modifié avec succès.');
  85. return $this->redirectToRoute('app_admin_event');
  86. }
  87. return $this->render('admin/event/edit.html.twig', [
  88. 'form' => $form,
  89. 'event' => $event,
  90. ]);
  91. }
  92. /*
  93. * Ajouter un jeu
  94. */
  95. #[Route('/admin/event/add', name: 'app_admin_event_add', methods: ['GET', 'POST'])]
  96. public function add(Request $request, EntityManagerInterface $manager, PictureService $pictureService): Response
  97. {
  98. // Initialisation d'un nouveau jeu
  99. $event = new Event();
  100. $form = $this->createForm(EventType::class, $event);
  101. $form->handleRequest($request);
  102. if ($form->isSubmitted() && $form->isValid()) {
  103. $slug = $form->get('slug')->getData();
  104. // Aucun slug n'a été proposé par l'utilisateur
  105. if (!$slug) {
  106. $slugger = new AsciiSlugger('fr_FR');
  107. $slug = $slugger->slug(strtolower($event->getName()));
  108. $event->setSlug($slug);
  109. }
  110. // Traiter l'image proposée
  111. $tmpPicture = $form->get('picture')->getData();
  112. if ($tmpPicture) {
  113. $picture = $pictureService->banner($tmpPicture, '/events/', $slug);
  114. $event->setPicture($picture);
  115. }
  116. $manager->persist($event);
  117. $manager->flush();
  118. $this->addFlash('success', 'Événement ajouté à la base de données avec succès.');
  119. return $this->redirectToRoute('app_admin_event');
  120. }
  121. return $this->render('admin/event/edit.html.twig', [
  122. 'form' => $form,
  123. 'event' => $event
  124. ]);
  125. }
  126. #[Route('/admin/event/{id}/configure', name: 'app_admin_event_config', requirements: ['id' => Requirement::UUID_V7], methods: ['GET', 'POST'])]
  127. public function configure(?Event $event, Request $request, EntityManagerInterface $manager, PictureService $pictureService): Response
  128. {
  129. return $this->render('admin/event/config/index.html.twig', [
  130. 'event' => $event
  131. ]);
  132. }
  133. #[Route('/admin/event/{id}/publish', name: 'app_admin_event_config_publish', requirements: ['id' => Requirement::UUID_V7], methods: ['GET'])]
  134. public function publish(?Event $event, EntityManagerInterface $manager): Response
  135. {
  136. if ($event->isPublished()) {
  137. $this->addFlash('danger', 'Événement déjà publié !');
  138. } else {
  139. // Respecte les conditions de publications. Dispose de slots, au moins un MJ et un jeu...
  140. if (count($event->getSlots()) > 0) {
  141. $event->setPublished(true);
  142. $manager->persist($event);
  143. $manager->flush();
  144. $this->addFlash('success', 'Événement publié.');
  145. } else {
  146. $this->addFlash('danger', 'Un événement doit disposer d\'au moins un slot, d\'un(e) meneur(euse) de jeu et d\'un jeu.');
  147. }
  148. }
  149. return $this->redirectToRoute('app_admin_event_config', [
  150. 'id' => $event->getId()
  151. ]);
  152. }
  153. #[Route('/admin/event/{id}/unpublish', name: 'app_admin_event_config_unpublish', requirements: ['id' => Requirement::UUID_V7], methods: ['GET'])]
  154. public function unpublish(?Event $event, EntityManagerInterface $manager): Response
  155. {
  156. if ($event->isPublished()) {
  157. $event->setPublished(false);
  158. $manager->persist($event);
  159. $manager->flush();
  160. $this->addFlash('success', 'Événement dépublié !');
  161. } else {
  162. $this->addFlash('danger', 'Cet événement n\'est pas publié.');
  163. }
  164. return $this->redirectToRoute('app_admin_event_config', [
  165. 'id' => $event->getId()
  166. ]);
  167. }
  168. }