src/Controller/KiosqueController.php line 108

Open in your IDE?
  1. <?php
  2. namespace App\Controller;
  3. use App\Entity\KioskCollec;
  4. use App\Entity\KioskNum;
  5. use App\Entity\LienKioskNumUser;
  6. use App\Entity\User;
  7. use App\Form\MagazineType;
  8. use App\Form\NumeroMagazineType;
  9. use App\Form\NumerosMultiplesType;
  10. use App\Repository\KioskCollecRepository;
  11. use App\Repository\KioskNumRepository;
  12. use App\Repository\LienKioskNumUserRepository;
  13. use App\Repository\UserRepository;
  14. use Doctrine\ORM\EntityManagerInterface;
  15. use Knp\Component\Pager\PaginatorInterface;
  16. use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
  17. use Symfony\Component\HttpFoundation\Request;
  18. use Symfony\Component\HttpFoundation\Response;
  19. use Symfony\Component\Routing\Annotation\Route;
  20. /**
  21. * @Route("/magazines")
  22. */
  23. class KiosqueController extends AbstractController
  24. {
  25. private EntityManagerInterface $em;
  26. public function __construct(EntityManagerInterface $em)
  27. {
  28. $this->em = $em;
  29. }
  30. /**
  31. * @Route("/", name="magazines_list")
  32. */
  33. public function listMagazines(Request $request, PaginatorInterface $paginator, KioskCollecRepository $repository): Response
  34. {
  35. $detect = new \Mobile_Detect;
  36. $query = $repository->findBy([], ['nom' => 'ASC']);
  37. $pagination = $paginator->paginate(
  38. $query,
  39. $request->query->getInt('page', 1),
  40. 20
  41. );
  42. $images = [];
  43. foreach ($pagination->getItems() as $magazine) {
  44. if ($magazine->getImage()) {
  45. $images[$magazine->getId()] = base64_encode(stream_get_contents($magazine->getImage()));
  46. }
  47. }
  48. return $this->render('magazines/list.html.twig', [
  49. 'pagination' => $pagination,
  50. 'magazines' => $pagination->getItems(),
  51. 'images' => $images,
  52. 'mobile' => $detect->isMobile()
  53. ]);
  54. }
  55. /**
  56. * @Route("/nouveau", name="magazine_new")
  57. */
  58. public function newMagazine(Request $request): Response
  59. {
  60. $this->denyAccessUnlessGranted('IS_AUTHENTICATED_FULLY');
  61. $user = $this->getUser();
  62. $magazine = new KioskCollec();
  63. $magazine->setCreateUser($user);
  64. $magazine->setUpdateUser($user);
  65. $magazine->setCreateDate(new \DateTime());
  66. $magazine->setUpdateDate(new \DateTime());
  67. $magazine->setNbnum(0);
  68. $magazine->setStatut(true);
  69. $form = $this->createForm(MagazineType::class, $magazine);
  70. $form->handleRequest($request);
  71. if ($form->isSubmitted() && $form->isValid()) {
  72. $imageFile = $form->get('imageFile')->getData();
  73. if ($imageFile) {
  74. $imageData = file_get_contents($imageFile->getPathname());
  75. $magazine->setImage($imageData);
  76. }
  77. $this->em->persist($magazine);
  78. $this->em->flush();
  79. $this->addFlash('success', 'Magazine créé avec succès');
  80. return $this->redirectToRoute('magazine_detail', ['id' => $magazine->getId()]);
  81. }
  82. return $this->render('magazines/form.html.twig', [
  83. 'form' => $form->createView(),
  84. 'magazine' => $magazine,
  85. 'edit' => false
  86. ]);
  87. }
  88. /**
  89. * @Route("/{id}", name="magazine_detail", requirements={"id"="\d+"})
  90. */
  91. public function detailMagazine(int $id, Request $request, PaginatorInterface $paginator, KioskCollecRepository $magazineRepo, KioskNumRepository $numeroRepo): Response
  92. {
  93. $detect = new \Mobile_Detect;
  94. $magazine = $magazineRepo->find($id);
  95. if (!$magazine) {
  96. throw $this->createNotFoundException('Magazine non trouvé');
  97. }
  98. $numeros = $numeroRepo->findBy(['kioskCollec' => $magazine], ['dateParution' => 'DESC', 'num' => 'DESC']);
  99. $pagination = $paginator->paginate(
  100. $numeros,
  101. $request->query->getInt('page', 1),
  102. 20
  103. );
  104. $images = [];
  105. $magazineImage = null;
  106. if ($magazine->getImage()) {
  107. $magazineImage = base64_encode(stream_get_contents($magazine->getImage()));
  108. }
  109. foreach ($pagination->getItems() as $numero) {
  110. if ($numero->getCouverture()) {
  111. $images[$numero->getId()] = base64_encode(stream_get_contents($numero->getCouverture()));
  112. }
  113. }
  114. return $this->render('magazines/detail.html.twig', [
  115. 'magazine' => $magazine,
  116. 'magazineImage' => $magazineImage,
  117. 'pagination' => $pagination,
  118. 'numeros' => $pagination->getItems(),
  119. 'images' => $images,
  120. 'mobile' => $detect->isMobile()
  121. ]);
  122. }
  123. /**
  124. * @Route("/{id}/modifier", name="magazine_edit", requirements={"id"="\d+"})
  125. */
  126. public function editMagazine(int $id, Request $request, KioskCollecRepository $repository): Response
  127. {
  128. $this->denyAccessUnlessGranted('IS_AUTHENTICATED_FULLY');
  129. $magazine = $repository->find($id);
  130. if (!$magazine) {
  131. throw $this->createNotFoundException('Magazine non trouvé');
  132. }
  133. $magazine->setUpdateUser($this->getUser());
  134. $magazine->setUpdateDate(new \DateTime());
  135. $form = $this->createForm(MagazineType::class, $magazine);
  136. $form->handleRequest($request);
  137. if ($form->isSubmitted() && $form->isValid()) {
  138. $imageFile = $form->get('imageFile')->getData();
  139. if ($imageFile) {
  140. $imageData = file_get_contents($imageFile->getPathname());
  141. $magazine->setImage($imageData);
  142. }
  143. $this->em->flush();
  144. $this->addFlash('success', 'Magazine modifié avec succès');
  145. return $this->redirectToRoute('magazine_detail', ['id' => $magazine->getId()]);
  146. }
  147. $currentImage = null;
  148. if ($magazine->getImage()) {
  149. $currentImage = base64_encode(stream_get_contents($magazine->getImage()));
  150. }
  151. return $this->render('magazines/form.html.twig', [
  152. 'form' => $form->createView(),
  153. 'magazine' => $magazine,
  154. 'currentImage' => $currentImage,
  155. 'edit' => true
  156. ]);
  157. }
  158. /**
  159. * @Route("/{id}/numero/nouveau", name="numero_new", requirements={"id"="\d+"})
  160. */
  161. public function newNumero(int $id, Request $request, KioskCollecRepository $magazineRepo): Response
  162. {
  163. $this->denyAccessUnlessGranted('IS_AUTHENTICATED_FULLY');
  164. $magazine = $magazineRepo->find($id);
  165. if (!$magazine) {
  166. throw $this->createNotFoundException('Magazine non trouvé');
  167. }
  168. $user = $this->getUser();
  169. $numero = new KioskNum();
  170. $numero->setKioskCollec($magazine);
  171. $numero->setCreateUser($user);
  172. $numero->setUpdateUser($user);
  173. $numero->setCreateDate(new \DateTime());
  174. $numero->setUpdateDate(new \DateTime());
  175. $form = $this->createForm(NumeroMagazineType::class, $numero);
  176. $form->handleRequest($request);
  177. if ($form->isSubmitted() && $form->isValid()) {
  178. $couvertureFile = $form->get('couvertureFile')->getData();
  179. if ($couvertureFile) {
  180. $imageData = file_get_contents($couvertureFile->getPathname());
  181. $numero->setCouverture($imageData);
  182. }
  183. $this->em->persist($numero);
  184. $magazine->setNbnum($magazine->getNbnum() + 1);
  185. $magazine->setUpdateDate(new \DateTime());
  186. $magazine->setUpdateUser($user);
  187. $this->em->flush();
  188. $this->addFlash('success', 'Numéro ajouté avec succès');
  189. return $this->redirectToRoute('magazine_detail', ['id' => $magazine->getId()]);
  190. }
  191. return $this->render('magazines/numero_form.html.twig', [
  192. 'form' => $form->createView(),
  193. 'magazine' => $magazine,
  194. 'numero' => $numero,
  195. 'edit' => false
  196. ]);
  197. }
  198. /**
  199. * @Route("/{id}/numeros/nouveau", name="numeros_new_multiple", requirements={"id"="\d+"})
  200. */
  201. public function newNumerosMultiple(int $id, Request $request, KioskCollecRepository $magazineRepo, UserRepository $userRepo): Response
  202. {
  203. $this->denyAccessUnlessGranted('IS_AUTHENTICATED_FULLY');
  204. $magazine = $magazineRepo->find($id);
  205. if (!$magazine) {
  206. throw $this->createNotFoundException('Magazine non trouvé');
  207. }
  208. $user = $this->getUser();
  209. $users = $userRepo->findAll();
  210. if ($request->isMethod('POST')) {
  211. $numerosData = $request->request->all();
  212. $files = $request->files->all();
  213. $count = 0;
  214. if (isset($numerosData['numeros']) && is_array($numerosData['numeros'])) {
  215. foreach ($numerosData['numeros'] as $index => $numeroData) {
  216. if (empty($numeroData['num'])) {
  217. continue;
  218. }
  219. $numero = new KioskNum();
  220. $numero->setKioskCollec($magazine);
  221. $numero->setCreateUser($user);
  222. $numero->setUpdateUser($user);
  223. $numero->setCreateDate(new \DateTime());
  224. $numero->setUpdateDate(new \DateTime());
  225. $numero->setNum((int) $numeroData['num']);
  226. if (!empty($numeroData['dateParution'])) {
  227. $numero->setDateParution(new \DateTime($numeroData['dateParution']));
  228. }
  229. if (!empty($numeroData['EAN'])) {
  230. $numero->setEAN($numeroData['EAN']);
  231. }
  232. if (!empty($numeroData['prix'])) {
  233. $numero->setPrix((float) $numeroData['prix']);
  234. }
  235. if (!empty($numeroData['monnaie'])) {
  236. $monnaie = $this->em->getRepository(\App\Entity\Monnaie::class)->find($numeroData['monnaie']);
  237. if ($monnaie) {
  238. $numero->setMonnaie($monnaie);
  239. }
  240. }
  241. if (!empty($numeroData['description'])) {
  242. $numero->setDescription($numeroData['description']);
  243. }
  244. if (!empty($numeroData['commentaire'])) {
  245. $numero->setCommentaire($numeroData['commentaire']);
  246. }
  247. // Gérer l'image de couverture
  248. if (isset($files['numeros'][$index]['image']) && $files['numeros'][$index]['image']) {
  249. $imageFile = $files['numeros'][$index]['image'];
  250. $imageData = file_get_contents($imageFile->getPathname());
  251. $numero->setCouverture($imageData);
  252. }
  253. $this->em->persist($numero);
  254. $this->em->flush(); // Flush pour obtenir l'ID du numéro
  255. // Gérer les propriétaires
  256. if (!empty($numeroData['users']) && is_array($numeroData['users'])) {
  257. foreach ($numeroData['users'] as $userId) {
  258. $proprietaire = $userRepo->find($userId);
  259. if ($proprietaire) {
  260. $lien = new LienKioskNumUser();
  261. $lien->setKioskNum($numero);
  262. $lien->setUser($proprietaire);
  263. $lien->setCommentaire($numeroData['commentaire'] ?? '');
  264. $this->em->persist($lien);
  265. }
  266. }
  267. }
  268. $count++;
  269. }
  270. if ($count > 0) {
  271. $magazine->setNbnum($magazine->getNbnum() + $count);
  272. $magazine->setUpdateDate(new \DateTime());
  273. $magazine->setUpdateUser($user);
  274. $this->em->flush();
  275. $this->addFlash('success', $count . ' numéro(s) ajouté(s) avec succès');
  276. return $this->redirectToRoute('magazine_detail', ['id' => $magazine->getId()]);
  277. }
  278. }
  279. $this->addFlash('warning', 'Aucun numéro valide à ajouter');
  280. }
  281. return $this->render('magazines/numeros_multiple_form.html.twig', [
  282. 'magazine' => $magazine,
  283. 'users' => $users
  284. ]);
  285. }
  286. /**
  287. * @Route("/numero/{id}", name="numero_detail", requirements={"id"="\d+"})
  288. */
  289. public function detailNumero(int $id, KioskNumRepository $repository, LienKioskNumUserRepository $lienRepo): Response
  290. {
  291. $detect = new \Mobile_Detect;
  292. $numero = $repository->find($id);
  293. if (!$numero) {
  294. throw $this->createNotFoundException('Numéro non trouvé');
  295. }
  296. $proprietaires = $lienRepo->findBy(['kioskNum' => $numero]);
  297. $couvertureImage = null;
  298. if ($numero->getCouverture()) {
  299. $couvertureImage = base64_encode(stream_get_contents($numero->getCouverture()));
  300. }
  301. return $this->render('magazines/numero_detail.html.twig', [
  302. 'numero' => $numero,
  303. 'magazine' => $numero->getKioskCollec(),
  304. 'couvertureImage' => $couvertureImage,
  305. 'proprietaires' => $proprietaires,
  306. 'mobile' => $detect->isMobile()
  307. ]);
  308. }
  309. /**
  310. * @Route("/numero/{id}/modifier", name="numero_edit", requirements={"id"="\d+"})
  311. */
  312. public function editNumero(int $id, Request $request, KioskNumRepository $repository): Response
  313. {
  314. $this->denyAccessUnlessGranted('IS_AUTHENTICATED_FULLY');
  315. $numero = $repository->find($id);
  316. if (!$numero) {
  317. throw $this->createNotFoundException('Numéro non trouvé');
  318. }
  319. $numero->setUpdateUser($this->getUser());
  320. $numero->setUpdateDate(new \DateTime());
  321. $form = $this->createForm(NumeroMagazineType::class, $numero);
  322. $form->handleRequest($request);
  323. if ($form->isSubmitted() && $form->isValid()) {
  324. $couvertureFile = $form->get('couvertureFile')->getData();
  325. if ($couvertureFile) {
  326. $imageData = file_get_contents($couvertureFile->getPathname());
  327. $numero->setCouverture($imageData);
  328. }
  329. $this->em->flush();
  330. $this->addFlash('success', 'Numéro modifié avec succès');
  331. return $this->redirectToRoute('numero_detail', ['id' => $numero->getId()]);
  332. }
  333. $currentImage = null;
  334. if ($numero->getCouverture()) {
  335. $currentImage = base64_encode(stream_get_contents($numero->getCouverture()));
  336. }
  337. return $this->render('magazines/numero_form.html.twig', [
  338. 'form' => $form->createView(),
  339. 'magazine' => $numero->getKioskCollec(),
  340. 'numero' => $numero,
  341. 'currentImage' => $currentImage,
  342. 'edit' => true
  343. ]);
  344. }
  345. /**
  346. * @Route("/numero/{id}/proprietaire/ajouter", name="numero_add_owner", requirements={"id"="\d+"})
  347. */
  348. public function addOwner(int $id, Request $request, KioskNumRepository $numeroRepo, UserRepository $userRepo): Response
  349. {
  350. $this->denyAccessUnlessGranted('IS_AUTHENTICATED_FULLY');
  351. $numero = $numeroRepo->find($id);
  352. if (!$numero) {
  353. throw $this->createNotFoundException('Numéro non trouvé');
  354. }
  355. $users = $userRepo->findAll();
  356. if ($request->isMethod('POST')) {
  357. $userIds = $request->request->get('user_ids', []);
  358. $commentaire = $request->request->get('commentaire');
  359. if (empty($userIds)) {
  360. $this->addFlash('warning', 'Veuillez sélectionner au moins un utilisateur');
  361. return $this->render('magazines/add_owner.html.twig', [
  362. 'numero' => $numero,
  363. 'magazine' => $numero->getKioskCollec(),
  364. 'users' => $users
  365. ]);
  366. }
  367. $count = 0;
  368. foreach ($userIds as $userId) {
  369. $user = $userRepo->find($userId);
  370. if ($user) {
  371. // Vérifier si le lien n'existe pas déjà
  372. $existingLien = $this->em->getRepository(LienKioskNumUser::class)
  373. ->findOneBy(['kioskNum' => $numero, 'user' => $user]);
  374. if (!$existingLien) {
  375. $lien = new LienKioskNumUser();
  376. $lien->setKioskNum($numero);
  377. $lien->setUser($user);
  378. $lien->setCommentaire($commentaire);
  379. $this->em->persist($lien);
  380. $count++;
  381. }
  382. }
  383. }
  384. if ($count > 0) {
  385. $this->em->flush();
  386. $this->addFlash('success', $count . ' propriétaire(s) ajouté(s) avec succès');
  387. } else {
  388. $this->addFlash('info', 'Aucun nouveau propriétaire ajouté (déjà existants)');
  389. }
  390. return $this->redirectToRoute('numero_detail', ['id' => $numero->getId()]);
  391. }
  392. return $this->render('magazines/add_owner.html.twig', [
  393. 'numero' => $numero,
  394. 'magazine' => $numero->getKioskCollec(),
  395. 'users' => $users
  396. ]);
  397. }
  398. /**
  399. * @Route("/recherche", name="magazines_search")
  400. */
  401. public function searchMagazines(Request $request, PaginatorInterface $paginator, KioskCollecRepository $magazineRepo, KioskNumRepository $numeroRepo): Response
  402. {
  403. $detect = new \Mobile_Detect;
  404. $search = $request->query->get('q', '');
  405. $type = $request->query->get('type', 'magazine');
  406. $results = [];
  407. $images = [];
  408. if (!empty($search)) {
  409. if ($type === 'magazine') {
  410. $results = $magazineRepo->searchByName($search);
  411. foreach ($results as $magazine) {
  412. if ($magazine->getImage()) {
  413. $images[$magazine->getId()] = base64_encode(stream_get_contents($magazine->getImage()));
  414. }
  415. }
  416. } else {
  417. $results = $numeroRepo->searchByMagazineOrNum($search);
  418. foreach ($results as $numero) {
  419. if ($numero->getCouverture()) {
  420. $images[$numero->getId()] = base64_encode(stream_get_contents($numero->getCouverture()));
  421. }
  422. }
  423. }
  424. }
  425. $pagination = $paginator->paginate(
  426. $results,
  427. $request->query->getInt('page', 1),
  428. 20
  429. );
  430. return $this->render('magazines/search.html.twig', [
  431. 'pagination' => $pagination,
  432. 'results' => $pagination->getItems(),
  433. 'images' => $images,
  434. 'search' => $search,
  435. 'type' => $type,
  436. 'mobile' => $detect->isMobile()
  437. ]);
  438. }
  439. }