src/Controller/PanierController.php line 51

Open in your IDE?
  1. <?php
  2. namespace App\Controller;
  3. use App\Entity\Produit;
  4. use App\Entity\Commande;
  5. use App\Entity\ProduitVariant;
  6. use App\Service\PanierService;
  7. use App\Entity\CommandeDetails;
  8. use App\Repository\ProduitRepository;
  9. use Doctrine\ORM\EntityManagerInterface;
  10. use App\Repository\ProduitVariantRepository;
  11. use Symfony\Component\HttpFoundation\Request;
  12. use Symfony\Component\HttpFoundation\Response;
  13. use Symfony\Component\HttpFoundation\JsonResponse;
  14. use Symfony\Component\Routing\Annotation\Route;
  15. use Symfony\Component\Translation\LocaleSwitcher;
  16. use Symfony\Contracts\Translation\TranslatorInterface;
  17. use Symfony\Component\HttpFoundation\Session\SessionInterface;
  18. use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
  19. class PanierController extends AbstractController
  20. {
  21.     public $panierService;
  22.     public function __construct(PanierService $panierService)
  23.     {
  24.         $this->panierService $panierService;
  25.     }
  26.     #[Route('/panier'name'app_panier')]
  27.     public function index(SessionInterface $sessionProduitRepository $productrepository
  28.     ProduitVariantRepository $productVariantRepository
  29.     ,TranslatorInterface $translator,LocaleSwitcher $localeSwitcher,Request $request ): Response
  30.     {
  31.         if ($request->query->has('_locale')) {
  32.             $locale $request->getSession()->get('_locale');
  33.             if($locale != null){
  34.                 $localeSwitcher->setLocale($locale);
  35.                 $translator->setLocale($locale);    
  36.             }
  37.         }
  38.         $panier $session->get('panier',[]);
  39.         $panierWithData = [];
  40.         foreach($panier as $pan){
  41.             $productVariant = new ProduitVariant();
  42.             if ($pan["idVariante"] != 'notdefined'){
  43.                 $productVariant $productVariantRepository->find($pan["idVariante"]);
  44.             }
  45.             $panierWithData[] = [
  46.                 'product'        => $productrepository->find($pan["id"]),
  47.                 'productVariant' => $productVariant,
  48.                 'quantity'       => $pan["qtt"]
  49.             ];
  50.         }
  51.         $frais 5;
  52.         $total 0;
  53.         foreach($panierWithData as $item){
  54.             $totalItem $item['product']->getSalePrice() * $item['quantity'];
  55.             $total += $totalItem;
  56.         }
  57.         $total += $frais;
  58.         return $this->render('panier/index.html.twig', [
  59.             'items' => $panierWithData,
  60.             'frais' => $frais,
  61.             'total' => $total
  62.         ]);
  63.     }
  64.     
  65.     #[Route('/panier/add/{id}/{idVariante}/{option}'name'panier_add')]
  66.     public function add($id$idVariante$optionSessionInterface $sessionRequest $request,
  67.         EntityManagerInterface $entityManagerTranslatorInterface $translator,
  68.         LocaleSwitcher $localeSwitcher): Response
  69.     {
  70.         if (empty($idVariante)) { $idVariante 'notdefined'; }
  71.         if (!isset($idVariante)) { $idVariante 'notdefined'; }
  72.         if ($request->query->has('_locale')) {
  73.             $locale $request->getSession()->get('_locale');
  74.             if($locale != null){
  75.                 $localeSwitcher->setLocale($locale);
  76.                 $translator->setLocale($locale);    
  77.             }
  78.         }
  79.         // ── Check if AJAX request ──
  80.         $isAjax $request->isXmlHttpRequest()
  81.                || $request->headers->get('X-Requested-With') === 'XMLHttpRequest'
  82.                || $request->headers->get('Accept') === 'application/json';
  83.         $srv_msg = [];
  84.         $panier  $session->get('panier', []);
  85.         $qtt     $request->request->get('qttprdid') ?? 1;
  86.         $size    $request->request->get('chosenSize');
  87.         $color   $request->request->get('chosenColor');
  88.         
  89.         if ($id != null){
  90.             $produit $entityManager->getRepository(Produit::class)->find($id);
  91.             $stock   $produit->getQtt();
  92.             if($stock !== null && $stock $qtt){
  93.                 $srv_msg = ["data" => "Available Qty $stock"];
  94.                 $session->set('srv_msg'$srv_msg["data"]);
  95.                 if ($isAjax) {
  96.                     return new JsonResponse(['success' => false'message' => "Only $stock available"], 400);
  97.                 }
  98.                 return $this->redirectToRoute("show_produit", ['id' => $id]);
  99.             }
  100.             if ($idVariante == 'notdefined'){
  101.                 if($size != null || $color != null){
  102.                     $variant $entityManager->getRepository(ProduitVariant::class)
  103.                         ->findProductByColorAndSizeAndProductId($id$color$size);
  104.                     if ($variant != null){
  105.                         $idVariante $variant->getId(); 
  106.                         $stock      $variant->getQtt();
  107.                     } else {
  108.                         $stock 0;
  109.                     }
  110.                 }
  111.             } else {
  112.                 $variant $entityManager->getRepository(ProduitVariant::class)->find($idVariante);
  113.                 if ($variant != null){
  114.                     $stock $variant->getQtt();
  115.                 } else {
  116.                     $stock 0;
  117.                 }
  118.             }
  119.             if($stock !== null && $stock $qtt){
  120.                 $srv_msg = ["data" => "Available Qty $stock"];
  121.                 $session->set('srv_msg'$srv_msg["data"]);
  122.                 if ($isAjax) {
  123.                     return new JsonResponse(['success' => false'message' => "Only $stock available"], 400);
  124.                 }
  125.                 return $this->redirectToRoute("show_produit", ['id' => $id]);
  126.             }
  127.         }
  128.         if(count($panier) == 0){
  129.             $session->set('duration'240);
  130.             $session->set('start_time'date("Y-m-d H:i:s"));
  131.             $end_time date('Y-m-d H:i:s',
  132.                 strtotime('+' $session->get('duration') . 'minutes',
  133.                 strtotime($session->get('start_time'))));
  134.             $session->set('end_time'$end_time);
  135.         }    
  136.         try {
  137.             $panier $session->get('panier', []);
  138.             if ($this->panierService->produit_existe_dans_panier($panier$id$idVariante)) {
  139.                 $this->panierService->modifierQuantite($session$id$idVariante$qtt);
  140.             } else {
  141.                 $this->panierService->ajouterAuPanier($session$id$idVariante$qtt);
  142.             }
  143.             // ── Return JSON for AJAX calls ──
  144.             if ($isAjax) {
  145.                 // Calculate new cart count
  146.                 $newPanier $session->get('panier', []);
  147.                 $count array_sum(array_column($newPanier'qtt'));
  148.                 return new JsonResponse(['success' => true'cartCount' => $count]);
  149.             }
  150.             if ($option == "done"){
  151.                 return $this->redirectToRoute("app_panier");
  152.             }
  153.                 
  154.         } catch(\Exception $e) {
  155.             if ($isAjax) {
  156.                 return new JsonResponse(['success' => false'message' => 'Error'], 500);
  157.             }
  158.             return $this->redirectToRoute("app_home");
  159.         }
  160.         return $this->redirectToRoute("app_home");
  161.     }
  162.     #[Route('/panier/remove/{id}/{idVariante}'name'panier_remove')]
  163.     public function remove($id$idVarianteSessionInterface $sessionRequest $request): Response
  164.     {
  165.         $key     $id '-' $idVariante;
  166.         $isAjax  $request->isXmlHttpRequest()
  167.                 || $request->headers->get('X-Requested-With') === 'XMLHttpRequest';
  168.         try {
  169.             $this->panierService->supprimerItem($key$session);    
  170.         } catch(\Exception $e) {}
  171.         if ($isAjax) {
  172.             $newPanier $session->get('panier', []);
  173.             $count     array_sum(array_column($newPanier'qtt'));
  174.             return new JsonResponse(['success' => true'cartCount' => $count]);
  175.         }
  176.         return $this->redirectToRoute("app_panier");
  177.     }
  178.     #[Route('/panier/minus/{id}/{idVariante}/{option}'name'panier_minus')]
  179.     public function minus($id$idVariante$optionSessionInterface $sessionRequest $request): Response
  180.     {
  181.         if (empty($idVariante))  { $idVariante 'notdefined'; }
  182.         if (!isset($idVariante)) { $idVariante 'notdefined'; }
  183.         $isAjax $request->isXmlHttpRequest()
  184.                || $request->headers->get('X-Requested-With') === 'XMLHttpRequest';
  185.         try {
  186.             $this->panierService->supprimerDuPanier($session$id$idVariante);
  187.         } catch(\Exception $e) {}
  188.         if ($isAjax) {
  189.             $newPanier $session->get('panier', []);
  190.             $count     array_sum(array_column($newPanier'qtt'));
  191.             return new JsonResponse(['success' => true'cartCount' => $count]);
  192.         }
  193.         return $this->redirectToRoute("app_panier");
  194.     }
  195. }