src/Controller/CartController.php line 56

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\HttpFoundation\JsonResponse;
  6. use Symfony\Component\HttpFoundation\Request;
  7. use Symfony\Component\Routing\Annotation\Route;
  8. use Doctrine\ORM\EntityManagerInterface;
  9. use App\Repository\ProductRepository;
  10. use App\Repository\ProductCategoryRepository;
  11. use App\Service\FileHandler;
  12. use App\Service\BasketService;
  13. use App\Service\OrderService;
  14. use App\Entity\BasketItem;
  15. use App\Entity\Product;
  16. use App\Service\ConfigService;
  17. use Exception;
  18. use Symfony\Contracts\Translation\TranslatorInterface;
  19. #[Route('/cart')]
  20. class CartController extends AbstractController
  21. {
  22. private $entityManager;
  23. private $productRepository;
  24. private $productCategoryRepository;
  25. private $fileHandler;
  26. private $basketService;
  27. private $orderService;
  28. private $translator;
  29. public function __construct(EntityManagerInterface $entityManager,
  30. ProductRepository $productRepository,
  31. ProductCategoryRepository $productCategoryRepository,
  32. BasketService $basketService,
  33. OrderService $orderService,
  34. FileHandler $fileHandler,
  35. TranslatorInterface $translator
  36. )
  37. {
  38. $this->entityManager = $entityManager;
  39. $this->productRepository = $productRepository;
  40. $this->productCategoryRepository = $productCategoryRepository;
  41. $this->basketService = $basketService;
  42. $this->orderService = $orderService;
  43. $this->fileHandler = $fileHandler;
  44. $this->translator = $translator;
  45. }
  46. #[Route('/', name: 'app_cart_index')]
  47. public function index(): Response
  48. {
  49. $error = null;
  50. $basket = $this->basketService->getBasket();
  51. $totalCost = $this->basketService->getTotalCostWithBasket($basket);
  52. $totalCostWithTVA = $this->basketService->getTotalCostAndTVAWithBasket($basket);
  53. $propositions = $this->productRepository->findPropositionsProduit();
  54. return $this->render('cart/cart_index.html.twig', [
  55. 'basket' => $basket,
  56. 'error' => $error,
  57. 'totalCost' => $totalCost,
  58. 'totalCostWithTVA' => $totalCostWithTVA,
  59. 'propositions' => $propositions,
  60. 'parrain' => $this->orderService->getParrain(),
  61. ]);
  62. }
  63. #[Route('/add', name: 'app_cart_add', methods:"POST")]
  64. public function add(Request $request): Response
  65. {
  66. try{
  67. $productId = $request->get('product_id', '-1');
  68. $quantity = $request->get('quantity', 0);
  69. $product = $this->productRepository->find($productId);
  70. if($product == null) throw new \Exception("Le produit n'existe pas.");
  71. $basketItem = new BasketItem($product, $quantity);
  72. $this->basketService->add($basketItem);
  73. $cartUrl = $this->generateUrl('app_cart_index');
  74. $message = $quantity.' '.$product->getName(). ' '.$this->translator->trans('ajouté(s) au panier').'. <a href="'.$cartUrl.'">Cliquer ici pour voir le panier.</a>';
  75. $this->addFlash('success', $message);
  76. return $this->redirectToRoute('app_shop_index');
  77. } catch(\Exception $ex){
  78. if ($ex->getCode() === Product::EXCEPTION_CODE['INSUFFICIENT_STOCK']) {
  79. $this->addFlash('danger', 'Stock insuffisant pour le produit “'. $product->getName().'“');
  80. return $this->redirectToRoute('app_shop_index');
  81. }
  82. throw $ex;
  83. }
  84. }
  85. #[Route('/update', name: 'app_cart_update', methods:"PUT")]
  86. public function update(Request $request): JsonResponse
  87. {
  88. try{
  89. $basketItems = json_decode( $request->getContent(), true);
  90. for($i=0; $i<count($basketItems);$i++){
  91. $productId = $basketItems[$i]['productId'];
  92. $quantity = $basketItems[$i]['quantity'];
  93. $product = $this->productRepository->find($productId);
  94. $basketItem = new BasketItem($product, $quantity);
  95. $this->basketService->update($productId, $basketItem);
  96. }
  97. $this->addFlash('success', $this->translator->trans('Votre panier a été mis à jour').'.');
  98. return new JsonResponse(array('basket' => $this->basketService->getBasket()));
  99. } catch(\Exception $ex){
  100. return new JsonResponse(array('message' => $ex->getMessage()), 500);
  101. }
  102. }
  103. #[Route('/updateOne', name: 'app_cart_update_one', methods:"PUT")]
  104. public function updateOne(Request $request): JsonResponse
  105. {
  106. try{
  107. $data = json_decode( $request->getContent(), true);
  108. $productId = $data['productId'];
  109. $quantity = $data['quantity'];
  110. $product = $this->productRepository->find($productId);
  111. $basketItem = new BasketItem($product, $quantity);
  112. $this->basketService->update($productId, $basketItem);
  113. $this->addFlash('success', $quantity.' '.$product->getName().' '.$this->translator->trans('au panier').'.');
  114. return new JsonResponse(array('basket' => $this->basketService->getBasket()));
  115. } catch(\Exception $ex){
  116. return new JsonResponse(array('message' => $ex->getMessage()), 500);
  117. }
  118. }
  119. #[Route('/remove/{productId}', name: 'app_cart_remove', methods:"DELETE")]
  120. public function remove(Request $request, $productId): JsonResponse
  121. {
  122. try{
  123. $product = $this->productRepository->find($productId);
  124. $this->basketService->remove($productId);
  125. $this->addFlash('success', $product->getName().' '.$this->translator->trans('a été supprimé du panier').'.');
  126. return new JsonResponse(array('basket' => $this->basketService->getBasket()));
  127. } catch(\Exception $ex){
  128. return new JsonResponse(array('message' => $ex->getMessage()), 500);
  129. }
  130. }
  131. }