src\Controller\ThemeController.php line 39

Open in your IDE?
  1. <?php
  2. namespace App\Controller;
  3. use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
  4. use Symfony\Component\HttpFoundation\Response;
  5. use Symfony\Component\Routing\Annotation\Route;
  6. use Symfony\Component\HttpFoundation\Request;
  7. use Doctrine\ORM\EntityManagerInterface;
  8. use Knp\Component\Pager\PaginatorInterface;
  9. use App\Entity\Theme;
  10. use App\Entity\Menu;
  11. use App\Entity\ProposeTheme;
  12. use App\Form\ThemeType;
  13. class ThemeController extends AbstractController
  14. {
  15. #[Route('/theme/liste', name: 'app_theme_liste')]
  16. public function liste(EntityManagerInterface $em, PaginatorInterface $paginator,Request $request): Response
  17. {
  18. if ($request->query->get('filterField') && $request->query->get('filterValue') && !is_numeric($request->query->get('filterValue'))) {
  19. $request->query->set('filterValue', "*".$request->query->get('filterValue')."*");
  20. }
  21. // On récupère tous les articles disponibles en base de données
  22. $query = $em->createQuery('SELECT theme FROM App\Entity\Theme theme');
  23. $pagination = $paginator->paginate(
  24. $query, /* query NOT result */
  25. $request->query->getInt('page', 1), /* page number */
  26. 10 /* limit per page */
  27. );
  28. return $this->render('theme/liste.html.twig', [
  29. 'pagination' => $pagination
  30. ]);
  31. }
  32. #[Route('/theme/index/{id}', name: 'app_theme_index')]
  33. public function index(EntityManagerInterface $em,PaginatorInterface $paginator, Request $request,int $id): Response
  34. {
  35. if ($request->query->get('filterField') && $request->query->get('filterValue') && !is_numeric($request->query->get('filterValue'))) {
  36. $request->query->set('filterValue', "*".$request->query->get('filterValue')."*");
  37. }
  38. // On récupère l'Theme qui correspond à l'id passé dans l'url
  39. $theme = $em->getRepository(Theme::class)->findOneBy(['theme_id' => $id]);
  40. if (!$theme) {
  41. $this->addFlash('danger', 'Le theme n"existe pas');
  42. return $this->redirectToRoute('app_theme_liste');
  43. }
  44. $menus = $theme->getProposeThemes()->map(function($proposetheme) {
  45. return $proposetheme->getMenuId();
  46. })->toArray();
  47. if ($menus){
  48. // On récupère tous les articles disponibles en base de données
  49. $queryBuilder = $em->createQueryBuilder()
  50. ->select('menu')
  51. ->from(Menu::class, 'menu')
  52. ->where('menu.menu_id NOT IN (:menus)')
  53. ->setParameter('menus', $menus);
  54. }
  55. else
  56. {
  57. // On récupère tous les articles disponibles en base de données
  58. $queryBuilder = $em->createQueryBuilder()
  59. ->select('menu')
  60. ->from(Menu::class, 'menu');
  61. }
  62. $prixMin = $request->query->get('prix_min');
  63. $prixMax = $request->query->get('prix_max');
  64. if ($prixMin !== null) {
  65. $queryBuilder->andWhere('menu.prix_par_personne >= :prixMin')
  66. ->setParameter('prixMin', $prixMin);
  67. }
  68. if ($prixMax !== null) {
  69. $queryBuilder->andWhere('menu.prix_par_personne <= :prixMax')
  70. ->setParameter('prixMax', $prixMax);
  71. }
  72. $query = $queryBuilder->getQuery();
  73. $pagination = $paginator->paginate(
  74. $query, /* query NOT result */
  75. $request->query->getInt('page', 1), /* page number */
  76. 10 /* limit per page */
  77. );
  78. return $this->render('theme/index.html.twig', [
  79. 'theme' => $theme,
  80. 'menus' => $menus,
  81. 'pagination' => $pagination,
  82. 'page' => $request->query->getInt('page', 1),
  83. 'sort'=> $request->query->get('sort', ''),
  84. 'direction'=> $request->query->get('direction', ''),
  85. 'filterField'=> $request->query->get('filterField', ''),
  86. 'filterValue'=> $request->query->get('filterValue', ''),
  87. 'prix_min' => $prixMin,
  88. 'prix_max' => $prixMax
  89. ]);
  90. }
  91. #[Route('/theme/add', name: 'app_theme_add')]
  92. public function add(EntityManagerInterface $em, Request $request): Response
  93. {
  94. $mode = 'new';
  95. $theme = new Theme();
  96. $form = $this->createForm(ThemeType::class, $theme);
  97. $form->handleRequest($request);
  98. if($form->isSubmitted() && $form->isValid()) {
  99. $this->saveTheme($theme, $mode,$em);
  100. return $this->redirectToRoute('app_theme_index', ['id' => $theme->getThemeId()]);
  101. }
  102. $parameters = array(
  103. 'form' => $form->createView(),
  104. 'Theme' => $theme,
  105. 'mode' => $mode
  106. );
  107. return $this->render('theme/edit.html.twig', $parameters);
  108. }
  109. #[Route('/theme/edit/{id}', name: 'app_theme_edit')]
  110. public function edit(EntityManagerInterface $em, Request $request, int $id=null): Response
  111. {
  112. $mode = 'update';
  113. // On récupère l'Theme qui correspond à l'id passé dans l'url
  114. $theme = $em->getRepository(Theme::class)->findOneBy(['theme_id' => $id]);
  115. if (!$theme) {
  116. $this->addFlash('danger', 'Le theme n"existe pas');
  117. return $this->redirectToRoute('app_theme_liste');
  118. }
  119. $form = $this->createForm(ThemeType::class, $theme);
  120. $form->handleRequest($request);
  121. if($form->isSubmitted() && $form->isValid()) {
  122. $this->saveTheme($theme, $mode,$em);
  123. return $this->redirectToRoute('app_theme_index', ['id' => $id]);
  124. }
  125. $parameters = array(
  126. 'form' => $form->createView(),
  127. 'theme' => $theme,
  128. 'mode' => $mode
  129. );
  130. return $this->render('theme/edit.html.twig', $parameters);
  131. }
  132. #[Route('/theme/remove/{id}', name: 'app_theme_remove')]
  133. public function remove(EntityManagerInterface $em, int $id): Response
  134. {
  135. // On récupère l'Theme qui correspond à l'id passé dans l'URL
  136. $theme = $em->getRepository(Theme::class)->findOneBy(['theme_id' => $id]);
  137. if (!$theme) {
  138. $this->addFlash('danger', 'L"Theme n"existe pas');
  139. return $this->redirectToRoute('app_theme_liste');
  140. }
  141. // L'Theme est supprimé
  142. $em->remove($theme);
  143. $em->flush();
  144. $this->addFlash('success', 'L"Theme a été supprimé avec succès');
  145. return $this->redirectToRoute('app_theme_liste');
  146. }
  147. #[Route('/theme/menuadd/{idtheme}/{idmenu}', name: 'app_theme_menuadd')]
  148. public function menuadd(EntityManagerInterface $em, int $idtheme, int $idmenu): Response
  149. {
  150. // On récupère le Theme qui correspond à l'id passé dans l'url
  151. $theme = $em->getRepository(Theme::class)->findOneBy(['theme_id' => $idtheme]);
  152. if (!$theme) {
  153. $this->addFlash('danger', 'Le theme n"existe pas');
  154. return $this->redirectToRoute('app_theme_liste');
  155. }
  156. $menu= $em->getRepository(Menu::class)->findOneBy(['menu_id' => $idmenu]);
  157. if (!$menu) {
  158. $this->addFlash('danger', 'Le menu n"existe pas');
  159. return $this->redirectToRoute('app_theme_index', ['id' => $idtheme]);
  160. }
  161. $proposetheme= $menu->getProposeTheme();
  162. if ($proposetheme) {
  163. $proposetheme->setThemeId($theme);
  164. $em->persist($proposetheme);
  165. $em->flush();
  166. }
  167. else
  168. {
  169. $proposetheme = new ProposeTheme();
  170. $proposetheme->setMenuId($menu);
  171. $proposetheme->setThemeId($theme);
  172. $theme->addProposeTheme($proposetheme);
  173. $em->persist($theme);
  174. $em->flush();
  175. }
  176. $this->addFlash('success', 'Le menu a été ajouté avec succès');
  177. return $this->redirectToRoute('app_theme_index', ['id' => $idtheme]);
  178. }
  179. #[Route('/theme/menuremove/{idtheme}/{idmenu}', name: 'app_theme_menuremove')]
  180. public function menuremove(EntityManagerInterface $em, int $idtheme, int $idmenu): Response
  181. {
  182. // On récupère le Theme qui correspond à l'id passé dans l'url
  183. $theme = $em->getRepository(Theme::class)->findOneBy(['theme_id' => $idtheme]);
  184. if (!$theme) {
  185. $this->addFlash('danger', 'Le theme n"existe pas');
  186. return $this->redirectToRoute('app_theme_liste');
  187. }
  188. $proposetheme= $theme->getProposeThemes()->filter(function($proposetheme) use ($idmenu) {
  189. return $proposetheme->getMenuId()->getMenuId() === $idmenu;
  190. })->first();
  191. if ($proposetheme) {
  192. $em->remove($proposetheme);
  193. $em->flush();
  194. }
  195. $this->addFlash('success', 'Le menu a été supprimé avec succès');
  196. return $this->redirectToRoute('app_theme_index', ['id' => $idtheme]);
  197. }
  198. /**
  199. * Enregistrer un Theme en base de données
  200. *
  201. * @param Theme $theme
  202. * @param string $mode
  203. */
  204. private function saveTheme(Theme $theme, string $mode, EntityManagerInterface $em){
  205. $em->persist($theme);
  206. $em->flush();
  207. if($mode == 'new') {
  208. $this->addFlash('success', 'L"Theme a été ajouté avec succès');
  209. } else {
  210. $this->addFlash('success', 'L"Theme a été modifié avec succès');
  211. }
  212. }
  213. }