src/Controller/MainController.php line 256

Open in your IDE?
  1. <?php
  2. namespace App\Controller;
  3. use App\Entity\Article;
  4. use App\Entity\Event;
  5. use App\Entity\Gallery;
  6. use App\Entity\Project;
  7. use App\Entity\TeamMember;
  8. use Doctrine\ORM\EntityManagerInterface;
  9. use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
  10. use Symfony\Component\HttpFoundation\Response;
  11. use Symfony\Component\HttpFoundation\Request;
  12. use Symfony\Component\Routing\Annotation\Route;
  13. use Symfony\Component\Mailer\MailerInterface;
  14. use Symfony\Component\Mime\Email;
  15. use Symfony\Component\Mime\Address;
  16. use App\Entity\ContactMessage;
  17. class MainController extends AbstractController
  18. {
  19. private $em;
  20. public function __construct(EntityManagerInterface $em)
  21. {
  22. $this->em = $em;
  23. }
  24. /**
  25. * @Route("/", name="app_home")
  26. */
  27. public function index(): Response
  28. {
  29. $events = $this->em->getRepository(Event::class)->findBy([], ['date' => 'ASC'], 3);
  30. $articles = $this->em->getRepository(Article::class)->findBy([], ['createdAt' => 'DESC'], 3);
  31. $galleries = $this->em->getRepository(Gallery::class)->findBy([], ['createdAt' => 'DESC'], 4);
  32. $projects = $this->em->getRepository(Project::class)->findBy([], ['id' => 'DESC'], 3);
  33. return $this->render('pages/index.html.twig', [
  34. 'events' => $events,
  35. 'articles' => $articles,
  36. 'galleries' => $galleries,
  37. 'projects' => $projects
  38. ]);
  39. }
  40. /**
  41. * @Route("/association", name="app_association")
  42. */
  43. public function association(): Response
  44. {
  45. $teamMembers = $this->em->getRepository(TeamMember::class)->findBy([], ['displayOrder' => 'ASC']);
  46. $projects = $this->em->getRepository(Project::class)->findBy([], ['id' => 'DESC'], 3);
  47. return $this->render('pages/association.html.twig', [
  48. 'team_members' => $teamMembers,
  49. 'projects' => $projects
  50. ]);
  51. }
  52. /**
  53. * @Route("/festival", name="app_festival")
  54. */
  55. public function festival(): Response
  56. {
  57. return $this->render('events/festival.html.twig');
  58. }
  59. /**
  60. * @Route("/evenements", name="app_evenements")
  61. */
  62. public function evenements(Request $request): Response
  63. {
  64. $page = $request->query->getInt('page', 1);
  65. $category = $request->query->get('category');
  66. $search = $request->query->get('search');
  67. $limit = 6;
  68. $offset = ($page - 1) * $limit;
  69. $qb = $this->em->getRepository(Event::class)->createQueryBuilder('e')
  70. ->orderBy('e.date', 'ASC');
  71. if ($category && $category !== 'Toutes les catégories') {
  72. $qb->andWhere('e.category = :category')
  73. ->setParameter('category', $category);
  74. }
  75. if ($search) {
  76. $qb->andWhere('e.title LIKE :search OR e.description LIKE :search OR e.location LIKE :search')
  77. ->setParameter('search', '%' . $search . '%');
  78. }
  79. // Count total
  80. $countQb = clone $qb;
  81. $totalEvents = $countQb->select('count(e.id)')->getQuery()->getSingleScalarResult();
  82. $totalPages = ceil($totalEvents / $limit);
  83. // Get events
  84. $events = $qb->setMaxResults($limit)
  85. ->setFirstResult($offset)
  86. ->getQuery()
  87. ->getResult();
  88. // Get categories for filter
  89. $categoriesQuery = $this->em->createQuery('SELECT DISTINCT e.category FROM App\Entity\Event e WHERE e.category IS NOT NULL');
  90. $categories = array_column($categoriesQuery->getScalarResult(), 'category');
  91. return $this->render('events/evenements.html.twig', [
  92. 'events' => $events,
  93. 'current_page' => $page,
  94. 'total_pages' => $totalPages,
  95. 'current_category' => $category,
  96. 'search_query' => $search,
  97. 'categories' => $categories
  98. ]);
  99. }
  100. /**
  101. * @Route("/evenement/{id}", name="app_event_show")
  102. */
  103. public function eventShow($id): Response
  104. {
  105. $event = $this->em->getRepository(Event::class)->find($id);
  106. if (!$event) {
  107. throw $this->createNotFoundException('Événement non trouvé');
  108. }
  109. return $this->render('events/event_show.html.twig', [
  110. 'event' => $event
  111. ]);
  112. }
  113. /**
  114. * @Route("/sponsoring", name="app_sponsoring")
  115. */
  116. public function sponsoring(): Response
  117. {
  118. return $this->render('pages/sponsoring.html.twig');
  119. }
  120. /**
  121. * @Route("/blog", name="app_blog")
  122. */
  123. public function blog(Request $request): Response
  124. {
  125. $page = $request->query->getInt('page', 1);
  126. $category = $request->query->get('category');
  127. $limit = 8;
  128. $offset = ($page - 1) * $limit;
  129. $criteria = [];
  130. if ($category) {
  131. $criteria['category'] = $category;
  132. }
  133. $repo = $this->em->getRepository(Article::class);
  134. $articles = $repo->findBy($criteria, ['createdAt' => 'DESC'], $limit, $offset);
  135. $totalArticles = $repo->count($criteria);
  136. $totalPages = ceil($totalArticles / $limit);
  137. // Fetch the featured article (only on page 1, without category filter)
  138. $featuredArticle = null;
  139. if ($page === 1 && !$category) {
  140. $featuredArticle = $repo->findOneBy(['isFeatured' => true], ['createdAt' => 'DESC']);
  141. // Remove the featured article from the list if it's there
  142. if ($featuredArticle) {
  143. $articles = array_filter($articles, function ($a) use ($featuredArticle) {
  144. return $a->getId() !== $featuredArticle->getId();
  145. });
  146. }
  147. }
  148. // Fetch categories for sidebar
  149. $categoriesQuery = $this->em->createQuery('SELECT DISTINCT a.category FROM App\Entity\Article a WHERE a.category IS NOT NULL');
  150. $categories = array_column($categoriesQuery->getScalarResult(), 'category');
  151. return $this->render('blog/blog.html.twig', [
  152. 'articles' => $articles,
  153. 'featured_article' => $featuredArticle,
  154. 'current_page' => $page,
  155. 'total_pages' => $totalPages,
  156. 'current_category' => $category,
  157. 'categories' => $categories
  158. ]);
  159. }
  160. /**
  161. * @Route("/blog/{id}", name="app_article_show")
  162. */
  163. public function articleShow($id): Response
  164. {
  165. $article = $this->em->getRepository(Article::class)->find($id);
  166. if (!$article) {
  167. throw $this->createNotFoundException('Article non trouvé');
  168. }
  169. $recentArticles = $this->em->getRepository(Article::class)->findBy([], ['createdAt' => 'DESC'], 3);
  170. return $this->render('blog/article_show.html.twig', [
  171. 'article' => $article,
  172. 'recent_articles' => $recentArticles
  173. ]);
  174. }
  175. /**
  176. * @Route("/galerie", name="app_galerie")
  177. */
  178. public function galerie(Request $request): Response
  179. {
  180. $page = $request->query->getInt('page', 1);
  181. $category = $request->query->get('category');
  182. $limit = 10;
  183. $offset = ($page - 1) * $limit;
  184. $criteria = [];
  185. if ($category) {
  186. $criteria['category'] = $category;
  187. }
  188. $repo = $this->em->getRepository(Gallery::class);
  189. $images = $repo->findBy($criteria, ['createdAt' => 'DESC'], $limit, $offset);
  190. $totalImages = $repo->count($criteria);
  191. $totalPages = ceil($totalImages / $limit);
  192. // Fetch categories for filters
  193. $categoriesQuery = $this->em->createQuery('SELECT DISTINCT g.category FROM App\Entity\Gallery g WHERE g.category IS NOT NULL');
  194. $categories = array_column($categoriesQuery->getScalarResult(), 'category');
  195. return $this->render('pages/galerie.html.twig', [
  196. 'images' => $images,
  197. 'current_page' => $page,
  198. 'total_pages' => $totalPages,
  199. 'current_category' => $category,
  200. 'categories' => $categories
  201. ]);
  202. }
  203. /**
  204. * @Route("/contact", name="app_contact")
  205. */
  206. public function contact(): Response
  207. {
  208. return $this->render('pages/contact.html.twig');
  209. }
  210. /**
  211. * @Route("/conditions-utilisation", name="app_cgu")
  212. */
  213. public function cgu(): Response
  214. {
  215. return $this->render('pages/cgu.html.twig');
  216. }
  217. /**
  218. * @Route("/politique-de-confidentialite", name="app_privacy")
  219. */
  220. public function privacy(): Response
  221. {
  222. return $this->render('pages/privacy.html.twig');
  223. }
  224. /**
  225. * @Route("/politique-de-remboursement", name="app_refund")
  226. */
  227. public function refund(): Response
  228. {
  229. return $this->render('pages/refund.html.twig');
  230. }
  231. /**
  232. * @Route("/espace-membre", name="app_espace_membre")
  233. */
  234. public function espaceMembre(\Symfony\Component\HttpFoundation\Request $request): Response
  235. {
  236. $memberId = $request->getSession()->get('member_id');
  237. if (!$memberId) {
  238. return $this->redirectToRoute('app_login');
  239. }
  240. $member = $this->em->getRepository(\App\Entity\Member::class)->find($memberId);
  241. if (!$member) {
  242. $request->getSession()->remove('member_id');
  243. return $this->redirectToRoute('app_login');
  244. }
  245. return $this->render('user/espace_membre.html.twig', [
  246. 'member' => $member
  247. ]);
  248. }
  249. /**
  250. * @Route("/submit-contact", name="app_contact_submit", methods={"POST"})
  251. */
  252. public function submitContact(Request $request, MailerInterface $mailer): Response
  253. {
  254. $type = $request->request->get('type', 'contact');
  255. $name = $request->request->get('name');
  256. $email = $request->request->get('email');
  257. $subject = $request->request->get('subject');
  258. $messageContent = $request->request->get('message');
  259. $msg = new ContactMessage();
  260. $msg->setName($name);
  261. $msg->setEmail($email);
  262. $msg->setSubject($subject);
  263. $msg->setMessage($messageContent);
  264. $msg->setType($type);
  265. $this->em->persist($msg);
  266. $this->em->flush();
  267. try {
  268. $emailObj = (new Email())
  269. ->from(new Address('wabenin@azilink.com', 'WA BENIN'))
  270. ->replyTo($email)
  271. ->to('wabenin@azilink.com')
  272. ->subject($type === 'sponsoring' ? 'Nouveau Sponsor: ' . $subject : 'Nouveau Message: ' . $subject)
  273. ->text("De: $name ($email)\n\n$messageContent");
  274. $mailer->send($emailObj);
  275. } catch (\Exception $e) {
  276. }
  277. // Flash message or query param could be used here
  278. if ($type === 'sponsoring') {
  279. return $this->redirectToRoute('app_sponsoring', ['success' => 1]);
  280. }
  281. return $this->redirectToRoute('app_contact', ['success' => 1]);
  282. }
  283. }