src/Controller/ProduitController.php line 96

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\Data\SearchData;
  10. use App\Form\SearchForm;
  11. use App\Data\ShopContext;
  12. use App\Form\ProductType;
  13. use App\Service\PictureService;
  14. use Doctrine\ORM\EntityRepository;
  15. use App\Entity\MaintenanceSchedule;
  16. use App\Repository\ProduitRepository;
  17. use Doctrine\ORM\EntityManagerInterface;
  18. use Doctrine\Persistence\ManagerRegistry;
  19. use App\Controller\ProduitVariantController;
  20. use App\Repository\ProduitVariantRepository;
  21. use Symfony\Component\HttpFoundation\Request;
  22. use Symfony\Component\Security\Core\Security;
  23. use Symfony\Component\Translation\Translator;
  24. use Symfony\Component\HttpFoundation\Response;
  25. use Symfony\Component\Security\Csrf\CsrfToken;
  26. use Symfony\Component\Routing\Annotation\Route;
  27. use App\Repository\MaintenanceScheduleRepository;
  28. use Symfony\Component\Translation\LocaleSwitcher;
  29. use Symfony\Component\HttpFoundation\JsonResponse;
  30. use Symfony\Contracts\Translation\TranslatorInterface;
  31. use Symfony\Component\HttpFoundation\Session\SessionInterface;
  32. use Symfony\Component\Security\Csrf\CsrfTokenManagerInterface;
  33. use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
  34. use Symfony\Component\DependencyInjection\ParameterBag\ParameterBagInterface;
  35. class ProduitController extends AbstractController
  36. {
  37.     private CsrfTokenManagerInterface $csrfTokenManager;
  38.     private $params;
  39.     private $shopContext;
  40.     public function __construct(CsrfTokenManagerInterface $csrfTokenManager,
  41.         ShopContext $shopContext)
  42.     {
  43.         $this->csrfTokenManager $csrfTokenManager;
  44.         $this->shopContext $shopContext;
  45.     }
  46.     public function validateCsrfToken($token): bool
  47.     {
  48.         return $this->csrfTokenManager->isTokenValid(new CsrfToken('my-form-promo'$token));
  49.     }
  50.     #[Route('/locale/{_locale}'name'app_locale')]
  51.     public function setLocale(Request $request,SessionInterface $session 
  52.     ,TranslatorInterface $translator,LocaleSwitcher $localeSwitcher ):Response
  53.     {
  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.        
  63.         
  64.           // Rediriger vers la page précédente
  65.         //   $referer = $request->headers->get('referer');
  66.         //   return $this->redirect($referer);
  67.         $sessionlocal$request->getSession()->get('_locale');
  68.         return $this->redirectToRoute("app_home",['_locale'=>$sessionlocal]);
  69.     }
  70.     
  71.     // #[Route('/home', name: 'app_home')]
  72.     // #[Route('/{shopName}/home', name: 'app_home', requirements: ['shopName' => '.+'], defaults: ['shopName' => null])]
  73.     // #[Route('/{shopName}/home', name: 'app_home', requirements: ['shopName' => '.+'], defaults: ['shopName' => null])]
  74.     #[Route(path: ['/home/{shopName}''/home'], name'app_home',
  75.     defaults: ['shopName' => null]
  76.     )]
  77.     public function index(ManagerRegistry $doctrineRequest $request
  78.     ,?string $shopName
  79.     ,Environment $twig,Security $security,SessionInterface $session 
  80.     ,TranslatorInterface $translator,LocaleSwitcher $localeSwitcher 
  81.     ,EntityManagerInterface $entityManager):Response
  82.     {   
  83.         
  84.         if ($request->getSession()->has('_locale')) {
  85.             $locale =  $request->getSession()->get('_locale');
  86.             if($locale !=null){
  87.                 $localeSwitcher->setLocale($locale);
  88.                 $translator->setLocale($locale);    
  89.                 // $request->getSession()->set('_locale',$locale);
  90.                 $request->getSession()->set('lang',$locale);
  91.             }
  92.         }
  93.         else {
  94.             //default lang 
  95.             $request->getSession()->set('_locale','en');
  96.             $request->getSession()->set('lang','en');
  97.             $locale =  'en';
  98.                 if($locale !=null){
  99.                     $localeSwitcher->setLocale($locale);
  100.                     $translator->setLocale($locale);    
  101.                     // $request->getSession()->set('_locale',$locale);
  102.                 }
  103.             }
  104.         
  105.         $session->set('srv_msg',null);
  106.         // shops context 
  107.         // var_dump($shopName);
  108.         $shops = [];
  109.         if ($shopName) {
  110.             $slugs explode(','$shopName);
  111.             $shops $entityManager->getRepository(Magasin::class)->findBy(['nom' => $slugs]);
  112.             // $shops = $shopRepo->findBy(['nom' => $slugs]);
  113.             // var_dump($shops);
  114.             if (!$shops) {
  115.                 throw $this->createNotFoundException('Aucune boutique trouvée');
  116.             }
  117.             $this->shopContext->setShops($shops);
  118.             
  119.                    
  120.         } else {
  121.             // $this->$shopContext->clear();
  122.             $this->shopContext->clear(); // ✅ correct
  123.         }
  124.         // shops context 
  125.         //ajouter un test de maintenance en cours 
  126.         $lastActive$doctrine->getRepository(MaintenanceSchedule::class)
  127.                         ->findLastActiveSchedule();
  128.         // dd($lastActive);
  129.         
  130.         if ($lastActive) {
  131.             // It's in progress
  132.             return $this->redirectToRoute("maintenance_index",['_locale'=>$locale,'lastActiveId'=>$lastActive->getId()]);
  133.         }
  134.         //ajouter un test de maintenance en cours 
  135.         $data = new SearchData();
  136.         $form $this->createForm(SearchForm::class, $data);
  137.         $form->handleRequest($request);
  138.         $data->categories $request->query->get('categories');
  139.         $data->shops $shops;
  140.         $data->promo $request->query->get('promo');
  141.         $offset max(0$request->query->getInt('offset'0));
  142.         $findProduitsNouveaute = [];
  143.     //to be changed to read user roles
  144.         $isAdmin 0;
  145.         $user $security->getUser();
  146.         if($user){
  147.             $roles $user->getRoles();
  148.             // var_dump($roles);
  149.             if($roles[0] == "ROLE_ADMIN"){
  150.                 $isAdmin=1;
  151.             }
  152.         }
  153.         else{
  154.             $isAdmin=0;
  155.         }
  156.         //is valid assoccier avec assert constraint 
  157.         if($form->isSubmitted() && $form->isValid() ){
  158.             $produits $doctrine->getRepository(Produit::class)->findSearch($data,$offset,$isAdmin);         
  159.             $magasins $doctrine->getRepository(Magasin::class)->findAll();
  160.         }else{
  161.             $category $request->request->get('category'null);//for post 
  162.             if($category !=null){
  163.                 $data = new SearchData();
  164.                 $categories = [$category];
  165.                 $data->categories $categories;
  166.             }
  167.             //vip default if no category chosen
  168.             else{
  169.                 $findProduitsNouveaute $doctrine->getRepository(Produit::class)
  170.                 ->findProduitsNouveaute($data,$offset,$isAdmin);
  171.             }
  172.             //produitsNouveaute 
  173.             $produits $doctrine->getRepository(Produit::class)->findSearch($data,$offset,$isAdmin);
  174.             // $magasins = $doctrine->getRepository(Magasin::class)->findAll();
  175.             $magasins $doctrine->getRepository(Magasin::class)->findAll();
  176.             // var_dump(count($magasins));
  177.         }
  178.         return new Response($twig->render('produit/index.html.twig',[
  179.             'produits' => $produits,
  180.             'magasins' => $magasins,
  181.             '_locale' => $locale,
  182.             'produitsNouveaute' => $findProduitsNouveaute,
  183.             'form' => $form->createView(),
  184.             'previous' => $offset ProduitRepository::PAGINATOR_PER_PAGE,
  185.             'next' => min(count($produits), $offset ProduitRepository::PAGINATOR_PER_PAGE),
  186.         ])); 
  187.     }
  188.     
  189. //add edit product 
  190. #[Route('/produit/add'name'add_produit')]
  191. #[Route('/produit/edit/{id}'name'edit_produit')]
  192. public function new_edit(int $id =null  ,Request $request,EntityManagerInterface $entityManager,Produit $produit null,
  193.                             PictureService $pictureService,ParameterBagInterface $params
  194.                             ,TranslatorInterface $translator,LocaleSwitcher $localeSwitcher ): Response
  195. {
  196.     $this->denyAccessUnlessGranted('ROLE_ADMIN');
  197.     if ($id!=null){
  198.         $produit $entityManager->getRepository(Produit::class)->find($id);
  199.     }
  200.     if (!$produit) {
  201.         $produit = new Produit();
  202.         $produitVariants $produit->getProduitVariants();
  203.         $option  "add";
  204.     }
  205.     else{
  206.         $option  "edit";
  207.     }
  208.     // $category = $request->get('category');
  209.     // $category = $request->request->get('category');
  210.     // var_dump($category);die;
  211.     // creation d'un formulaire baser sur le $builder dans la class formationType
  212.     $form $this->createForm(ProductType::class, $produit);
  213.     $form->handleRequest($request);
  214.     // isValid () remplace les filter input 
  215.     if ($form->isSubmitted() && $form->isValid()) {
  216.         // recuperer les données
  217.         $produit $form->getData();
  218.          // On récupère les images
  219.          $images $form->get('images')->getData();
  220.          //var_dump("x1");
  221.             
  222.          foreach($images as $image){
  223.              // On définit le dossier de destination
  224.              $folder 'products';
  225.              // On appelle le service d'ajout
  226.              $fichier $pictureService->add($image$folder300300);
  227.              $img = new Image();
  228.              $img->setFileName($fichier);
  229.             //  $params =new ParameterBagInterface();
  230.              $pictureService =  new PictureService($params);
  231.              $img->setImageUrl($params->get('images_directory') . $folder);
  232.              $produit->addImage($img);
  233.          }
  234.         // var_dump($category);die;
  235.         // $produit->setCategory($category);
  236.         //prepare en pdo , on prepare a l'execution l'objet entreprise 
  237.         $produit->setUser($this->getUser());
  238.         
  239.         $produitVariants $form->get('produitVariants')->getData();
  240.         foreach($produitVariants as $produitVariant){
  241.             $produitVariant->setProduit($produit);
  242.             $produit->addProduitVariant($produitVariant);
  243.         } 
  244.         $date = new DateTime();
  245.         $produit->setPublishDate$date);
  246.          try{
  247.              $entityManager->persist($produit);
  248.          }
  249.             catch (Exception $e) {
  250.                 // Handle the exception
  251.                 // You can log the error or show a flash message
  252.                 // For example:
  253.                 $this->addFlash('error''An error occurred while saving the entity.');
  254.                 // var_dump("exception" + $exception);die;
  255.             }
  256.         // execute,inserer dans la bdd
  257.         // $entityManager->laragonflush();
  258.         $entityManager->flush();
  259.         // retourner a la page qui affiche toutes les formation
  260.         if ($option === 'edit') {
  261.             // Redirection vers la page du produit avec l'ID
  262.             return $this->redirectToRoute($option '_produit', [
  263.                 'id' => $produit->getId(),
  264.             ]);
  265.         } else {
  266.             // Redirection vers la page d'index de la catégorie
  267.             return $this->redirectToRoute($option.'_produit');
  268.             //return $this->redirectToRoute('category_index');
  269.         }
  270.         }
  271.     if ($request->query->has('_locale')) {
  272.         
  273.         
  274.         $locale =  $request->getSession()->get('_locale');
  275.         if($locale !=null){
  276.             $localeSwitcher->setLocale($locale);
  277.             $translator->setLocale($locale);    
  278.             // $request->getSession()->set('_locale',$locale);
  279.         }
  280.     }
  281.         
  282.     return $this->render('produit/add.html.twig', [
  283.         'formAddProduit' => $form->createView(),
  284.         'option' => $option
  285.     ]);
  286. }
  287.     
  288.     
  289.     // #[Route('/produit/all', name: 'all_product_filter', methods:'post')]
  290.     // public function getProducts(ProduitRepository $produitRepository): JsonResponse
  291.     // {
  292.     //     // Fetch products from the database
  293.     //     $products = $produitRepository->findAll();
  294.     //     // Return products as JSON
  295.     //     return $this->json($products);
  296.     // }
  297.     // #[Route('/produit/all', name: 'produit_all', methods: ['POST'])]
  298.     #[Route('/produits/ajax-filter'name'ajax_product_filter'methods: ['POST'])]
  299.     public function ajaxFilterProducts(Request $request
  300.     CsrfTokenManagerInterface $csrfTokenManager,
  301.     ProduitRepository $produitRepository,ManagerRegistry $doctrine,
  302.     Environment $twig,Security $security,SessionInterface $session,
  303.     TranslatorInterface $translator,LocaleSwitcher $localeSwitcher): JsonResponse
  304.      {
  305.         // $filterData = $request->request->all(); // Exemple de récupération des données envoyées via POST
  306.         // dd($filterData);
  307.         // dd($filterData);
  308.         $csrfToken $request->headers->get('X-CSRF-TOKEN');
  309.         // dd($csrfToken);
  310.         // if (!$this->isCsrfTokenValid('my-form', $csrfToken)) {
  311.         //     // dd('not valid csrf');
  312.         //     var_dump('ok');
  313.         //     return new JsonResponse(['error' => 'Invalid CSRF token'], 400);
  314.         // }
  315.           // Validate CSRF token
  316.         // $csrfToken = $request->request->get('_csrf_token');
  317.         if (!$this->validateCsrfToken($csrfToken)) {
  318.             return new JsonResponse(['error' => 'Invalid CSRF token'], 400);
  319.         }
  320.         // else{
  321.         //     return new JsonResponse(['valid' => 'okay  CSRF token'], 400);
  322.         // }
  323.         // Exemple de réponse JSON
  324.         // return new JsonResponse([
  325.         //     'success' => true,
  326.         //     'message' => 'Données filtrées avec succès',
  327.         //     'data' => $filterData
  328.         // ]);
  329.         // return new JsonResponse(['message' => 'Data processed successfully']);
  330.         // return new JsonResponse(['success' => 'Data processed']);
  331.         
  332.         $data = new SearchData();
  333.         $data->$request->request->get('q');
  334.         $data->categories $request->request->get('categories');
  335.         $data->promo $request->request->get('promo');
  336.         $data->min $request->request->get('min');
  337.         $data->max $request->request->get('max');
  338.         $data->dateproduction $request->request->get('dateproduction');
  339.         $data->dateproduction $request->request->get('dateexpiration');
  340.         
  341.         $findProduitsPromo= [];
  342.     //to be changed to read user roles
  343.         $isAdmin 0;
  344.         $user $security->getUser();
  345.         if($user){
  346.             $roles $user->getRoles();
  347.             // var_dump($roles);
  348.             if($roles[0] == "ROLE_ADMIN"){
  349.                 $isAdmin=1;
  350.             }
  351.         }
  352.         else{
  353.             $isAdmin=0;
  354.         }
  355.         // Récupérer les données de filtrage envoyées via AJAX
  356.         // $filterData = $request->request->all();
  357.         //filterData
  358.           // Validate CSRF token
  359.         // $csrfToken = $request->request->get('_token');
  360.         // if (!$csrfTokenManager->isTokenValid(new CsrfToken('my-form', $csrfToken))) {
  361.         //     return new JsonResponse(['error' => 'Invalid CSRF token'], 400);
  362.         // }
  363. // dd("x");
  364.         // Exemple de filtrage : Utilisez les critères de filtrage depuis le repository
  365.         //Array $shops from context 
  366.         // $shops = $this->shopContext->getShops();
  367.         // $data->shops = $shops;
  368.         // dd($shops[0]->getNom());
  369.         $products $produitRepository->findSearchPromo($data,$isAdmin);
  370.         // Formatage des produits pour un retour JSON
  371.         $productData = [];
  372.         foreach ($products as $product) {
  373.             $productData[] = [
  374.                 'id' => $product->getId(),
  375.                 'name' => $product->getProductName(),
  376.             ];
  377.         }
  378. // var_dump($productData);
  379.         return new JsonResponse($productData);
  380.     }
  381.     //show  products 
  382.     #[Route('/produit/{id}'name'show_produit')]
  383.     public function showstring $id,EntityManagerInterface $entityManager
  384.     ,TranslatorInterface $translator,LocaleSwitcher $localeSwitcher Request $request): Response
  385.     
  386.     {                                    
  387.         //get list of product by category to be send to show page then to display list of product to be edited ...gestion stock       
  388.         if ($id!=null){
  389.             $produit $entityManager->getRepository(Produit::class)->find($id);
  390.         }
  391.         if (!$produit) {
  392.             throw $this->createNotFoundException('Product not found');
  393.         }
  394.         $locale =  $request->getSession()->get('_locale');
  395.         if($locale !=null){
  396.             $localeSwitcher->setLocale($locale);
  397.             $translator->setLocale($locale);    
  398.         }
  399.         //to get the avriants of product grouped by for better display
  400.         // Group the variants by size
  401.         $groupedVariantssize = [];
  402.         foreach ($produit->getProduitVariants() as $variant) {
  403.             $paramSize $variant->getParamSize();
  404.             if ($paramSize !== null) {
  405.                 $size $paramSize->getSizeAbreviation();
  406.                 if ($size !== null) {
  407.                     $groupedVariantssize[$size][] = $variant;
  408.                 }
  409.             }
  410.         }
  411.         $groupedVariantscolor = [];
  412.         foreach ($produit->getProduitVariants() as $variant) {
  413.             $paramColor $variant->getParamColor();
  414.             if ($paramColor !== null) {
  415.                 $color $paramColor->getColorName();
  416.                 if ($color !== null) {
  417.                     $groupedVariantscolor[$color][] = $variant;
  418.                 }
  419.             }
  420.         }
  421.         $variantsArray = [];
  422.         foreach ($produit->getProduitVariants() as $variant) {
  423.             // Vérifier si la couleur existe déjà dans le tableau
  424.             if (($variant !== null && $variant->getParamColor() !== null) ) {
  425.                 // Si la couleur n'existe pas, on crée un nouveau tableau pour les tailles
  426.                 if ($variant->getParamColor() !== null) {
  427.                     $variantsArray[$variant->getParamColor()->getColorName()] = [];
  428.                 }
  429.             }
  430.             // Ajouter la taille au tableau des tailles de la couleur
  431.             if ($variant !== null && $variant->getParamSize() !== null) {
  432.                 $variantsArray[$variant->getParamColor()->getColorName()][] = $variant->getParamSize()->getSizeAbreviation();
  433.             }
  434.         }
  435.         return $this->render('produit/show.html.twig', [
  436.             'produit' => $produit,
  437.             'groupedVariantscolor' => $groupedVariantscolor,
  438.             'groupedVariantssize' => $groupedVariantssize,
  439.             'variants' =>$variantsArray  
  440.         ]); 
  441.         //old before variants
  442.         // return $this->render('produit/show.html.twig', [
  443.         //     'produit' => $produit
  444.         // ]);
  445.     }   
  446.     }