<?php
namespace App\Controller\Front\Boutique\Panier;
use App\Entity\Boutique\Evenement\Evenement;
use App\Entity\Boutique\Panier\PanierLigne;
use App\Entity\Boutique\Produit\Produit;
use App\Entity\PostType\PostTypeProduit;
use App\Form\Front\AjouterAuPanierType;
use App\Repository\Boutique\Panier\PanierRepository;
use App\Utils\Panier\PanierService;
use Doctrine\ORM\EntityManagerInterface;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Annotation\Route;
use Symfony\Component\Security\Core\Security;
class PanierController extends AbstractController
{
public function __construct(
private PanierService $panierService
) {
}
#[Route('/front/shop/panier', name: 'app_front_boutique_panier')]
public function index(Security $security, PanierRepository $panierRepository): Response
{
return $this->render('front/boutique/panier/index.html.twig', [
'controller_name' => 'PanierController',
// @phpstan-ignore-next-line
'panier' => $panierRepository->findOneBy(['client' => $security->getUser()->getClient()->getId()]),
]);
}
#[Route('/front/shop/panier/vider/{id}', name: 'app_front_boutique_panier_vider')]
public function viderPanier(int $id, PanierRepository $panierRepository): Response
{
$panier = $panierRepository->findOneBy(['id' => $id]);
foreach ($panier->getPanierLignes() as $ligne) {
$panier->removePanierLigne($ligne);
}
$panier->setTotalHt(0);
$panierRepository->add($panier, true);
return $this->redirectToRoute('app_front_boutique_panier');
}
#[Route('/front/boutique/panier/{id<[1-9]\d*>}/ajouter-au-panier', name: 'app_front_boutique_panier_ajouter_au_panier', methods: ['GET', 'POST'])]
public function ajouterAuPanier(
int $id,
EntityManagerInterface $em,
Request $request,
PanierRepository $panierRepository
): Response {
$panierLigne = new PanierLigne();
$form = $this->createForm(AjouterAuPanierType::class, $panierLigne);
$form->handleRequest($request);
if ($form->isSubmitted() && $form->isValid()) {
$produitType = $em->getRepository(PostTypeProduit::class)->findOneBy(['id' => $id]);
$panierEnCours = $this->panierService->findPanier();
$this->panierService->addLigne($produitType, $panierEnCours, $panierLigne);
$this->panierService->calculPanier($panierEnCours);
$panierRepository->add($panierEnCours, true);
if ($produitType instanceof Produit) {
return $this->redirectToRoute('app_front_produit_detail', ['name' => $produitType->getName()], Response::HTTP_SEE_OTHER);
} elseif ($produitType instanceof Evenement) {
return $this->redirectToRoute('app_front_evenements_detail', ['name' => $produitType->getName()], Response::HTTP_SEE_OTHER);
}
return $this->redirectToRoute('app_front_cours_detail', ['name' => $produitType->getName()], Response::HTTP_SEE_OTHER);
}
return $this->renderForm('front/boutique/produit/include/_ajouterAuPanier.html.twig', [
'id' => $id,
'panier_ligne' => $panierLigne,
'form' => $form,
]);
}
}