<?php
namespace App\Controller;
use App\Classes\Cart;
use App\Entity\Category;
use App\Entity\Product;
use App\Entity\ProductWishlist;
use App\Entity\Wishlist;
use App\Entity\ShoppingCart;
use Doctrine\ORM\EntityManagerInterface;
use Symfony\Component\HttpFoundation\JsonResponse;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Annotation\Route;
use Symfony\Component\Security\Core\Security;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Session\SessionInterface;
use App\Service\CartService;
use Symfony\Component\HttpFoundation\Session\Session;
use Doctrine\ORM\Query\QueryException;
use App\Repository\WishlistRepository;
use DateTime;
class CartController extends AbstractController
{
private $entityManager;
private $cartService;
private $session;
public function __construct(EntityManagerInterface $entityManager, CartService $cartService){
$this->entityManager = $entityManager;
$this->cartService = $cartService;
}
// Nombre de produits dans le panier
public function getCartItemCount()
{
$this->session = new Session();
$cart = $this->session->get('cart', []);
// Utilisez la fonction count() pour obtenir le nombre d'articles distincts
$cartItemCount = count($cart);
return $cartItemCount;
}
// Récupérer le nombre d'articles dans le panier pour l'afficher
public function addTotalCart(): Response
{
$cartItemCount = $this->cartService->getCartItemCount();
return $this->render('base.html.twig', [
'cartItemCount' => $cartItemCount,
]);
}
// Nombre de listes de souhaits
public function getWishlistItemCount()
{
$this->session = new Session();
$wishlist = $this->session->get('wishlist', []);
// Utilisez la fonction count() pour obtenir le nombre d'articles distincts dans la liste de souhaits
$wishlistItemCount = count($wishlist);
return $wishlistItemCount;
}
// Récupérer le nombre de listes de souhaits pour l'affichage
public function addTotalWishlist(): Response
{
$wishlistItemCount = $this->cartService->getWishlistItemCount();
return $this->render('base.html.twig', [
'wishlistItemCount' => $wishlistItemCount,
]);
}
/**
* @Route("/mon-panier", name="cart")
*/
public function index(Cart $cart, Security $security, EntityManagerInterface $entityManager, SessionInterface $session)
{
$cartData = [];
// Vérifier si l'utilisateur est connecté
if ($security->isGranted('IS_AUTHENTICATED_FULLY')) {
// L'utilisateur est connecté
$shoppingCart = new ShoppingCart($entityManager, $security);
// Appelez la méthode getFull() pour récupérer le panier de l'utilisateur
$cartItems = $shoppingCart->getFull();
// Parcourez les éléments du panier
foreach ($cartItems as $cartItem) {
// Accédez aux données du produit et de la quantité dans chaque élément du panier
$productData = $cartItem['product'];
$quantity = $cartItem['quantity'];
$cartData[] = [
'product' => $productData,
'quantity' => $quantity
];
}
} else {
// L'utilisateur n'est pas connecté
$cartData = $cart->getFull();
// Récupérer le nombre d'articles dans le panier local à partir de la variable de session
$cartItemCount = count($cart->getFull());
}
return $this->render('cart/index.html.twig', [
'cart' => $cartData,
]);
}
/**
* @Route("/cart/add/{id}", name="add_to_cart")
*/
public function add(Cart $cart, $id, Request $request, SessionInterface $session)
{
$cart->add($id);
$page = $request->query->get('page');
if($page == 'products'){
// Récupérer les informations de l'article ajouté depuis la source de données en utilisant l'id
$entityManager = $this->getDoctrine()->getManager();
$product = $entityManager->getRepository(Product::class)->find($id);
// Récupérer les articles similaires depuis la source de données
$category = $product->getCategory();
$similarProducts = $entityManager->getRepository(Product::class)->findByCategory($category);
// Mise à jour du nombre d'articles dans le panier
$cartItemCount = $this->getCartItemCount();
$session->set('cartItemCount', $cartItemCount);
// Créer une page de confirmation avec les informations de l'article et les articles similaires
return $this->render('confirmation.html.twig', [
'product' => $product,
'similarProducts' => $similarProducts,
'cart' => $cart,
]);
} else{
return $this->redirectToRoute('cart');
}
}
// Gestion des listes de souhaits
// Ajouter un produit à une liste de souhaits
// Retourner la page de confirmation avant l'ajout du produit
/**
* @Route("/wishlist/add/{id}", name="add_to_wishlist")
*/
public function addToWishlist($id, Security $security, SessionInterface $session, WishlistRepository $wishlistRepository){
if ($security->isGranted('IS_AUTHENTICATED_FULLY')) {
// Récupérer les informations de l'article ajouté depuis la source de données en utilisant l'id
$entityManager = $this->getDoctrine()->getManager();
$product = $entityManager->getRepository(Product::class)->find($id);
// Ajoutez le produit à la liste de souhaits
$wishlist = $session->get('wishlist', []); // Récupère la liste de souhaits existante ou un tableau vide s'il n'existe pas
// Ajoutez le produit à la liste de souhaits en utilisant l'id du produit comme clé du tableau
$wishlist[$id] = true;
// Mettez à jour la variable de session 'wishlist' avec la nouvelle liste de souhaits
$session->set('wishlist', $wishlist);
// Pour afficher le select des listes de souhait
// Récupérer les wishlists de l'utilisateur
$user = $this->getUser();
$userId = $user->getId();
$wishlists = $wishlistRepository->findBy(['user' => $user]);
// Créer une page de confirmation avec les informations de l'article et les articles similaires
return $this->render('wishlist/wishlist.html.twig', [
'product' => $product,
'wishlists' => $wishlists,
]);
} else {
// Si l'utilisateur veut ajouter un produit à la liste de souhait, il doit être connecté
return $this->redirectToRoute('app_login');
}
}
// Ajouter le produit à la liste de souhaits choisies
/**
* @Route("/wishlist/add/article/{wishlistId}/{productId}", name="add_to_selected_wishlist")
*/
public function addArticleToSelectedWishlist($wishlistId, $productId, Security $security, SessionInterface $session)
{
if ($security->isGranted('IS_AUTHENTICATED_FULLY')) {
// Récupérer l'utilisateur actuellement connecté
$user = $security->getUser();
// Créer une nouvelle instance de l'entité ProductWishlist
$productWishlist = new ProductWishlist();
$entityManager = $this->getDoctrine()->getManager();
// Associer le produit et la liste de souhaits à cette instance
$product = $entityManager->getRepository(Product::class)->find($productId);
$wishlist = $entityManager->getRepository(Wishlist::class)->find($wishlistId);
$productWishlist->setProduct($product);
$productWishlist->setWishlist($wishlist);
// Définir les horodatages created_at et updated_at pour l'instance
$now = new DateTime();
$productWishlist->setCreatedAt($now);
$productWishlist->setUpdatedAt($now);
// Persistez l'instance en l'ajoutant à l'EntityManager et en effectuant un flush pour enregistrer les modifications dans la base de données
$entityManager->persist($productWishlist);
$entityManager->flush();
// Return a success JSON response
return new JsonResponse(['success' => true, 'message' => 'Le produit à été ajouté à la liste de souhait']);
} else {
// Si l'utilisateur veut ajouter un produit à la liste de souhait, il doit être connecté
return $this->redirectToRoute('app_login');
}
}
// Créer une liste de souhaits
/**
* @Route("/record-wishlist", name="record_wishlist", methods={"POST"})
*/
public function recordWishlist(Request $request, EntityManagerInterface $entityManager, Security $security)
{
$name = $request->request->get('name');
$wishlist = new Wishlist();
$wishlist->setName($name);
$now = new DateTime();
$wishlist->setCreatedAt($now);
$wishlist->setUpdatedAt($now);
// Récupérer l'utilisateur connecté (vous devez implémenter la gestion de l'authentification pour cela)
$user = $this->getUser();
$wishlist->setUser($user);
$entityManager->persist($wishlist);
$entityManager->flush();
// Récupérer l'id de la wishlist qui vient d'être enregistrée
$wishlistId = $wishlist->getId();
$productId = $request->request->get('product_id');
if ($productId != null) {
$product = $entityManager->getRepository(Product::class)->find($productId);
if ($product) {
if ($security->isGranted('IS_AUTHENTICATED_FULLY')) {
// Récupérer l'utilisateur actuellement connecté
$user = $security->getUser();
// Créer une nouvelle instance de l'entité ProductWishlist
$productWishlist = new ProductWishlist();
$entityManager = $this->getDoctrine()->getManager();
// Associer le produit et la liste de souhaits à cette instance
$product = $entityManager->getRepository(Product::class)->find($productId);
$wishlist = $entityManager->getRepository(Wishlist::class)->find($wishlistId);
$productWishlist->setProduct($product);
$productWishlist->setWishlist($wishlist);
// Définir les horodatages created_at et updated_at pour l'instance
$now = new DateTime();
$productWishlist->setCreatedAt($now);
$productWishlist->setUpdatedAt($now);
// Persistez l'instance en l'ajoutant à l'EntityManager et en effectuant un flush pour enregistrer les modifications dans la base de données
$entityManager->persist($productWishlist);
$entityManager->flush();
} else {
// Si l'utilisateur veut ajouter un produit à la liste de souhait, il doit être connecté
return $this->redirectToRoute('app_login');
}
}
}
return $this->redirectToRoute('wishlists');
}
// Afficher les listes de souhait de l'utilisateur
/**
* @Route("/wishlists", name="wishlists")
*/
public function getWishlists(Security $security)
{
if ($security->isGranted('IS_AUTHENTICATED_FULLY')) {
// Récupérer les wishlists de l'utilisateur
// Récupérer l'utilisateur connecté
$user = $this->getUser();
// Récupérer l'identifiant de l'utilisateur
$userId = $user->getId();
// Récupérer les wishlists de l'utilisateur
$wishlists = $this->getDoctrine()->getRepository(Wishlist::class)->findBy([
'user' => $user,
]);
// Créer une page de confirmation avec les informations des wishlists
return $this->render('wishlist/listwishlists.html.twig', [
'wishlists' => $wishlists,
]);
} else {
// Si l'utilisateur veut ajouter un produit à la liste de souhait, il doit être connecté
return $this->redirectToRoute('app_login');
}
}
/**
* @Route("/refreshWishlist", name="refreshWishlist")
*/
public function refreshWishlist(Security $security)
{
if ($security->isGranted('IS_AUTHENTICATED_FULLY')) {
// Récupérer les wishlists de l'utilisateur
// Récupérer l'utilisateur connecté
$user = $this->getUser();
// Récupérer l'identifiant de l'utilisateur
$userId = $user->getId();
// Récupérer les wishlists de l'utilisateur
$wishlists = $this->getDoctrine()->getRepository(Wishlist::class)->findBy([
'user' => $user,
]);
// Créer un tableau contenant les données des wishlists
$wishlistData = [];
foreach ($wishlists as $wishlist) {
$wishlistData[] = [
'id' => $wishlist->getId(),
'name' => $wishlist->getName(),
];
}
// Retourner la réponse JSON avec les données des wishlists
return new JsonResponse($wishlistData);
} else {
// Si l'utilisateur veut ajouter un produit à la liste de souhait, il doit être connecté
return $this->redirectToRoute('app_login');
}
}
// Afficher les informations d'une liste de souhaits
/**
* @Route("/wishlist_infos", name="wishlist_infos")
*/
public function wishlistInfos(Request $request, EntityManagerInterface $entityManager): JsonResponse
{
$userId = $this->getUser()->getId();
$wishlistId = $request->get('wishlistId');
$queryBuilder = $entityManager->createQueryBuilder()
->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')
->from('App\Entity\Wishlist', 'w')
->leftJoin('w.productWishlist', 'pw')
->leftJoin('pw.product', 'p')
->leftJoin('p.category', 'c')
->where('w.id = :wishlistId')
->andWhere('w.user = :userId')
->setParameter('wishlistId', $wishlistId)
->setParameter('userId', $userId);
try {
$results = $queryBuilder->getQuery()->getArrayResult();
} catch (\Exception $e) {
return new JsonResponse(['error' => $e->getMessage()], 500);
}
// Construire le tableau d'informations
$data = [];
foreach ($results as $result) {
$wishlistName = $result['wishlistName'] ?? null;
$productId = $result['productId'] ?? null;
$productName = $result['productName'] ?? null;
$price = $result['productPrice'] ?? null; // Update key to 'productPrice'
$description = $result['productDescription'] ?? null; // Update key to 'productDescription'
$illustration = $result['productIllustration'] ?? null; // Update key to 'productIllustration'
$categoryName = $result['categoryName'] ?? null;
$data[] = [
'wishlistName' => $wishlistName,
'productId' => $productId,
'productName' => $productName,
'productPrice' => $price,
'productDescription' => $description,
'productImage' => $illustration,
'categoryName' => $categoryName,
];
}
return new JsonResponse($data);
}
// Supprimer une liste de souhaits
/**
* @Route("/wishlist/delete", name="delete_wishlist")
*/
public function deleteWishlist(EntityManagerInterface $entityManager, Security $security, Request $request)
{
if ($security->isGranted('IS_AUTHENTICATED_FULLY')) {
$wishlistId = $request->get('wishlistId');
$wishlistName = $request->get('wishlistName');
$wishlist = $entityManager->getRepository(Wishlist::class)->find($wishlistId);
$wishlistItemCount = $this->cartService->getWishlistItemCount();
if ($wishlist) {
// Récupérer le nom de la liste de souhait
$wishlistName = $wishlist->getName();
// Supprimer les produits associés à la liste de souhaits
$productWishlistQuery = $entityManager->createQuery('DELETE FROM App\Entity\ProductWishlist pw WHERE pw.wishlist = :wishlistId');
$productWishlistQuery->setParameter('wishlistId', $wishlistId);
$productWishlistQuery->execute();
$entityManager->remove($wishlist);
$entityManager->flush();
// Message de confirmation avec le nom de la liste de souhait supprimée
$message = "La liste de souhait '$wishlistName' a été supprimée avec succès.";
// Récupérer le nombre de listes de souhaits après la suppression
$wishlistItemCount = $this->cartService->getWishlistItemCount();
return new JsonResponse(['message' => $message, 'wishlistItemCount' => $wishlistItemCount]);
} else {
// Wishlist non trouvé, gestion de l'erreur
$errorMessage = "La liste de souhait n'a pas été trouvée.";
return new JsonResponse(['error' => $errorMessage], 404);
}
} else {
// Si l'utilisateur veut ajouter un produit à la liste de souhait, il doit être connecté
return $this->redirectToRoute('app_login');
}
}
// Supprimer une article de la liste de souhaits
/**
* @Route("/wishlist/delete_product", name="delete_product", methods={"POST"})
*/
public function deleteProductWishlist(EntityManagerInterface $entityManager, Security $security, Request $request)
{
// Vérifiez si l'utilisateur est entièrement authentifié
if ($security->isGranted('IS_AUTHENTICATED_FULLY')) {
// Récupérer l'ID du produit à supprimer depuis les données de la requête
$productId = $request->request->get('productId');
$wishlistId = $request->request->get('wishlistId');
try {
// Trouver l'entité ProductWishlist par ses IDs (productId et wishlistId)
$productWishlist = $entityManager->getRepository(ProductWishlist::class)->findOneBy([
'product' => $productId,
'wishlist' => $wishlistId,
]);
if ($productWishlist) {
// Supprimer l'entité ProductWishlist
$entityManager->remove($productWishlist);
$entityManager->flush();
return new JsonResponse(['success' => true, 'message' => 'Le produit a été supprimé de la liste de souhaits']);
} else {
return new JsonResponse(['success' => false, 'message' => 'Le produit n\'a pas été trouvé'], 404);
}
} catch (\Exception $e) {
// En cas d'erreur lors de la suppression, renvoyer une réponse d'erreur
return new JsonResponse(['success' => false, 'message' => 'Failed to remove product from wishlist: ' . $e->getMessage()], 500);
}
} else {
return new JsonResponse(['success' => false, 'message' => 'User not authenticated'], 401);
}
}
/**
* @Route("/cart/delete/{id}", name="delete_to_cart")
*/
public function delete(Cart $cart, $id, Security $security, SessionInterface $session)
{
$cart->delete($id);
// Mise à jour du nombre d'articles dans le panier
$cartItemCount = $this->getCartItemCount();
$session->set('cartItemCount', $cartItemCount);
return $this->redirectToRoute('cart');
}
/**
* @Route("/cart/decrease/{id}", name="decrease_to_cart")
*/
public function decrease(Cart $cart, EntityManagerInterface $entityManager, $id)
{
$product = $entityManager->getRepository(Product::class)->find($id);
if (!$product) {
throw $this->createNotFoundException('Product not found.');
}
// Mettre à jour la quantité du produit dans le panier
$cart->decrease($id);
// Enregistrer les modifications en base de données
$entityManager->flush();
return $this->redirectToRoute('cart');
}
}