<?php
namespace App\Controller;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\HttpFoundation\JsonResponse;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\Routing\Annotation\Route;
use Doctrine\ORM\EntityManagerInterface;
use App\Repository\ProductRepository;
use App\Repository\ProductCategoryRepository;
use App\Repository\FavoriteProductRepository;
use App\Entity\FavoriteProduct;
use App\Entity\Product;
use App\Entity\ProductTracabilite;
use App\Repository\ProductTracabiliteRepository;
use Exception;
use App\Service\FileHandler;
use Symfony\Component\HttpFoundation\BinaryFileResponse;
use Symfony\Component\HttpFoundation\ResponseHeaderBag;
#[Route('/boutique')]
class ProductController extends AbstractController
{
private $entityManager;
private $productRepository;
private $productCategoryRepository;
private $favoriteProductRepository;
private $fileHandler;
public function __construct(EntityManagerInterface $entityManager,
ProductRepository $productRepository,
ProductCategoryRepository $productCategoryRepository,
FavoriteProductRepository $favoriteProductRepository,
FileHandler $fileHandler)
{
$this->entityManager = $entityManager;
$this->productRepository = $productRepository;
$this->productCategoryRepository = $productCategoryRepository;
$this->favoriteProductRepository = $favoriteProductRepository;
$this->fileHandler = $fileHandler;
}
#[Route('/{slugCatProduct}/{slugProduct}/{id}', name: 'app_product_details')]
public function details($id, ProductTracabiliteRepository $productTracabiliteRepository): Response
{
$product = $this->productRepository->find($id);
$propositions = $this->productRepository->findPropositionsProduit($id);
$product->setTracabilites($productTracabiliteRepository->findTracabilitesByProduct($product));
return $this->render('product/product_details.html.twig', [
'controller_name' => 'ProductController',
'product' => $product,
'propositions' => $propositions
]);
}
#[Route('/favorite/toggle', name: 'app_product_favorite_toggle', methods:"POST")]
public function toggleFavorite(Request $request): JsonResponse
{
try{
$data = json_decode( $request->getContent(), true);
$productId = $data['productId'];
$product = $this->productRepository->find($productId);
$user = $this->getUser();
if($user==null) throw new Exception("Vous n'êtes pas encore connecté.");
$newFavProduct = new FavoriteProduct();
$newFavProduct->setUser($user);
$newFavProduct->setProduct($product);
$oldFavProduct = $this->favoriteProductRepository->findOneBy(['user'=>$user, 'product'=>$product]);
if($oldFavProduct == null){
$this->entityManager->persist($newFavProduct);
$this->addFlash('success', $product->getName().' ajouté aux favoris.');
}
else{
$this->entityManager->remove($oldFavProduct);
$this->addFlash('success', $product->getName().' retiré des favoris.');
}
$this->entityManager->flush();
return new JsonResponse(array('message' => $productId));
} catch(\Exception $ex){
return new JsonResponse(array('message' => $ex->getMessage()), 500);
}
}
#[Route('/tracabilite/{id}', name: 'app_product_tracabilite_download')]
public function tracabilite(ProductTracabilite $productTracabilite): Response
{
$response = new BinaryFileResponse($this->getParameter('files_directory_relative')."/".$productTracabilite->getFichier());
$response->headers->set('Content-Type', 'appication/pdf');
$response->setContentDisposition(
ResponseHeaderBag::DISPOSITION_INLINE,
'tracabilite-'.$productTracabilite->getId().'.pdf'
);
return $response;
}
}