src/Controller/ProduitController.php line 94

Open in your IDE?
  1. <?php
  2. namespace App\Controller;
  3. use DateTime;
  4. use App\Entity\User;
  5. use App\Entity\Image;
  6. use Twig\Environment;
  7. use App\Entity\Magasin;
  8. use App\Entity\Produit;
  9. use App\Entity\Category;
  10. use App\Data\SearchData;
  11. use App\Form\SearchForm;
  12. use App\Data\ShopContext;
  13. use App\Form\ProductType;
  14. use App\Service\PictureService;
  15. use Doctrine\ORM\EntityRepository;
  16. use App\Entity\MaintenanceSchedule;
  17. use App\Repository\ProduitRepository;
  18. use Doctrine\ORM\EntityManagerInterface;
  19. use Doctrine\Persistence\ManagerRegistry;
  20. use App\Controller\ProduitVariantController;
  21. use App\Repository\ProduitVariantRepository;
  22. use Symfony\Component\HttpFoundation\Request;
  23. use Symfony\Component\Security\Core\Security;
  24. use Symfony\Component\Translation\Translator;
  25. use Symfony\Component\HttpFoundation\Response;
  26. use Symfony\Component\Security\Csrf\CsrfToken;
  27. use Symfony\Component\Routing\Annotation\Route;
  28. use App\Repository\MaintenanceScheduleRepository;
  29. use Symfony\Component\Translation\LocaleSwitcher;
  30. use Symfony\Component\HttpFoundation\JsonResponse;
  31. use Symfony\Contracts\Translation\TranslatorInterface;
  32. use Symfony\Component\HttpFoundation\Session\SessionInterface;
  33. use Symfony\Component\Security\Csrf\CsrfTokenManagerInterface;
  34. use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
  35. use Symfony\Component\DependencyInjection\ParameterBag\ParameterBagInterface;
  36. class ProduitController extends AbstractController
  37. {
  38.     private CsrfTokenManagerInterface $csrfTokenManager;
  39.     private $params;
  40.     private $shopContext;
  41.     public function __construct(CsrfTokenManagerInterface $csrfTokenManager,
  42.         ShopContext $shopContext)
  43.     {
  44.         $this->csrfTokenManager $csrfTokenManager;
  45.         $this->shopContext $shopContext;
  46.     }
  47.     public function validateCsrfToken($token): bool
  48.     {
  49.         return $this->csrfTokenManager->isTokenValid(new CsrfToken('my-form-promo'$token));
  50.     }
  51.     #[Route('/locale/{_locale}'name'app_locale')]
  52.     public function setLocale(Request $request,SessionInterface $session 
  53.     ,TranslatorInterface $translator,LocaleSwitcher $localeSwitcher ):Response
  54.     {
  55.             $locale $request->get('_locale');
  56.             $currentLocale $localeSwitcher->getLocale();
  57.             if($locale !=null){
  58.                 $localeSwitcher->setLocale($locale);
  59.                 $translator->setLocale($locale);
  60.                 $request->getSession()->set('_locale',$locale);
  61.             }
  62.         $sessionlocal$request->getSession()->get('_locale');
  63.         return $this->redirectToRoute("app_home",['_locale'=>$sessionlocal]);
  64.     }
  65.     
  66.     #[Route(path: ['/home/{shopName}''/home'], name'app_home',
  67.     defaults: ['shopName' => null]
  68.     )]
  69.     public function index(ManagerRegistry $doctrineRequest $request
  70.     ,?string $shopName
  71.     ,Environment $twig,Security $security,SessionInterface $session 
  72.     ,TranslatorInterface $translator,LocaleSwitcher $localeSwitcher 
  73.     ,EntityManagerInterface $entityManager):Response
  74.     {   
  75.         
  76.         if ($request->getSession()->has('_locale')) {
  77.             $locale =  $request->getSession()->get('_locale');
  78.             if($locale !=null){
  79.                 $localeSwitcher->setLocale($locale);
  80.                 $translator->setLocale($locale);    
  81.                 $request->getSession()->set('lang',$locale);
  82.             }
  83.         }
  84.         else {
  85.             $request->getSession()->set('_locale','en');
  86.             $request->getSession()->set('lang','en');
  87.             $locale =  'en';
  88.             if($locale !=null){
  89.                 $localeSwitcher->setLocale($locale);
  90.                 $translator->setLocale($locale);    
  91.             }
  92.         }
  93.         
  94.         $session->set('srv_msg',null);
  95.         $shops = [];
  96.         if ($shopName) {
  97.             $slugs explode(','$shopName);
  98.             $shops $entityManager->getRepository(Magasin::class)->findBy(['nom' => $slugs]);
  99.             if (!$shops) {
  100.                 throw $this->createNotFoundException('Aucune boutique trouvée');
  101.             }
  102.             $this->shopContext->setShops($shops);
  103.         } elseif ($request->query->get('shopName')) {
  104.             $shops $entityManager->getRepository(Magasin::class)->findBy(['nom' => [$request->query->get('shopName')]]);
  105.             $this->shopContext->setShops($shops);
  106.         } else {
  107.             $this->shopContext->clear();
  108.         }
  109.         $lastActive$doctrine->getRepository(MaintenanceSchedule::class)
  110.                         ->findLastActiveSchedule();
  111.         if ($lastActive) {
  112.             return $this->redirectToRoute("maintenance_index",['_locale'=>$locale,'lastActiveId'=>$lastActive->getId()]);
  113.         }
  114.         $data = new SearchData();
  115.         $form $this->createForm(SearchForm::class, $data);
  116.         $form->handleRequest($request);
  117.         $data->categories $request->query->all('categories');
  118.         $data->shops $shops;
  119.         $data->promo $request->query->get('promo');
  120.         // ── NEW: also read min/max/q from GET for filter sidebar ──
  121.         if (!$form->isSubmitted()) {
  122.             $data->q   $request->query->get('q');
  123.             $data->min $request->query->get('min');
  124.             $data->max $request->query->get('max');
  125.         }
  126.         $offset max(0$request->query->getInt('offset'0));
  127.         $findProduitsNouveaute = [];
  128.         $isAdmin 0;
  129.         $user $security->getUser();
  130.         if($user){
  131.             $roles $user->getRoles();
  132.             if($roles[0] == "ROLE_ADMIN"){
  133.                 $isAdmin=1;
  134.             }
  135.         }
  136.         else{
  137.             $isAdmin=0;
  138.         }
  139.         if($form->isSubmitted() && $form->isValid() ){
  140.             $produits $doctrine->getRepository(Produit::class)->findSearch($data,$offset,$isAdmin);         
  141.             $magasins $doctrine->getRepository(Magasin::class)->findAll();
  142.         }else{
  143.             $category $request->request->get('category'null);
  144.             if($category !=null){
  145.                 $data = new SearchData();
  146.                 $categories = [$category];
  147.                 $data->categories $categories;
  148.             }
  149.             else{
  150.                 $findProduitsNouveaute $doctrine->getRepository(Produit::class)
  151.                 ->findProduitsNouveaute($data,$offset,$isAdmin);
  152.             }
  153.             $produits $doctrine->getRepository(Produit::class)->findSearch($data,$offset,$isAdmin);
  154.             $magasins $doctrine->getRepository(Magasin::class)->findAll();
  155.         }
  156.         // ── NEW: pass all categories for filter sidebar ──
  157.         $allCategories $entityManager->getRepository(Category::class)
  158.             ->findBy([], ['nom' => 'ASC']);
  159.         // ── NEW: count active filters for badge ──
  160.         $activeFilters 0;
  161.         if (!empty($data->q))          $activeFilters++;
  162.         if (!empty($data->categories)) $activeFilters++;
  163.         if (!empty($data->promo))      $activeFilters++;
  164.         if (!empty($data->min))        $activeFilters++;
  165.         if (!empty($data->max))        $activeFilters++;
  166.         return new Response($twig->render('produit/index.html.twig',[
  167.             'produits'          => $produits,
  168.             'magasins'          => $magasins,
  169.             '_locale'           => $locale,
  170.             'produitsNouveaute' => $findProduitsNouveaute,
  171.             'form'              => $form->createView(),
  172.             'previous'          => $offset ProduitRepository::PAGINATOR_PER_PAGE,
  173.             'next'              => min(count($produits), $offset ProduitRepository::PAGINATOR_PER_PAGE),
  174.             // ── NEW variables for filter sidebar ──
  175.             'allCategories'     => $allCategories,
  176.             'activeFilters'     => $activeFilters,
  177.             'currentQ'          => $data->?? '',
  178.             'currentMin'        => $data->min ?? '',
  179.             'currentMax'        => $data->max ?? '',
  180.             'currentPromo'      => $data->promo ?? '',
  181.             'currentCategories' => $data->categories ?? [],
  182.             'currentSort'       => $request->query->get('sort'''),
  183.         ])); 
  184.     }
  185.     #[Route('/produits/ajax-filter'name'ajax_product_filter'methods: ['POST'])]
  186.     public function ajaxFilterProducts(Request $request
  187.     CsrfTokenManagerInterface $csrfTokenManager,
  188.     ProduitRepository $produitRepository,ManagerRegistry $doctrine,
  189.     Environment $twig,Security $security,SessionInterface $session,
  190.     TranslatorInterface $translator,LocaleSwitcher $localeSwitcher): JsonResponse
  191.     {
  192.         $csrfToken $request->headers->get('X-CSRF-TOKEN');
  193.         if (!$this->validateCsrfToken($csrfToken)) {
  194.             return new JsonResponse(['error' => 'Invalid CSRF token'], 400);
  195.         }
  196.         $data = new SearchData();
  197.         $data->$request->request->get('q');
  198.         $data->categories $request->request->get('categories');
  199.         $data->promo $request->request->get('promo');
  200.         $data->min $request->request->get('min');
  201.         $data->max $request->request->get('max');
  202.         $data->dateproduction $request->request->get('dateproduction');
  203.         $data->dateproduction $request->request->get('dateexpiration');
  204.         $findProduitsPromo= [];
  205.         $isAdmin 0;
  206.         $user $security->getUser();
  207.         if($user){
  208.             $roles $user->getRoles();
  209.             if($roles[0] == "ROLE_ADMIN"){
  210.                 $isAdmin=1;
  211.             }
  212.         }
  213.         else{
  214.             $isAdmin=0;
  215.         }
  216.         $products $produitRepository->findSearchPromo($data,$isAdmin);
  217.         $productData = [];
  218.         foreach ($products as $product) {
  219.             $productData[] = [
  220.                 'id' => $product->getId(),
  221.                 'name' => $product->getProductName(),
  222.             ];
  223.         }
  224.         return new JsonResponse($productData);
  225.     }
  226.     #[Route('/produit/add'name'add_produit')]
  227.     #[Route('/produit/edit/{id}'name'edit_produit')]
  228.     public function new_edit(int $id =null  ,Request $request,EntityManagerInterface $entityManager,Produit $produit null,
  229.                                 PictureService $pictureService,ParameterBagInterface $params
  230.                                 ,TranslatorInterface $translator,LocaleSwitcher $localeSwitcher ): Response
  231.     {
  232.         $this->denyAccessUnlessGranted('ROLE_ADMIN');
  233.         if ($id!=null){
  234.             $produit $entityManager->getRepository(Produit::class)->find($id);
  235.         }
  236.         if (!$produit) {
  237.             $produit = new Produit();
  238.             $produitVariants $produit->getProduitVariants();
  239.             $option  "add";
  240.         }
  241.         else{
  242.             $option  "edit";
  243.         }
  244.         $form $this->createForm(ProductType::class, $produit);
  245.         $form->handleRequest($request);
  246.         if ($form->isSubmitted() && $form->isValid()) {
  247.             $produit $form->getData();
  248.             $images $form->get('images')->getData();
  249.             foreach($images as $image){
  250.                 $folder 'products';
  251.                 $fichier $pictureService->add($image$folder300300);
  252.                 $img = new Image();
  253.                 $img->setFileName($fichier);
  254.                 $pictureService =  new PictureService($params);
  255.                 $img->setImageUrl($params->get('images_directory') . $folder);
  256.                 $produit->addImage($img);
  257.             }
  258.             $produit->setUser($this->getUser());
  259.             
  260.             $produitVariants $form->get('produitVariants')->getData();
  261.             foreach($produitVariants as $produitVariant){
  262.                 $produitVariant->setProduit($produit);
  263.                 $produit->addProduitVariant($produitVariant);
  264.             } 
  265.             $date = new DateTime();
  266.             $produit->setPublishDate$date);
  267.             try{
  268.                 $entityManager->persist($produit);
  269.             }
  270.             catch (Exception $e) {
  271.                 $this->addFlash('error''An error occurred while saving the entity.');
  272.             }
  273.             $entityManager->flush();
  274.             if ($option === 'edit') {
  275.                 return $this->redirectToRoute($option '_produit', [
  276.                     'id' => $produit->getId(),
  277.                 ]);
  278.             } else {
  279.                 return $this->redirectToRoute($option.'_produit');
  280.             }
  281.         }
  282.         if ($request->query->has('_locale')) {
  283.             $locale =  $request->getSession()->get('_locale');
  284.             if($locale !=null){
  285.                 $localeSwitcher->setLocale($locale);
  286.                 $translator->setLocale($locale);    
  287.             }
  288.         }
  289.             
  290.         return $this->render('produit/add.html.twig', [
  291.             'formAddProduit' => $form->createView(),
  292.             'option' => $option
  293.         ]);
  294.     }
  295.     #[Route('/produit/{id}'name'show_produit')]
  296.     public function showstring $id,EntityManagerInterface $entityManager
  297.     ,TranslatorInterface $translator,LocaleSwitcher $localeSwitcher Request $request): Response
  298.     {                                    
  299.         if ($id!=null){
  300.             $produit $entityManager->getRepository(Produit::class)->find($id);
  301.         }
  302.         if (!$produit) {
  303.             throw $this->createNotFoundException('Product not found');
  304.         }
  305.         $locale =  $request->getSession()->get('_locale');
  306.         if($locale !=null){
  307.             $localeSwitcher->setLocale($locale);
  308.             $translator->setLocale($locale);    
  309.         }
  310.         $groupedVariantssize = [];
  311.         foreach ($produit->getProduitVariants() as $variant) {
  312.             $paramSize $variant->getParamSize();
  313.             if ($paramSize !== null) {
  314.                 $size $paramSize->getSizeAbreviation();
  315.                 if ($size !== null) {
  316.                     $groupedVariantssize[$size][] = $variant;
  317.                 }
  318.             }
  319.         }
  320.         $groupedVariantscolor = [];
  321.         foreach ($produit->getProduitVariants() as $variant) {
  322.             $paramColor $variant->getParamColor();
  323.             if ($paramColor !== null) {
  324.                 $color $paramColor->getColorName();
  325.                 if ($color !== null) {
  326.                     $groupedVariantscolor[$color][] = $variant;
  327.                 }
  328.             }
  329.         }
  330.         $variantsArray = [];
  331.         foreach ($produit->getProduitVariants() as $variant) {
  332.             if (($variant !== null && $variant->getParamColor() !== null) ) {
  333.                 if ($variant->getParamColor() !== null) {
  334.                     $variantsArray[$variant->getParamColor()->getColorName()] = [];
  335.                 }
  336.             }
  337.             if ($variant !== null && $variant->getParamSize() !== null) {
  338.                 $variantsArray[$variant->getParamColor()->getColorName()][] = $variant->getParamSize()->getSizeAbreviation();
  339.             }
  340.         }
  341.         return $this->render('produit/show.html.twig', [
  342.             'produit' => $produit,
  343.             'groupedVariantscolor' => $groupedVariantscolor,
  344.             'groupedVariantssize' => $groupedVariantssize,
  345.             'variants' =>$variantsArray  
  346.         ]); 
  347.     }   
  348. }