src/Controller/ProductController.php line 53

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\Repository\FavoriteProductRepository;
  12. use App\Entity\FavoriteProduct;
  13. use App\Entity\Product;
  14. use App\Entity\ProductTracabilite;
  15. use App\Repository\ProductTracabiliteRepository;
  16. use Exception;
  17. use App\Service\FileHandler;
  18. use Symfony\Component\HttpFoundation\BinaryFileResponse;
  19. use Symfony\Component\HttpFoundation\ResponseHeaderBag;
  20. #[Route('/boutique')]
  21. class ProductController extends AbstractController
  22. {
  23. private $entityManager;
  24. private $productRepository;
  25. private $productCategoryRepository;
  26. private $favoriteProductRepository;
  27. private $fileHandler;
  28. public function __construct(EntityManagerInterface $entityManager,
  29. ProductRepository $productRepository,
  30. ProductCategoryRepository $productCategoryRepository,
  31. FavoriteProductRepository $favoriteProductRepository,
  32. FileHandler $fileHandler)
  33. {
  34. $this->entityManager = $entityManager;
  35. $this->productRepository = $productRepository;
  36. $this->productCategoryRepository = $productCategoryRepository;
  37. $this->favoriteProductRepository = $favoriteProductRepository;
  38. $this->fileHandler = $fileHandler;
  39. }
  40. #[Route('/{slugCatProduct}/{slugProduct}/{id}', name: 'app_product_details')]
  41. public function details($id, ProductTracabiliteRepository $productTracabiliteRepository): Response
  42. {
  43. $product = $this->productRepository->find($id);
  44. $propositions = $this->productRepository->findPropositionsProduit($id);
  45. $product->setTracabilites($productTracabiliteRepository->findTracabilitesByProduct($product));
  46. return $this->render('product/product_details.html.twig', [
  47. 'controller_name' => 'ProductController',
  48. 'product' => $product,
  49. 'propositions' => $propositions
  50. ]);
  51. }
  52. #[Route('/favorite/toggle', name: 'app_product_favorite_toggle', methods:"POST")]
  53. public function toggleFavorite(Request $request): JsonResponse
  54. {
  55. try{
  56. $data = json_decode( $request->getContent(), true);
  57. $productId = $data['productId'];
  58. $product = $this->productRepository->find($productId);
  59. $user = $this->getUser();
  60. if($user==null) throw new Exception("Vous n'êtes pas encore connecté.");
  61. $newFavProduct = new FavoriteProduct();
  62. $newFavProduct->setUser($user);
  63. $newFavProduct->setProduct($product);
  64. $oldFavProduct = $this->favoriteProductRepository->findOneBy(['user'=>$user, 'product'=>$product]);
  65. if($oldFavProduct == null){
  66. $this->entityManager->persist($newFavProduct);
  67. $this->addFlash('success', $product->getName().' ajouté aux favoris.');
  68. }
  69. else{
  70. $this->entityManager->remove($oldFavProduct);
  71. $this->addFlash('success', $product->getName().' retiré des favoris.');
  72. }
  73. $this->entityManager->flush();
  74. return new JsonResponse(array('message' => $productId));
  75. } catch(\Exception $ex){
  76. return new JsonResponse(array('message' => $ex->getMessage()), 500);
  77. }
  78. }
  79. #[Route('/tracabilite/{id}', name: 'app_product_tracabilite_download')]
  80. public function tracabilite(ProductTracabilite $productTracabilite): Response
  81. {
  82. $response = new BinaryFileResponse($this->getParameter('files_directory_relative')."/".$productTracabilite->getFichier());
  83. $response->headers->set('Content-Type', 'appication/pdf');
  84. $response->setContentDisposition(
  85. ResponseHeaderBag::DISPOSITION_INLINE,
  86. 'tracabilite-'.$productTracabilite->getId().'.pdf'
  87. );
  88. return $response;
  89. }
  90. }