src/Controller/Front/HomeController.php line 47

Open in your IDE?
  1. <?php
  2. namespace App\Controller\Front;
  3. use App\Controller\Admin\ImageControllerTrait;
  4. use App\Entity\Category;
  5. use App\Entity\Declination;
  6. use App\Entity\Document;
  7. use App\Entity\Produit;
  8. use Doctrine\ORM\EntityManagerInterface;
  9. use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
  10. use Symfony\Component\HttpFoundation\Request;
  11. use Symfony\Component\HttpFoundation\Response;
  12. use Symfony\Component\Routing\Annotation\Route;
  13. use Symfony\Component\Serializer\Encoder\JsonEncoder;
  14. use Symfony\Component\Serializer\Normalizer\AbstractNormalizer;
  15. use Symfony\Component\Serializer\Normalizer\ObjectNormalizer;
  16. use Symfony\Component\Serializer\Serializer;
  17. use Symfony\Component\Serializer\SerializerInterface;
  18. use Symfony\Component\HttpFoundation\JsonResponse;
  19. class HomeController extends AbstractController
  20. {
  21.     use ImageControllerTrait;
  22.     /** @var EntityManagerInterface */
  23.     private $em;
  24.     /**
  25.      * @var Serializer
  26.      */
  27.     private $serializer;
  28.     public function __construct(EntityManagerInterface $manager,  SerializerInterface $serializer)
  29.     {
  30.         $this->em $manager;
  31.         $this->serializer $serializer;
  32.     }
  33.     /**
  34.      * @Route("/", name="home", options={"expose"=true})
  35.      */
  36.     public function home(): Response
  37.     {
  38.         $categories $this->em->getRepository(Category::class)->findBy(['showInHomepage' => 1]);
  39.         // On va récupérer les produits crées jusqu'à 3 mois
  40.         $date = new \DateTime('now');
  41.         $date->modify('-90 day');
  42.         // get the product repository for newest product
  43.         $produits $this->em->getRepository(Produit::class);
  44.         // build the query for the doctrine paginator
  45.         $query $produits->createQueryBuilder('p')
  46.             ->where('p.createdAt >= :date')
  47.             ->andWhere('p.deletedAt is null')
  48.             ->setParameter('date'$date)
  49.             ->orderBy('p.createdAt''DESC')
  50.             ->setMaxResults(10);
  51.         $products $query->getQuery()->getResult();
  52.         // Recupérer les images
  53.         foreach ($products as $product) {
  54.             // Sélectionner l'iamge par défaut
  55.             $pictures $product->getPicture()->filter(function ($element) {
  56.                 return $element->getIsSelected() == 1;
  57.             });
  58.             $picture_name = ($pictures->isEmpty()) ? '../front/assets-new/imgs/no-image.png' $pictures->first()->getImageName();
  59.             if (!$pictures->isEmpty() && file_exists($this->getParameter('kernel.project_dir') . "/public/images/" $picture_name) && !file_exists($this->getParameter('kernel.project_dir') . "/public/images/thumbs/" $picture_name))
  60.                 $this->resizeImage($picture_name);
  61.             if (!$pictures->isEmpty() && !file_exists($this->getParameter('kernel.project_dir') . "/public/images/" $picture_name) && !file_exists($this->getParameter('kernel.project_dir') . "/public/images/thumbs/" $picture_name))
  62.                 $picture_name 'no-image.png';
  63.             $product->image $picture_name;
  64.         };
  65.         $query $this->em->createQueryBuilder();
  66.         $query->add('select''p')
  67.             ->from('App\Entity\Produit''p')
  68.             ->join('App\Entity\ProduitDeclinationValue''d''with''d.produit=p')
  69.             ->join('App\Entity\DocumentDeclinationProduit''c''with''c.produitDeclinationValue=d')
  70.             ->where('p.deletedAt is null')
  71.             ->groupBy('p.id')
  72.             ->orderBy('count(p.id)''DESC')
  73.             ->setMaxResults(10);
  74.         $topProducts $query->getQuery()->getResult();
  75.         // Recupérer les images
  76.         foreach ($topProducts as $product) {
  77.             // Sélectionner l'iamge par défaut
  78.             $pictures $product->getPicture()->filter(function ($element) {
  79.                 return $element->getIsSelected() == 1;
  80.             });
  81.             $picture_name = ($pictures->isEmpty()) ? '../front/assets-new/imgs/no-image.png' $pictures->first()->getImageName();
  82.             if (!$pictures->isEmpty() && file_exists($this->getParameter('kernel.project_dir') . "/public/images/" $picture_name) && !file_exists($this->getParameter('kernel.project_dir') . "/public/images/thumbs/" $picture_name))
  83.                 $this->resizeImage($picture_name);
  84.             if (!$pictures->isEmpty() && !file_exists($this->getParameter('kernel.project_dir') . "/public/images/" $picture_name) && !file_exists($this->getParameter('kernel.project_dir') . "/public/images/thumbs/" $picture_name))
  85.                 $picture_name 'no-image.png';
  86.             $product->image $picture_name;
  87.         }
  88.         $document $this->em->getRepository(Document::class)->find(26092);
  89.         $max 200// Maximum pour avoir une livraison gratuite
  90.         return $this->render('front/soon.html.twig', array(
  91.             'products' => $products,
  92.             'topProducts' => $topProducts,
  93.             'document' => $document,
  94.             'max' => $max
  95.         ));
  96.     }
  97.     /**
  98.      * @Route("/api/category_home", name="api_category_home", options={"expose"=true}, methods={"GET"})
  99.      */
  100.     public function newCategoryHomePI(Request $request): Response
  101.     {
  102.         // Récupérer les catégories à afficher dans la page d'acceuil (4 catégories)
  103.         $categories $this->em->getRepository(Category::class)->findBy(['showInHomepage' => 1], ['id' => 'ASC'], 40);
  104.         $data = array();
  105.         // Récupérer les produits de chaque catégories (8 derniers produits)
  106.         foreach ($categories as $category) {
  107.             $produits $this->em->getRepository(Produit::class);
  108.             // Build the query for the doctrine paginator
  109.             $query $produits->createQueryBuilder('p');
  110.             $query->where('p.categories = :cat')
  111.                 ->setParameter('cat'$category)
  112.                 ->andWhere('p.deletedAt is null')
  113.                 ->orderBy('p.id''DESC')
  114.                 ->setMaxResults(8);
  115.             $products $query->getQuery()->getResult();
  116.             // Recupérer les images
  117.             foreach ($products as $product) {
  118.                 // Sélectionner l'iamge par défaut
  119.                 $pictures $product->getPicture()->filter(function ($element) {
  120.                     return $element->getIsSelected() == 1;
  121.                 });
  122.                 $picture_name = ($pictures->isEmpty()) ? '../front/assets-new/imgs/no-image.png' $pictures->first()->getImageName();
  123.                 if (!$pictures->isEmpty() && file_exists($this->getParameter('kernel.project_dir') . "/public/images/" $picture_name) && !file_exists($this->getParameter('kernel.project_dir') . "/public/images/thumbs/" $picture_name))
  124.                     $this->resizeImage($picture_name);
  125.                 if (!$pictures->isEmpty() && !file_exists($this->getParameter('kernel.project_dir') . "/public/images/" $picture_name) && !file_exists($this->getParameter('kernel.project_dir') . "/public/images/thumbs/" $picture_name))
  126.                     $picture_name 'no-image.png';
  127.                 $product->image $picture_name;
  128.             }
  129.             array_push($data, (object)[
  130.                 'category' => $category,
  131.                 'products' => $products
  132.             ]);
  133.         }
  134.         $response = [
  135.             'res' => 'OK',
  136.             'data' => $data,
  137.             'message' => 'Catégories récupérés avec succès.',
  138.         ];
  139.         return new jsonResponse($response);
  140.     }
  141.     /**
  142.      * @Route("/home", name="home_index")
  143.      */
  144.     public function index(): Response
  145.     {
  146.         $categories $this->em->getRepository(Category::class)->findBy(['showInHomepage' => 1]);
  147.         // On va récupérer les produits crées jusqu'à 3 mois
  148.         $date = new \DateTime('now');
  149.         $date->modify('-90 day');
  150.         // get the product repository for newest product
  151.         $produits $this->em->getRepository(Produit::class);
  152.         // build the query for the doctrine paginator
  153.         $query $produits->createQueryBuilder('p')
  154.             ->where('p.createdAt >= :date')
  155.             ->andWhere('p.deletedAt is null')
  156.             ->setParameter('date'$date)
  157.             ->orderBy('p.createdAt''DESC')
  158.             ->setMaxResults(10);
  159.         $products $query->getQuery()->getResult();
  160.         // Recupérer les images
  161.         foreach ($products as $product) {
  162.             // Sélectionner l'iamge par défaut
  163.             $pictures $product->getPicture()->filter(function ($element) {
  164.                 return $element->getIsSelected() == 1;
  165.             });
  166.             $picture_name = ($pictures->isEmpty()) ? '../front/assets-new/imgs/no-image.png' $pictures->first()->getImageName();
  167.             if (!$pictures->isEmpty() && file_exists($this->getParameter('kernel.project_dir') . "/public/images/" $picture_name) && !file_exists($this->getParameter('kernel.project_dir') . "/public/images/thumbs/" $picture_name))
  168.                 $this->resizeImage($picture_name);
  169.             if (!$pictures->isEmpty() && !file_exists($this->getParameter('kernel.project_dir') . "/public/images/" $picture_name) && !file_exists($this->getParameter('kernel.project_dir') . "/public/images/thumbs/" $picture_name))
  170.                 $picture_name 'no-image.png';
  171.             $product->image $picture_name;
  172.         };
  173.         $query $this->em->createQueryBuilder();
  174.         $query->add('select''p')
  175.             ->from('App\Entity\Produit''p')
  176.             ->join('App\Entity\ProduitDeclinationValue''d''with''d.produit=p')
  177.             ->join('App\Entity\DocumentDeclinationProduit''c''with''c.produitDeclinationValue=d')
  178.             ->where('p.deletedAt is null')
  179.             ->groupBy('p.id')
  180.             ->orderBy('count(p.id)''DESC')
  181.             ->setMaxResults(10);
  182.         $topProducts $query->getQuery()->getResult();
  183.         // Recupérer les images
  184.         foreach ($topProducts as $product) {
  185.             // Sélectionner l'iamge par défaut
  186.             $pictures $product->getPicture()->filter(function ($element) {
  187.                 return $element->getIsSelected() == 1;
  188.             });
  189.             $picture_name = ($pictures->isEmpty()) ? '../front/assets-new/imgs/no-image.png' $pictures->first()->getImageName();
  190.             if (!$pictures->isEmpty() && file_exists($this->getParameter('kernel.project_dir') . "/public/images/" $picture_name) && !file_exists($this->getParameter('kernel.project_dir') . "/public/images/thumbs/" $picture_name))
  191.                 $this->resizeImage($picture_name);
  192.             if (!$pictures->isEmpty() && !file_exists($this->getParameter('kernel.project_dir') . "/public/images/" $picture_name) && !file_exists($this->getParameter('kernel.project_dir') . "/public/images/thumbs/" $picture_name))
  193.                 $picture_name 'no-image.png';
  194.             $product->image $picture_name;
  195.         }
  196.         $document $this->em->getRepository(Document::class)->find(26092);
  197.         $max 200// Maximum pour avoir une livraison gratuite
  198.         return $this->render('front/home.html.twig', array(
  199.             'products' => $products,
  200.             'topProducts' => $topProducts,
  201.             'document' => $document,
  202.             'max' => $max
  203.         ));
  204.     }
  205.     /**
  206.      * @Route("/new-products", name="new_products")
  207.      */
  208.     public function newProducts(): Response
  209.     {
  210.         return $this->render('front/pages/newProducts.html.twig');
  211.     }
  212.     /**
  213.      * @Route("/api/new_products", name="api_new_products", options={"expose"=true}, methods={"GET"})
  214.      */
  215.     public function newProductsAPI(Request $request): Response
  216.     {
  217.         $page $request->query->get('page');
  218.         $orderBy $request->query->get('orderBy');
  219.         //Les Filtres de recherche
  220.         $tailles preg_split('@,@'$request->query->get('tailles'), NULLPREG_SPLIT_NO_EMPTY);
  221.         $couleurs preg_split('@,@'$request->query->get('couleurs'), NULLPREG_SPLIT_NO_EMPTY);
  222.         $maxPrice floatval($request->query->get('maxPrice'));
  223.         $minPrice floatval($request->query->get('minPrice'));
  224.         // On va récupérer les produits crées jusqu'à 3 mois
  225.         $date = new \DateTime('now');
  226.         $date->modify('-90 day');
  227.         // get the product repository
  228.         $produits $this->em->getRepository(Produit::class);
  229.         // build the query for the doctrine paginator
  230.         $query $produits->createQueryBuilder('p')
  231.             ->where('p.createdAt >= :date')
  232.             ->andWhere('p.deletedAt is null')
  233.             ->setParameter('date'$date)
  234.             ->andWhere('p.price_ttc between :minPrice and :maxPrice')
  235.             ->setParameter('maxPrice'$maxPrice)
  236.             ->setParameter('minPrice'$minPrice);
  237.         // Appliquer les filtres de tailles si ils sont appliqués
  238.         if ($tailles && !$couleurs) {
  239.             $declination $this->em->getRepository(Declination::class)->find(1);
  240.             $query->innerJoin('App\Entity\ProduitDeclinationValue''d''with''d.produit=p')
  241.                 ->innerJoin('App\Entity\GroupDeclinationValue''g''with''g.produitDeclination= d')
  242.                 ->innerJoin('App\Entity\ValueDeclination''v''with''v= g.value')
  243.                 ->andWhere("v.name in (:tailles)")
  244.                 ->andWhere('v.declination = :declination')
  245.                 ->setParameter('declination'$declination)
  246.                 ->setParameter('tailles'$tailles);
  247.         }
  248.         // Appliquer les filtres de couleurs si ils sont appliqués seulement
  249.         if ($couleurs && !$tailles) {
  250.             $declination $this->em->getRepository(Declination::class)->find(2);
  251.             $query->innerJoin('App\Entity\ProduitDeclinationValue''d''with''d.produit=p')
  252.                 ->innerJoin('App\Entity\GroupDeclinationValue''g''with''g.produitDeclination= d')
  253.                 ->innerJoin('App\Entity\ValueDeclination''v''with''v= g.value')
  254.                 ->andWhere("v.id in (:couleurs) or v.parent in (:couleurs)")
  255.                 ->andWhere('v.declination = :declination')
  256.                 ->setParameter('declination'$declination)
  257.                 ->setParameter('couleurs'$couleurs);
  258.         }
  259.         // Appliquer les filtres de tailles et couleurs appliqués les deux
  260.         if ($tailles && $couleurs) {
  261.             $declinationTaille $this->em->getRepository(Declination::class)->find(1);
  262.             $declinationCouleur $this->em->getRepository(Declination::class)->find(2);
  263.             // Fusionner les deux filtres en un seul
  264.             $filtres array_merge($tailles$couleurs);
  265.             $query->innerJoin('App\Entity\ProduitDeclinationValue''d''with''d.produit=p')
  266.                 ->innerJoin('App\Entity\GroupDeclinationValue''g''with''g.produitDeclination= d')
  267.                 ->innerJoin('App\Entity\ValueDeclination''v''with''v= g.value')
  268.                 ->andWhere("v.name in (:tailles) or v.id in (:couleurs) or v.parent in (:couleurs)")
  269.                 /* ->andWhere('v.declination = :declinationTaille OR v.declination = :declinationCouleur')
  270.                  ->setParameter('declinationTaille', $declinationTaille)*/
  271.                 ->setParameter('couleurs'$couleurs)
  272.                 ->setParameter('tailles'$tailles);
  273.         }
  274.         // Order by
  275.         switch ($orderBy) {
  276.             case 1:
  277.                 $query->orderBy('p.name''ASC');
  278.                 break;
  279.             case 2:
  280.                 $query->orderBy('p.name''DESC');
  281.                 break;
  282.             case 3:
  283.                 $query->orderBy('p.price_ttc''ASC');
  284.                 break;
  285.             case 4:
  286.                 $query->orderBy('p.price_ttc''DESC');
  287.                 break;
  288.         }
  289.         $query->getQuery();
  290.         // set page size
  291.         $pageSize $request->query->get('pageSize');;
  292.         // load doctrine Paginator
  293.         $paginator = new \Doctrine\ORM\Tools\Pagination\Paginator($query);
  294.         // you can get total items
  295.         $totalItems count($paginator);
  296.         // get total pages
  297.         $pagesCount ceil($totalItems $pageSize);
  298.         // now get one page's items:
  299.         $paginator
  300.             ->getQuery()
  301.             ->setFirstResult($pageSize * ($page-1)) // set the offset
  302.             ->setMaxResults($pageSize); // set the limit
  303.         $data= array();
  304.         foreach ($paginator as $pageItem) {
  305.             // do stuff with results...
  306.             array_push($data,$pageItem);
  307.         }
  308.         // Recupérer les images
  309.         foreach ($data as $product) {
  310.             // Sélectionner l'iamge par défaut
  311.             $pictures $product->getPicture()->filter(function ($element) {
  312.                 return $element->getIsSelected() == 1;
  313.             });
  314.             $picture_name = ($pictures->isEmpty()) ? '../front/assets-new/imgs/no-image.png' $pictures->first()->getImageName();
  315.             if (!$pictures->isEmpty() && file_exists($this->getParameter('kernel.project_dir') . "/public/images/" $picture_name) && !file_exists($this->getParameter('kernel.project_dir') . "/public/images/thumbs/" $picture_name))
  316.                 $this->resizeImage($picture_name);
  317.             /*if(!$pictures->isEmpty() && !file_exists($this->getParameter('kernel.project_dir')."/public/images/".$picture_name) && !file_exists($this->getParameter('kernel.project_dir')."/public/images/thumbs/".$picture_name))
  318.                 $picture_name = 'no-image.png';*/
  319.             $product->image $picture_name;
  320.         }
  321.         // Les nombres de pages
  322.         $pages = array();
  323.         for($i=max($page-31);$i<=min($page+3$pagesCount) ;$i++){
  324.             array_push($pages,$i);
  325.         }
  326.         $response = [
  327.             'res' => 'OK',
  328.             'data' => $data,
  329.             'pagesCount' => $pagesCount,
  330.             'total' => $totalItems,
  331.             'pages' => $pages,
  332.             'message' => 'Produits récupérés avec succès.',
  333.         ];
  334.         return new jsonResponse($response);
  335.     }
  336.     /**
  337.      * @Route("/promotion", name="promo_products")
  338.      */
  339.     public function promoProducts(): Response
  340.     {
  341.         return $this->render('front/pages/promoProducts.html.twig');
  342.     }
  343.     /**
  344.      * @Route("/api/promotion", name="api_promo_products", options={"expose"=true}, methods={"GET"})
  345.      */
  346.     public function promoProductsAPI(Request $request): Response
  347.     {
  348.         $page $request->query->get('page');
  349.         $orderBy $request->query->get('orderBy');
  350.         //Les Filtres de recherche
  351.         $tailles preg_split('@,@'$request->query->get('tailles'), NULLPREG_SPLIT_NO_EMPTY);
  352.         $couleurs preg_split('@,@'$request->query->get('couleurs'), NULLPREG_SPLIT_NO_EMPTY);
  353.         $maxPrice floatval($request->query->get('maxPrice'));
  354.         $minPrice floatval($request->query->get('minPrice'));
  355.         // get the product repository
  356.         $produits $this->em->getRepository(Produit::class);
  357.         // Récupérer la date encours
  358.         $date = new \DateTime('now');
  359.         $query $this->em->createQueryBuilder();
  360.         $query->add('select''p')
  361.             ->from('App\Entity\Produit''p')
  362.             ->join('App\Entity\Promotion''c''with''p.promotion=c')
  363.             ->where('p.promotion is not null')
  364.             ->andWhere('c.startAt <= :date')
  365.             ->andWhere('c.endAt >= :date')
  366.             ->setParameter('date'$date)
  367.             ->andWhere('p.deletedAt is null')
  368.             ->andWhere('p.price_ttc between :minPrice and :maxPrice')
  369.             ->setParameter('maxPrice'$maxPrice)
  370.             ->setParameter('minPrice'$minPrice);
  371.         // Appliquer les filtres de tailles si ils sont appliqués
  372.         if ($tailles && !$couleurs) {
  373.             $declination $this->em->getRepository(Declination::class)->find(1);
  374.             $query->innerJoin('App\Entity\ProduitDeclinationValue''d''with''d.produit=p')
  375.                 ->innerJoin('App\Entity\GroupDeclinationValue''g''with''g.produitDeclination= d')
  376.                 ->innerJoin('App\Entity\ValueDeclination''v''with''v= g.value')
  377.                 ->andWhere("v.name in (:tailles)")
  378.                 ->andWhere('v.declination = :declination')
  379.                 ->setParameter('declination'$declination)
  380.                 ->setParameter('tailles'$tailles);
  381.         }
  382.         // Appliquer les filtres de couleurs si ils sont appliqués seulement
  383.         if ($couleurs && !$tailles) {
  384.             $declination $this->em->getRepository(Declination::class)->find(2);
  385.             $query->innerJoin('App\Entity\ProduitDeclinationValue''d''with''d.produit=p')
  386.                 ->innerJoin('App\Entity\GroupDeclinationValue''g''with''g.produitDeclination= d')
  387.                 ->innerJoin('App\Entity\ValueDeclination''v''with''v= g.value')
  388.                 ->andWhere("v.id in (:couleurs) or v.parent in (:couleurs)")
  389.                 ->andWhere('v.declination = :declination')
  390.                 ->setParameter('declination'$declination)
  391.                 ->setParameter('couleurs'$couleurs);
  392.         }
  393.         // Appliquer les filtres de tailles et couleurs appliqués les deux
  394.         if ($tailles && $couleurs) {
  395.             $declinationTaille $this->em->getRepository(Declination::class)->find(1);
  396.             $declinationCouleur $this->em->getRepository(Declination::class)->find(2);
  397.             // Fusionner les deux filtres en un seul
  398.             $filtres array_merge($tailles$couleurs);
  399.             $query->innerJoin('App\Entity\ProduitDeclinationValue''d''with''d.produit=p')
  400.                 ->innerJoin('App\Entity\GroupDeclinationValue''g''with''g.produitDeclination= d')
  401.                 ->innerJoin('App\Entity\ValueDeclination''v''with''v= g.value')
  402.                 ->andWhere("v.name in (:tailles) or v.id in (:couleurs) or v.parent in (:couleurs)")
  403.                 /* ->andWhere('v.declination = :declinationTaille OR v.declination = :declinationCouleur')
  404.                  ->setParameter('declinationTaille', $declinationTaille)*/
  405.                 ->setParameter('couleurs'$couleurs)
  406.                 ->setParameter('tailles'$tailles);
  407.         }
  408.         // Order by
  409.         switch ($orderBy) {
  410.             case 1:
  411.                 $query->orderBy('p.name''ASC');
  412.                 break;
  413.             case 2:
  414.                 $query->orderBy('p.name''DESC');
  415.                 break;
  416.             case 3:
  417.                 $query->orderBy('p.price_ttc''ASC');
  418.                 break;
  419.             case 4:
  420.                 $query->orderBy('p.price_ttc''DESC');
  421.                 break;
  422.         }
  423.         // set page size
  424.         $pageSize $request->query->get('pageSize');;
  425.         // load doctrine Paginator
  426.         $paginator = new \Doctrine\ORM\Tools\Pagination\Paginator($query);
  427.         // you can get total items
  428.         $totalItems count($paginator);
  429.         // get total pages
  430.         $pagesCount ceil($totalItems $pageSize);
  431.         // now get one page's items:
  432.         $paginator
  433.             ->getQuery()
  434.             ->setFirstResult($pageSize * ($page-1)) // set the offset
  435.             ->setMaxResults($pageSize); // set the limit
  436.         $data= array();
  437.         foreach ($paginator as $pageItem) {
  438.             // do stuff with results...
  439.             array_push($data,$pageItem);
  440.         }
  441.         foreach ($data as $product) {
  442.             // Sélectionner l'iamge par défaut
  443.             $pictures $product->getPicture()->filter(function ($element) {
  444.                 return $element->getIsSelected() == 1;
  445.             });
  446.             $picture_name = ($pictures->isEmpty()) ? '../front/assets-new/imgs/no-image.png' $pictures->first()->getImageName();
  447.             if (!$pictures->isEmpty() && file_exists($this->getParameter('kernel.project_dir') . "/public/images/" $picture_name) && !file_exists($this->getParameter('kernel.project_dir') . "/public/images/thumbs/" $picture_name))
  448.                 $this->resizeImage($picture_name);
  449.             /*if(!$pictures->isEmpty() && !file_exists($this->getParameter('kernel.project_dir')."/public/images/".$picture_name) && !file_exists($this->getParameter('kernel.project_dir')."/public/images/thumbs/".$picture_name))
  450.                 $picture_name = 'no-image.png';*/
  451.             $product->image $picture_name;
  452.         }
  453.         // Les nombres de pages
  454.         $pages = array();
  455.         for($i=max($page-31);$i<=min($page+3$pagesCount) ;$i++){
  456.             array_push($pages,$i);
  457.         }
  458.         $response = [
  459.             'res' => 'OK',
  460.             'data' => $data,
  461.             'pagesCount' => $pagesCount,
  462.             'total' => $totalItems,
  463.             'pages' => $pages,
  464.             'message' => 'Produits récupérés avec succès.',
  465.         ];
  466.         return new jsonResponse($response);
  467.     }
  468.     /**
  469.      * @Route("/search/{idCategory}/{search}", name="product_search", options={"expose"=true}, methods={"GET"})
  470.      */
  471.     public function searchProducts(Request $request,$idCategory,$search): Response
  472.     {
  473.         return $this->render('front/pages/searchProducts.html.twig', [
  474.             'idCategory' => $idCategory,
  475.             'search' => $search,
  476.         ]);
  477.     }
  478.     /**
  479.      * @Route("/api/product-search", name="api_product_search", options={"expose"=true}, methods={"GET"})
  480.      */
  481.     public function serachProductsAPI(Request $request): Response
  482.     {
  483.         $category_id $request->query->get('id');
  484.         $search $request->query->get('search');
  485.         $page $request->query->get('page');
  486.         $orderBy $request->query->get('orderBy');
  487.         $category $this->em->getRepository(Category::class)->find($category_id);
  488.         //Les Filtres de recherche
  489.         $tailles preg_split('@,@'$request->query->get('tailles'), NULLPREG_SPLIT_NO_EMPTY);
  490.         $couleurs preg_split('@,@'$request->query->get('couleurs'), NULLPREG_SPLIT_NO_EMPTY);
  491.         $maxPrice floatval($request->query->get('maxPrice'));
  492.         $minPrice floatval($request->query->get('minPrice'));
  493.         // get the product repository
  494.         $produits $this->em->getRepository(Produit::class);
  495.         // build the query for the doctrine paginator
  496.         $query $produits->createQueryBuilder('p')
  497.             ->where('p.name like :search OR p.description like :search OR p.reference like :search')
  498.             ->setParameter('search''%' $search '%')
  499.             ->andWhere('p.deletedAt is null')
  500.             ->andWhere('p.price_ttc between :minPrice and :maxPrice')
  501.             ->setParameter('maxPrice'$maxPrice)
  502.             ->setParameter('minPrice'$minPrice);
  503.         // Si catégorie sélectionné
  504.         if ($category) {
  505.             $query->andWhere('p.categories = :cat')
  506.                 ->setParameter('cat'$category);
  507.         }
  508.         // Appliquer les filtres de tailles si ils sont appliqués
  509.         if ($tailles && !$couleurs) {
  510.             $declination $this->em->getRepository(Declination::class)->find(1);
  511.             $query->innerJoin('App\Entity\ProduitDeclinationValue''d''with''d.produit=p')
  512.                 ->innerJoin('App\Entity\GroupDeclinationValue''g''with''g.produitDeclination= d')
  513.                 ->innerJoin('App\Entity\ValueDeclination''v''with''v= g.value')
  514.                 ->andWhere("v.name in (:tailles)")
  515.                 ->andWhere('v.declination = :declination')
  516.                 ->setParameter('declination'$declination)
  517.                 ->setParameter('tailles'$tailles);
  518.         }
  519.         // Appliquer les filtres de couleurs si ils sont appliqués seulement
  520.         if ($couleurs && !$tailles) {
  521.             $declination $this->em->getRepository(Declination::class)->find(2);
  522.             $query->innerJoin('App\Entity\ProduitDeclinationValue''d''with''d.produit=p')
  523.                 ->innerJoin('App\Entity\GroupDeclinationValue''g''with''g.produitDeclination= d')
  524.                 ->innerJoin('App\Entity\ValueDeclination''v''with''v= g.value')
  525.                 ->andWhere("v.id in (:couleurs) or v.parent in (:couleurs)")
  526.                 ->andWhere('v.declination = :declination')
  527.                 ->setParameter('declination'$declination)
  528.                 ->setParameter('couleurs'$couleurs);
  529.         }
  530.         // Appliquer les filtres de tailles et couleurs appliqués les deux
  531.         if ($tailles && $couleurs) {
  532.             $declinationTaille $this->em->getRepository(Declination::class)->find(1);
  533.             $declinationCouleur $this->em->getRepository(Declination::class)->find(2);
  534.             // Fusionner les deux filtres en un seul
  535.             $filtres array_merge($tailles$couleurs);
  536.             $query->innerJoin('App\Entity\ProduitDeclinationValue''d''with''d.produit=p')
  537.                 ->innerJoin('App\Entity\GroupDeclinationValue''g''with''g.produitDeclination= d')
  538.                 ->innerJoin('App\Entity\ValueDeclination''v''with''v= g.value')
  539.                 ->andWhere("v.name in (:tailles) or v.id in (:couleurs) or v.parent in (:couleurs)")
  540.                 /* ->andWhere('v.declination = :declinationTaille OR v.declination = :declinationCouleur')
  541.                  ->setParameter('declinationTaille', $declinationTaille)*/
  542.                 ->setParameter('couleurs'$couleurs)
  543.                 ->setParameter('tailles'$tailles);
  544.         }
  545.         // Order by
  546.         switch ($orderBy) {
  547.             case 1:
  548.                 $query->orderBy('p.name''ASC');
  549.                 break;
  550.             case 2:
  551.                 $query->orderBy('p.name''DESC');
  552.                 break;
  553.                 case 3:
  554.                     $query->orderBy('p.price_ttc''ASC');
  555.                     break;
  556.                 case 4:
  557.                     $query->orderBy('p.price_ttc''DESC');
  558.                     break;
  559.             }
  560.             $query->getQuery();
  561.         // set page size
  562.         $pageSize $request->query->get('pageSize');;
  563.         // load doctrine Paginator
  564.         $paginator = new \Doctrine\ORM\Tools\Pagination\Paginator($query);
  565.         // you can get total items
  566.         $totalItems count($paginator);
  567.         // get total pages
  568.         $pagesCount ceil($totalItems $pageSize);
  569.         // now get one page's items:
  570.         $paginator
  571.             ->getQuery()
  572.             ->setFirstResult($pageSize * ($page-1)) // set the offset
  573.             ->setMaxResults($pageSize); // set the limit
  574.         $data= array();
  575.         foreach ($paginator as $pageItem) {
  576.             // do stuff with results...
  577.             // A vérifier
  578.             /*if ($tailles && $couleurs) {
  579.                 $filtres = array_merge($tailles, $couleurs);
  580.                 // Vérifier si les declinaison respectes les filtres
  581.                 foreach ($pageItem->getProduitDeclinationValues() as $entity) {
  582.                     foreach ($entity->getGroupDeclinationValues() as $group) {
  583.                         if (!in_array($group->getValue()->getName(), $filtres)){
  584.                             break 2;
  585.                         }
  586.                     }
  587.                     array_push($data, $pageItem);
  588.                 }
  589.             }
  590.             else{
  591.                 array_push($data, $pageItem);
  592.             }*/
  593.             array_push($data$pageItem);
  594.         }
  595.         foreach ($data as $product){
  596.             // Sélectionner l'iamge par défaut
  597.             $pictures $product->getPicture()->filter(function($element) {
  598.                 return $element->getIsSelected() == 1;
  599.             });
  600.             $picture_name = ($pictures->isEmpty()) ? '../front/assets-new/imgs/no-image.png' $pictures->first()->getImageName();
  601.             if(!$pictures->isEmpty() && file_exists($this->getParameter('kernel.project_dir')."/public/images/".$picture_name) && !file_exists($this->getParameter('kernel.project_dir')."/public/images/thumbs/".$picture_name))
  602.                 $this->resizeImage($picture_name);
  603.             /*if(!$pictures->isEmpty() && !file_exists($this->getParameter('kernel.project_dir')."/public/images/".$picture_name) && !file_exists($this->getParameter('kernel.project_dir')."/public/images/thumbs/".$picture_name))
  604.                 $picture_name = 'no-image.png';*/
  605.             $product->image $picture_name;
  606.         }
  607.         // Les nombres de pages
  608.         $pages = array();
  609.         for($i=max($page-31);$i<=min($page+3$pagesCount) ;$i++){
  610.             array_push($pages,$i);
  611.         }
  612.         $response = [
  613.             'res' => 'OK',
  614.             'data' => $data,
  615.             'pagesCount' => $pagesCount,
  616.             'total' => $totalItems,
  617.             'pages' => $pages,
  618.             'message' => 'Produits récupérés avec succès.',
  619.         ];
  620.         return new jsonResponse($response);
  621.     }
  622.     /**
  623.      * @Route("/good-plan", name="pack_products")
  624.      */
  625.     public function goodPlan(): Response
  626.     {
  627.         return $this->render('front/pages/packProducts.html.twig');
  628.     }
  629.     /**
  630.      * @Route("/who-are-we", name="who_are_we")
  631.      */
  632.     public function whoAreWe(): Response
  633.     {
  634.         return $this->render('front/pages/whoAreWe.html.twig');
  635.     }
  636.     /**
  637.      * @Route("/delivery-information", name="delivery_information")
  638.      */
  639.     public function deliveryInformation(): Response
  640.     {
  641.         return $this->render('front/pages/deliveryInformation.html.twig');
  642.     }
  643.     /**
  644.      * @Route("/return-and-exchange", name="return_and_exchange")
  645.      */
  646.     public function returnAndExchange(): Response
  647.     {
  648.         return $this->render('front/pages/returnAndExchange.html.twig');
  649.     }
  650.     /**
  651.      * @Route("/question", name="question")
  652.      */
  653.     public function question(): Response
  654.     {
  655.         return $this->render('front/pages/question.html.twig');
  656.     }
  657.     /**
  658.      * @Route("/size-guide", name="size_guide")
  659.      */
  660.     public function sizeGuide(): Response
  661.     {
  662.         return $this->render('front/pages/sizeGuide.html.twig');
  663.     }
  664.     /**
  665.      * @Route("/terms-of-sales", name="terms_of_sales")
  666.      */
  667.     public function termsOfSales(): Response
  668.     {
  669.         return $this->render('front/pages/termsOfSales.html.twig');
  670.     }
  671.     /**
  672.      * @Route("/contact", name="contact")
  673.      */
  674.     public function contact(): Response
  675.     {
  676.         return $this->render('front/pages/contact.html.twig');
  677.     }
  678. }