src/Controller/CartController.php line 121

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