src/Controller/CartController.php line 83

Open in your IDE?
  1. <?php
  2. namespace App\Controller;
  3. use App\Classes\Cart;
  4. use App\Entity\Category;
  5. use App\Entity\Product;
  6. use App\Entity\ProductWishlist;
  7. use App\Entity\Wishlist;
  8. use App\Entity\ShoppingCart;
  9. use Doctrine\ORM\EntityManagerInterface;
  10. use Symfony\Component\HttpFoundation\JsonResponse;
  11. use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
  12. use Symfony\Component\HttpFoundation\Response;
  13. use Symfony\Component\Routing\Annotation\Route;
  14. use Symfony\Component\Security\Core\Security;
  15. use Symfony\Component\HttpFoundation\Request;
  16. use Symfony\Component\HttpFoundation\Session\SessionInterface;
  17. use App\Service\CartService;
  18. use Symfony\Component\HttpFoundation\Session\Session;
  19. use Doctrine\ORM\Query\QueryException;
  20. use App\Repository\WishlistRepository;
  21. use DateTime;
  22. class CartController extends AbstractController
  23. {
  24. private $entityManager;
  25. private $cartService;
  26. private $session;
  27. public function __construct(EntityManagerInterface $entityManager, CartService $cartService){
  28. $this->entityManager = $entityManager;
  29. $this->cartService = $cartService;
  30. }
  31. // Nombre de produits dans le panier
  32. public function getCartItemCount()
  33. {
  34. $this->session = new Session();
  35. $cart = $this->session->get('cart', []);
  36. // Utilisez la fonction count() pour obtenir le nombre d'articles distincts
  37. $cartItemCount = count($cart);
  38. return $cartItemCount;
  39. }
  40. // Récupérer le nombre d'articles dans le panier pour l'afficher
  41. public function addTotalCart(): Response
  42. {
  43. $cartItemCount = $this->cartService->getCartItemCount();
  44. return $this->render('base.html.twig', [
  45. 'cartItemCount' => $cartItemCount,
  46. ]);
  47. }
  48. // Nombre de listes de souhaits
  49. public function getWishlistItemCount()
  50. {
  51. $this->session = new Session();
  52. $wishlist = $this->session->get('wishlist', []);
  53. // Utilisez la fonction count() pour obtenir le nombre d'articles distincts dans la liste de souhaits
  54. $wishlistItemCount = count($wishlist);
  55. return $wishlistItemCount;
  56. }
  57. // Récupérer le nombre de listes de souhaits pour l'affichage
  58. public function addTotalWishlist(): Response
  59. {
  60. $wishlistItemCount = $this->cartService->getWishlistItemCount();
  61. return $this->render('base.html.twig', [
  62. 'wishlistItemCount' => $wishlistItemCount,
  63. ]);
  64. }
  65. /**
  66. * @Route("/mon-panier", name="cart")
  67. */
  68. public function index(Cart $cart, Security $security, EntityManagerInterface $entityManager, SessionInterface $session)
  69. {
  70. $cartData = [];
  71. // Vérifier si l'utilisateur est connecté
  72. if ($security->isGranted('IS_AUTHENTICATED_FULLY')) {
  73. // L'utilisateur est connecté
  74. $shoppingCart = new ShoppingCart($entityManager, $security);
  75. // Appelez la méthode getFull() pour récupérer le panier de l'utilisateur
  76. $cartItems = $shoppingCart->getFull();
  77. // Parcourez les éléments du panier
  78. foreach ($cartItems as $cartItem) {
  79. // Accédez aux données du produit et de la quantité dans chaque élément du panier
  80. $productData = $cartItem['product'];
  81. $quantity = $cartItem['quantity'];
  82. $cartData[] = [
  83. 'product' => $productData,
  84. 'quantity' => $quantity
  85. ];
  86. }
  87. } else {
  88. // L'utilisateur n'est pas connecté
  89. $cartData = $cart->getFull();
  90. // Récupérer le nombre d'articles dans le panier local à partir de la variable de session
  91. $cartItemCount = count($cart->getFull());
  92. }
  93. return $this->render('cart/index.html.twig', [
  94. 'cart' => $cartData,
  95. ]);
  96. }
  97. /**
  98. * @Route("/cart/add/{id}", name="add_to_cart")
  99. */
  100. public function add(Cart $cart, $id, Request $request, SessionInterface $session)
  101. {
  102. $cart->add($id);
  103. $page = $request->query->get('page');
  104. if($page == 'products'){
  105. // Récupérer les informations de l'article ajouté depuis la source de données en utilisant l'id
  106. $entityManager = $this->getDoctrine()->getManager();
  107. $product = $entityManager->getRepository(Product::class)->find($id);
  108. // Récupérer les articles similaires depuis la source de données
  109. $category = $product->getCategory();
  110. $similarProducts = $entityManager->getRepository(Product::class)->findByCategory($category);
  111. // Mise à jour du nombre d'articles dans le panier
  112. $cartItemCount = $this->getCartItemCount();
  113. $session->set('cartItemCount', $cartItemCount);
  114. // Créer une page de confirmation avec les informations de l'article et les articles similaires
  115. return $this->render('confirmation.html.twig', [
  116. 'product' => $product,
  117. 'similarProducts' => $similarProducts,
  118. 'cart' => $cart,
  119. ]);
  120. } else{
  121. return $this->redirectToRoute('cart');
  122. }
  123. }
  124. // Gestion des listes de souhaits
  125. // Ajouter un produit à une liste de souhaits
  126. // Retourner la page de confirmation avant l'ajout du produit
  127. /**
  128. * @Route("/wishlist/add/{id}", name="add_to_wishlist")
  129. */
  130. public function addToWishlist($id, Security $security, SessionInterface $session, WishlistRepository $wishlistRepository){
  131. if ($security->isGranted('IS_AUTHENTICATED_FULLY')) {
  132. // Récupérer les informations de l'article ajouté depuis la source de données en utilisant l'id
  133. $entityManager = $this->getDoctrine()->getManager();
  134. $product = $entityManager->getRepository(Product::class)->find($id);
  135. // Ajoutez le produit à la liste de souhaits
  136. $wishlist = $session->get('wishlist', []); // Récupère la liste de souhaits existante ou un tableau vide s'il n'existe pas
  137. // Ajoutez le produit à la liste de souhaits en utilisant l'id du produit comme clé du tableau
  138. $wishlist[$id] = true;
  139. // Mettez à jour la variable de session 'wishlist' avec la nouvelle liste de souhaits
  140. $session->set('wishlist', $wishlist);
  141. // Pour afficher le select des listes de souhait
  142. // Récupérer les wishlists de l'utilisateur
  143. $user = $this->getUser();
  144. $userId = $user->getId();
  145. $wishlists = $wishlistRepository->findBy(['user' => $user]);
  146. // Créer une page de confirmation avec les informations de l'article et les articles similaires
  147. return $this->render('wishlist/wishlist.html.twig', [
  148. 'product' => $product,
  149. 'wishlists' => $wishlists,
  150. ]);
  151. } else {
  152. // Si l'utilisateur veut ajouter un produit à la liste de souhait, il doit être connecté
  153. return $this->redirectToRoute('app_login');
  154. }
  155. }
  156. // Ajouter le produit à la liste de souhaits choisies
  157. /**
  158. * @Route("/wishlist/add/article/{wishlistId}/{productId}", name="add_to_selected_wishlist")
  159. */
  160. public function addArticleToSelectedWishlist($wishlistId, $productId, Security $security, SessionInterface $session)
  161. {
  162. if ($security->isGranted('IS_AUTHENTICATED_FULLY')) {
  163. // Récupérer l'utilisateur actuellement connecté
  164. $user = $security->getUser();
  165. // Créer une nouvelle instance de l'entité ProductWishlist
  166. $productWishlist = new ProductWishlist();
  167. $entityManager = $this->getDoctrine()->getManager();
  168. // Associer le produit et la liste de souhaits à cette instance
  169. $product = $entityManager->getRepository(Product::class)->find($productId);
  170. $wishlist = $entityManager->getRepository(Wishlist::class)->find($wishlistId);
  171. $productWishlist->setProduct($product);
  172. $productWishlist->setWishlist($wishlist);
  173. // Définir les horodatages created_at et updated_at pour l'instance
  174. $now = new DateTime();
  175. $productWishlist->setCreatedAt($now);
  176. $productWishlist->setUpdatedAt($now);
  177. // Persistez l'instance en l'ajoutant à l'EntityManager et en effectuant un flush pour enregistrer les modifications dans la base de données
  178. $entityManager->persist($productWishlist);
  179. $entityManager->flush();
  180. // Return a success JSON response
  181. return new JsonResponse(['success' => true, 'message' => 'Le produit à été ajouté à la liste de souhait']);
  182. } else {
  183. // Si l'utilisateur veut ajouter un produit à la liste de souhait, il doit être connecté
  184. return $this->redirectToRoute('app_login');
  185. }
  186. }
  187. // Créer une liste de souhaits
  188. /**
  189. * @Route("/record-wishlist", name="record_wishlist", methods={"POST"})
  190. */
  191. public function recordWishlist(Request $request, EntityManagerInterface $entityManager, Security $security)
  192. {
  193. $name = $request->request->get('name');
  194. $wishlist = new Wishlist();
  195. $wishlist->setName($name);
  196. $now = new DateTime();
  197. $wishlist->setCreatedAt($now);
  198. $wishlist->setUpdatedAt($now);
  199. // Récupérer l'utilisateur connecté (vous devez implémenter la gestion de l'authentification pour cela)
  200. $user = $this->getUser();
  201. $wishlist->setUser($user);
  202. $entityManager->persist($wishlist);
  203. $entityManager->flush();
  204. // Récupérer l'id de la wishlist qui vient d'être enregistrée
  205. $wishlistId = $wishlist->getId();
  206. $productId = $request->request->get('product_id');
  207. if ($productId != null) {
  208. $product = $entityManager->getRepository(Product::class)->find($productId);
  209. if ($product) {
  210. if ($security->isGranted('IS_AUTHENTICATED_FULLY')) {
  211. // Récupérer l'utilisateur actuellement connecté
  212. $user = $security->getUser();
  213. // Créer une nouvelle instance de l'entité ProductWishlist
  214. $productWishlist = new ProductWishlist();
  215. $entityManager = $this->getDoctrine()->getManager();
  216. // Associer le produit et la liste de souhaits à cette instance
  217. $product = $entityManager->getRepository(Product::class)->find($productId);
  218. $wishlist = $entityManager->getRepository(Wishlist::class)->find($wishlistId);
  219. $productWishlist->setProduct($product);
  220. $productWishlist->setWishlist($wishlist);
  221. // Définir les horodatages created_at et updated_at pour l'instance
  222. $now = new DateTime();
  223. $productWishlist->setCreatedAt($now);
  224. $productWishlist->setUpdatedAt($now);
  225. // Persistez l'instance en l'ajoutant à l'EntityManager et en effectuant un flush pour enregistrer les modifications dans la base de données
  226. $entityManager->persist($productWishlist);
  227. $entityManager->flush();
  228. } else {
  229. // Si l'utilisateur veut ajouter un produit à la liste de souhait, il doit être connecté
  230. return $this->redirectToRoute('app_login');
  231. }
  232. }
  233. }
  234. return $this->redirectToRoute('wishlists');
  235. }
  236. // Afficher les listes de souhait de l'utilisateur
  237. /**
  238. * @Route("/wishlists", name="wishlists")
  239. */
  240. public function getWishlists(Security $security)
  241. {
  242. if ($security->isGranted('IS_AUTHENTICATED_FULLY')) {
  243. // Récupérer les wishlists de l'utilisateur
  244. // Récupérer l'utilisateur connecté
  245. $user = $this->getUser();
  246. // Récupérer l'identifiant de l'utilisateur
  247. $userId = $user->getId();
  248. // Récupérer les wishlists de l'utilisateur
  249. $wishlists = $this->getDoctrine()->getRepository(Wishlist::class)->findBy([
  250. 'user' => $user,
  251. ]);
  252. // Créer une page de confirmation avec les informations des wishlists
  253. return $this->render('wishlist/listwishlists.html.twig', [
  254. 'wishlists' => $wishlists,
  255. ]);
  256. } else {
  257. // Si l'utilisateur veut ajouter un produit à la liste de souhait, il doit être connecté
  258. return $this->redirectToRoute('app_login');
  259. }
  260. }
  261. /**
  262. * @Route("/refreshWishlist", name="refreshWishlist")
  263. */
  264. public function refreshWishlist(Security $security)
  265. {
  266. if ($security->isGranted('IS_AUTHENTICATED_FULLY')) {
  267. // Récupérer les wishlists de l'utilisateur
  268. // Récupérer l'utilisateur connecté
  269. $user = $this->getUser();
  270. // Récupérer l'identifiant de l'utilisateur
  271. $userId = $user->getId();
  272. // Récupérer les wishlists de l'utilisateur
  273. $wishlists = $this->getDoctrine()->getRepository(Wishlist::class)->findBy([
  274. 'user' => $user,
  275. ]);
  276. // Créer un tableau contenant les données des wishlists
  277. $wishlistData = [];
  278. foreach ($wishlists as $wishlist) {
  279. $wishlistData[] = [
  280. 'id' => $wishlist->getId(),
  281. 'name' => $wishlist->getName(),
  282. ];
  283. }
  284. // Retourner la réponse JSON avec les données des wishlists
  285. return new JsonResponse($wishlistData);
  286. } else {
  287. // Si l'utilisateur veut ajouter un produit à la liste de souhait, il doit être connecté
  288. return $this->redirectToRoute('app_login');
  289. }
  290. }
  291. // Afficher les informations d'une liste de souhaits
  292. /**
  293. * @Route("/wishlist_infos", name="wishlist_infos")
  294. */
  295. public function wishlistInfos(Request $request, EntityManagerInterface $entityManager): JsonResponse
  296. {
  297. $userId = $this->getUser()->getId();
  298. $wishlistId = $request->get('wishlistId');
  299. $queryBuilder = $entityManager->createQueryBuilder()
  300. ->select('w.name AS wishlistName', 'w.created_at AS wishlistCreatedAt', 'p.id AS productId','p.name AS productName', 'p.price AS productPrice', 'p.description AS productDescription', 'p.illustration AS productIllustration', 'c.name AS categoryName')
  301. ->from('App\Entity\Wishlist', 'w')
  302. ->leftJoin('w.productWishlist', 'pw')
  303. ->leftJoin('pw.product', 'p')
  304. ->leftJoin('p.category', 'c')
  305. ->where('w.id = :wishlistId')
  306. ->andWhere('w.user = :userId')
  307. ->setParameter('wishlistId', $wishlistId)
  308. ->setParameter('userId', $userId);
  309. try {
  310. $results = $queryBuilder->getQuery()->getArrayResult();
  311. } catch (\Exception $e) {
  312. return new JsonResponse(['error' => $e->getMessage()], 500);
  313. }
  314. // Construire le tableau d'informations
  315. $data = [];
  316. foreach ($results as $result) {
  317. $wishlistName = $result['wishlistName'] ?? null;
  318. $productId = $result['productId'] ?? null;
  319. $productName = $result['productName'] ?? null;
  320. $price = $result['productPrice'] ?? null; // Update key to 'productPrice'
  321. $description = $result['productDescription'] ?? null; // Update key to 'productDescription'
  322. $illustration = $result['productIllustration'] ?? null; // Update key to 'productIllustration'
  323. $categoryName = $result['categoryName'] ?? null;
  324. $data[] = [
  325. 'wishlistName' => $wishlistName,
  326. 'productId' => $productId,
  327. 'productName' => $productName,
  328. 'productPrice' => $price,
  329. 'productDescription' => $description,
  330. 'productImage' => $illustration,
  331. 'categoryName' => $categoryName,
  332. ];
  333. }
  334. return new JsonResponse($data);
  335. }
  336. // Supprimer une liste de souhaits
  337. /**
  338. * @Route("/wishlist/delete", name="delete_wishlist")
  339. */
  340. public function deleteWishlist(EntityManagerInterface $entityManager, Security $security, Request $request)
  341. {
  342. if ($security->isGranted('IS_AUTHENTICATED_FULLY')) {
  343. $wishlistId = $request->get('wishlistId');
  344. $wishlistName = $request->get('wishlistName');
  345. $wishlist = $entityManager->getRepository(Wishlist::class)->find($wishlistId);
  346. $wishlistItemCount = $this->cartService->getWishlistItemCount();
  347. if ($wishlist) {
  348. // Récupérer le nom de la liste de souhait
  349. $wishlistName = $wishlist->getName();
  350. // Supprimer les produits associés à la liste de souhaits
  351. $productWishlistQuery = $entityManager->createQuery('DELETE FROM App\Entity\ProductWishlist pw WHERE pw.wishlist = :wishlistId');
  352. $productWishlistQuery->setParameter('wishlistId', $wishlistId);
  353. $productWishlistQuery->execute();
  354. $entityManager->remove($wishlist);
  355. $entityManager->flush();
  356. // Message de confirmation avec le nom de la liste de souhait supprimée
  357. $message = "La liste de souhait '$wishlistName' a été supprimée avec succès.";
  358. // Récupérer le nombre de listes de souhaits après la suppression
  359. $wishlistItemCount = $this->cartService->getWishlistItemCount();
  360. return new JsonResponse(['message' => $message, 'wishlistItemCount' => $wishlistItemCount]);
  361. } else {
  362. // Wishlist non trouvé, gestion de l'erreur
  363. $errorMessage = "La liste de souhait n'a pas été trouvée.";
  364. return new JsonResponse(['error' => $errorMessage], 404);
  365. }
  366. } else {
  367. // Si l'utilisateur veut ajouter un produit à la liste de souhait, il doit être connecté
  368. return $this->redirectToRoute('app_login');
  369. }
  370. }
  371. // Supprimer une article de la liste de souhaits
  372. /**
  373. * @Route("/wishlist/delete_product", name="delete_product", methods={"POST"})
  374. */
  375. public function deleteProductWishlist(EntityManagerInterface $entityManager, Security $security, Request $request)
  376. {
  377. // Vérifiez si l'utilisateur est entièrement authentifié
  378. if ($security->isGranted('IS_AUTHENTICATED_FULLY')) {
  379. // Récupérer l'ID du produit à supprimer depuis les données de la requête
  380. $productId = $request->request->get('productId');
  381. $wishlistId = $request->request->get('wishlistId');
  382. try {
  383. // Trouver l'entité ProductWishlist par ses IDs (productId et wishlistId)
  384. $productWishlist = $entityManager->getRepository(ProductWishlist::class)->findOneBy([
  385. 'product' => $productId,
  386. 'wishlist' => $wishlistId,
  387. ]);
  388. if ($productWishlist) {
  389. // Supprimer l'entité ProductWishlist
  390. $entityManager->remove($productWishlist);
  391. $entityManager->flush();
  392. return new JsonResponse(['success' => true, 'message' => 'Le produit a été supprimé de la liste de souhaits']);
  393. } else {
  394. return new JsonResponse(['success' => false, 'message' => 'Le produit n\'a pas été trouvé'], 404);
  395. }
  396. } catch (\Exception $e) {
  397. // En cas d'erreur lors de la suppression, renvoyer une réponse d'erreur
  398. return new JsonResponse(['success' => false, 'message' => 'Failed to remove product from wishlist: ' . $e->getMessage()], 500);
  399. }
  400. } else {
  401. return new JsonResponse(['success' => false, 'message' => 'User not authenticated'], 401);
  402. }
  403. }
  404. /**
  405. * @Route("/cart/delete/{id}", name="delete_to_cart")
  406. */
  407. public function delete(Cart $cart, $id, Security $security, SessionInterface $session)
  408. {
  409. $cart->delete($id);
  410. // Mise à jour du nombre d'articles dans le panier
  411. $cartItemCount = $this->getCartItemCount();
  412. $session->set('cartItemCount', $cartItemCount);
  413. return $this->redirectToRoute('cart');
  414. }
  415. /**
  416. * @Route("/cart/decrease/{id}", name="decrease_to_cart")
  417. */
  418. public function decrease(Cart $cart, EntityManagerInterface $entityManager, $id)
  419. {
  420. $product = $entityManager->getRepository(Product::class)->find($id);
  421. if (!$product) {
  422. throw $this->createNotFoundException('Product not found.');
  423. }
  424. // Mettre à jour la quantité du produit dans le panier
  425. $cart->decrease($id);
  426. // Enregistrer les modifications en base de données
  427. $entityManager->flush();
  428. return $this->redirectToRoute('cart');
  429. }
  430. }