src/Controller/Front/HomeController.php line 1188

Open in your IDE?
  1. <?php
  2. namespace App\Controller\Front;
  3. use App\Entity\Category;
  4. use App\Entity\Declination;
  5. use App\Entity\Produit;
  6. use App\Entity\Slider;
  7. use App\Entity\ProduitDeclinationValue;
  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 ImageTrait;
  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.         $sliders=$this->em->getRepository(Slider::class)->findBy(['isActive'=>true],['order'=>'asc']);
  45.         // Requete pour récupérer la nouvelle collection
  46.         $query $produits->createQueryBuilder('p')
  47.             ->where('p.createdAt >= :date')
  48.             ->andWhere('p.deletedAt is null')
  49.             ->andWhere('p.showInWebSite = 1')
  50.             ->setParameter('date'$date)
  51.             ->orderBy('p.createdAt''DESC')
  52.             ->setMaxResults(10);
  53.         $products $query->getQuery()->getResult();
  54.         shuffle($products);
  55.         $products array_slice($products010);
  56.         // Recupérer les images
  57.         foreach ($products as $product) {
  58.             $product->image $this->getDefaultImage($product);
  59.         };
  60.         // Requête pour récupérer les top ventes
  61.         // On va récupérer les produits crées jusqu'à 1 mois
  62.         $date = new \DateTime('now');
  63.         $date->modify('-30 day');
  64.         $query $this->em->createQueryBuilder();
  65.         $query->add('select''p')
  66.             ->from('App\Entity\Produit''p')
  67.             ->join('App\Entity\ProduitDeclinationValue''d''with''d.produit=p')
  68.             ->join('App\Entity\DocumentDeclinationProduit''c''with''c.produitDeclinationValue=d')
  69.             ->where('p.deletedAt is null')
  70.             ->andWhere('c.createdAt > = :date')
  71.             ->andWhere('p.showInWebSite = 1')
  72.             ->setParameter('date'$date)
  73.             ->groupBy('p.id')
  74.             ->orderBy('count(p.id)''DESC')
  75.             ->setMaxResults(50);
  76.         // dernierere 90 jours
  77.         $topProducts $query->getQuery()->getResult();
  78.         //shuffle the $topproduct array and get the first 10 elements
  79.         shuffle($topProducts);
  80.         $topProducts array_slice($topProducts010);
  81.         // Recupérer les images
  82.         foreach ($topProducts as $product) {
  83.             $product->image $this->getDefaultImage$product);
  84.         }
  85.          // Maximum pour avoir une livraison gratuite
  86.         $max = isset($_ENV['FREE_DELIVERY_AMOUNT']) ? floatval($_ENV['FREE_DELIVERY_AMOUNT']) : 0;
  87.         $publicDir=$this->getParameter('kernel.project_dir')."/public";
  88.         if($this->getParameter('app.under_construction')=="true")
  89.             return $this->render('front/soon.html.twig');
  90.         else
  91.             return $this->render('front/home.html.twig', array(
  92.                 'sliders'=>$sliders,
  93.                 'products' => $products,
  94.                 'topProducts' => $topProducts,
  95.                 'max' => $max,
  96.                 'exist_banner1'=>file_exists($publicDir ."/images/banner/banner-9.jpg"),
  97.                 'exist_banner2'=>file_exists($publicDir."/images/banner/banner-10.jpg")
  98.             ));
  99.     }
  100.     /**
  101.      * @Route("/api/category_home", name="api_category_home", options={"expose"=true}, methods={"GET"})
  102.      */
  103.     public function newCategoryHomeAPI(Request $request): Response
  104.     {
  105.         // Récupérer les catégories à afficher dans la page d'acceuil (4 catégories)
  106.         $categories $this->em->getRepository(Category::class)->findBy(['showInHomepage' => 1], ['homepageOrder' => 'ASC'], 100);
  107.         // création de catégorie virtuelle Meilleure sélection
  108.        /* $category = new Category();
  109.         $category->setName('Meilleure sélection');
  110.         array_unshift($categories, $category);*/
  111.         $data = array();
  112.         // Récupérer les produits de chaque catégorie (8 derniers produits)
  113.         foreach ($categories as $category) {
  114.             $produits $this->em->getRepository(Produit::class);
  115.             // Build the query for the doctrine paginator
  116.             $query $produits->createQueryBuilder('p');
  117.            /* if( $category->getName() == 'Meilleure sélection') {
  118.                 $query->where('p.bestSelection = 1')
  119.                     ->andWhere('p.deletedAt is null')
  120.                     ->andWhere('p.showInWebSite = 1')
  121.                     ->orderBy('p.id', 'DESC')
  122.                     ->setMaxResults(30);
  123.             } else {*/
  124.                 $query->where('p.categories = :cat')
  125.                     ->setParameter('cat'$category)
  126.                     ->andWhere('p.deletedAt is null')
  127.                     ->andWhere('p.showInWebSite = 1')
  128.                     ->orderBy('p.id''DESC')
  129.                     ->setMaxResults(30);
  130.           /*  }*/
  131.             $products $query->getQuery()->getResult();
  132.             shuffle($products);
  133.             $products array_slice($products08);
  134.             // Recupérer les images
  135.             foreach ($products as $product) {
  136.                 $product->image $this->getDefaultImage($product);
  137.             }
  138.             array_push($data, (object)[
  139.                 'category' => $category,
  140.                 'products' => $products
  141.             ]);
  142.         }
  143.         $response = [
  144.             'res' => 'OK',
  145.             'data' => $data,
  146.             'message' => 'Catégories récupérés avec succès.',
  147.         ];
  148.         return new jsonResponse($response);
  149.     }
  150.     /**
  151.      * @Route("/home", name="home_index")
  152.      */
  153.     public function index(): Response
  154.     {
  155.         $categories $this->em->getRepository(Category::class)->findBy(['showInHomepage' => 1]);
  156.         // On va récupérer les produits crées jusqu'à 3 mois
  157.         $date = new \DateTime('now');
  158.         $date->modify('-90 day');
  159.         // get the product repository for newest product
  160.         $produits $this->em->getRepository(Produit::class);
  161.         // build the query for the doctrine paginator
  162.         $query $produits->createQueryBuilder('p')
  163.             ->where('p.createdAt >= :date')
  164.             ->andWhere('p.deletedAt is null')
  165.             ->setParameter('date'$date)
  166.             ->orderBy('p.createdAt''DESC')
  167.             ->setMaxResults(10);
  168.         $products $query->getQuery()->getResult();
  169.         // Recupérer les images
  170.         foreach ($products as $product) {
  171.             $product->image $this->getDefaultImage$product);
  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.             $product->image $this->getDefaultImage$product);
  186.         }
  187.         // Maximum pour avoir une livraison gratuite
  188.         $max = isset($_ENV['FREE_DELIVERY_AMOUNT']) ? floatval($_ENV['FREE_DELIVERY_AMOUNT']) : 0;
  189.         return $this->render('front/home.html.twig', array(
  190.             'products' => $products,
  191.             'topProducts' => $topProducts,
  192.             'max' => $max
  193.         ));
  194.     }
  195.     /**
  196.      * @Route("/new-products", name="new_products")
  197.      */
  198.     public function newProducts(): Response
  199.     {
  200.         return $this->render('front/pages/newProducts.html.twig');
  201.     }
  202.     /**
  203.      * @Route("/new-products-dec", name="new_products_dec")
  204.      */
  205.     public function newProductsDec(): Response
  206.     {
  207.         return $this->render('front/dec/newProductsDec.html.twig');
  208.     }
  209.     /**
  210.      * @Route("/api/new-products", name="api_new_products", options={"expose"=true}, methods={"GET"})
  211.      */
  212.     public function newProductsAPI(Request $request): Response
  213.     {
  214.         $page $request->query->get('page');
  215.         $orderBy $request->query->get('orderBy');
  216.         //Les Filtres de recherche
  217.         $tailles preg_split('@,@'$request->query->get('tailles'), NULLPREG_SPLIT_NO_EMPTY);
  218.         $couleurs preg_split('@,@'$request->query->get('couleurs'), NULLPREG_SPLIT_NO_EMPTY);
  219.         $maxPrice floatval($request->query->get('maxPrice'));
  220.         $minPrice floatval($request->query->get('minPrice'));
  221.         // On va récupérer les produits crées jusqu'à 3 mois
  222.         $date = new \DateTime('now');
  223.         $date->modify('-90 day');
  224.         // build the query for the doctrine paginator
  225.         $query $this->em->getRepository(Produit::class)->createQueryBuilder('p')
  226.             ->where('p.createdAt >= :date')
  227.             ->andWhere('p.deletedAt is null')
  228.             ->andWhere('p.showInWebSite = 1')
  229.             ->setParameter('date'$date)
  230.             ->andWhere('p.price_ttc between :minPrice and :maxPrice')
  231.             ->setParameter('maxPrice'$maxPrice)
  232.             ->setParameter('minPrice'$minPrice);
  233.         // Appliquer les filtres de tailles si ils sont appliqués
  234.         if( $tailles && !$couleurs) {
  235.             $declination $this->em->getRepository(Declination::class)->find(1);
  236.             $query->innerJoin('App\Entity\ProduitDeclinationValue''d''with''d.produit=p')
  237.                 ->innerJoin('App\Entity\GroupDeclinationValue''g''with''g.produitDeclination= d')
  238.                 ->innerJoin('App\Entity\ValueDeclination''v''with''v= g.value')
  239.                 ->andWhere("v.name in (:tailles)")
  240.                 ->andWhere('v.declination = :declination')
  241.                 ->setParameter('declination'$declination)
  242.                 ->setParameter('tailles'$tailles);
  243.         }
  244.         // Appliquer les filtres de couleurs si ils sont appliqués seulement
  245.         if( $couleurs && !$tailles) {
  246.             $declination $this->em->getRepository(Declination::class)->find(2);
  247.             $query->innerJoin('App\Entity\ProduitDeclinationValue''d''with''d.produit=p')
  248.                 ->innerJoin('App\Entity\GroupDeclinationValue''g''with''g.produitDeclination= d')
  249.                 ->innerJoin('App\Entity\ValueDeclination''v''with''v= g.value')
  250.                 ->andWhere("v.id in (:couleurs) or v.parent in (:couleurs)")
  251.                 ->andWhere('v.declination = :declination')
  252.                 ->setParameter('declination'$declination)
  253.                 ->setParameter('couleurs'$couleurs);
  254.         }
  255.         // Appliquer les filtres de tailles et couleurs appliqués les deux
  256.         if( $tailles && $couleurs) {
  257.             $declinationTaille $this->em->getRepository(Declination::class)->find(1);
  258.             $declinationCouleur $this->em->getRepository(Declination::class)->find(2);
  259.             // Fusionner les deux filtres en un seul
  260.             $filtres array_merge($tailles$couleurs);
  261.             $query->innerJoin('App\Entity\ProduitDeclinationValue''d''with''d.produit=p')
  262.                 ->innerJoin('App\Entity\GroupDeclinationValue''g''with''g.produitDeclination= d')
  263.                 ->innerJoin('App\Entity\ValueDeclination''v''with''v= g.value')
  264.                 ->andWhere("v.name in (:tailles) or v.id in (:couleurs) or v.parent in (:couleurs)")
  265.                 /* ->andWhere('v.declination = :declinationTaille OR v.declination = :declinationCouleur')
  266.                  ->setParameter('declinationTaille', $declinationTaille)*/
  267.                 ->setParameter('couleurs'$couleurs)
  268.                 ->setParameter('tailles'$tailles);
  269.         }
  270.         // Order by
  271.         switch ($orderBy) {
  272.             case 1:
  273.                 $query->orderBy('p.name''ASC');
  274.                 break;
  275.             case 2:
  276.                 $query->orderBy('p.name''DESC');
  277.                 break;
  278.             case 3:
  279.                 $query->orderBy('p.price_ttc''ASC');
  280.                 break;
  281.             case 4:
  282.                 $query->orderBy('p.price_ttc''DESC');
  283.                 break;
  284.             case 5:
  285.                 $query->orderBy('p.createdAt''ASC');
  286.                 break;
  287.             case 6:
  288.                 $query->orderBy('p.createdAt''DESC');
  289.                 break;
  290.         }
  291.         $query->getQuery();
  292.         // set page size
  293.         $pageSize $request->query->get('pageSize');;
  294.         // load doctrine Paginator
  295.         $paginator = new \Doctrine\ORM\Tools\Pagination\Paginator($query);
  296.         // you can get total items
  297.         $totalItems count($paginator);
  298.         // get total pages
  299.         $pagesCount ceil($totalItems $pageSize);
  300.         // now get one page's items:
  301.         $paginator
  302.             ->getQuery()
  303.             ->setFirstResult($pageSize * ($page-1)) // set the offset
  304.             ->setMaxResults($pageSize); // set the limit
  305.         $data= array();
  306.         foreach ($paginator as $pageItem) {
  307.             // do stuff with results...
  308.             array_push($data,$pageItem);
  309.         }
  310.         // Recupérer les images
  311.         foreach ($data as $product) {
  312.             $product->image $this->getDefaultImage($product);
  313.         }
  314.         // Les nombres de pages
  315.         $pages = array();
  316.         for($i=max($page-31);$i<=min($page+3$pagesCount) ;$i++){
  317.             array_push($pages,$i);
  318.         }
  319.         $response = [
  320.             'res' => 'OK',
  321.             'data' => $data,
  322.             'pagesCount' => $pagesCount,
  323.             'total' => $totalItems,
  324.             'pages' => $pages,
  325.             'message' => 'Produits récupérés avec succès.',
  326.         ];
  327.         return new jsonResponse($response);
  328.     }
  329.     /**
  330.      * @Route("/api/new-products-dec", name="api_new_products_dec", options={"expose"=true}, methods={"GET"})
  331.      */
  332.     public function newProductsDecAPI(Request $request): Response
  333.     {
  334.         $page $request->query->get('page');
  335.         $orderBy $request->query->get('orderBy');
  336.         //Les Filtres de recherche
  337.         $tailles preg_split('@,@'$request->query->get('tailles'), NULLPREG_SPLIT_NO_EMPTY);
  338.         $couleurs preg_split('@,@'$request->query->get('couleurs'), NULLPREG_SPLIT_NO_EMPTY);
  339.         $maxPrice floatval($request->query->get('maxPrice'));
  340.         $minPrice floatval($request->query->get('minPrice'));
  341.         // On va récupérer les produits crées jusqu'à 3 mois
  342.         $date = new \DateTime('now');
  343.         $date->modify('-90 day');
  344.         // get the product dec repository
  345.         $produits $this->em->getRepository(ProduitDeclinationValue::class);
  346.         // build the query for the doctrine paginator
  347.         $query $produits->createQueryBuilder('d');
  348.         // build the query for the doctrine paginator
  349.         $query->innerJoin('App\Entity\Produit''p''with''d.produit=p')
  350.             ->where('p.createdAt >= :date')
  351.             ->andWhere('p.deletedAt is null')
  352.             ->andWhere('p.showInWebSite = 1')
  353.             ->setParameter('date'$date)
  354.             ->andWhere('p.price_ttc between :minPrice and :maxPrice')
  355.             ->setParameter('maxPrice'$maxPrice)
  356.             ->setParameter('minPrice'$minPrice)
  357.             ->groupBy('p.id,v.id');
  358.         // Appliquer les filtres de tailles si ils sont ne pas appliqués
  359.         if( !$tailles && !$couleurs) {
  360.             $declination $this->em->getRepository(Declination::class)->find(1);
  361.             $query->innerJoin('App\Entity\GroupDeclinationValue''g''with''g.produitDeclination= d')
  362.                 ->innerJoin('App\Entity\ValueDeclination''v''with''v= g.value')
  363.                 ->andWhere('v.declination=2');
  364.         }
  365.         // Appliquer les filtres de tailles si ils sont appliqués
  366.         if( $tailles && !$couleurs) {
  367.             $declination $this->em->getRepository(Declination::class)->find(1);
  368.             $query->innerJoin('App\Entity\GroupDeclinationValue''g''with''g.produitDeclination= d')
  369.                 ->innerJoin('App\Entity\ValueDeclination''v''with''v= g.value')
  370.                 ->andWhere("v.name in (:tailles)")
  371.                 ->setParameter('tailles'$tailles);
  372.         }
  373.         // Appliquer les filtres de couleurs si ils sont appliqués seulement
  374.         if( $couleurs && !$tailles) {
  375.             $declination $this->em->getRepository(Declination::class)->find(2);
  376.             $query->innerJoin('App\Entity\GroupDeclinationValue''g''with''g.produitDeclination= d')
  377.                 ->innerJoin('App\Entity\ValueDeclination''v''with''v= g.value')
  378.                 ->andWhere("v.id in (:couleurs) or v.parent in (:couleurs)")
  379.                 ->setParameter('couleurs'$couleurs);
  380.         }
  381.         // Appliquer les filtres de tailles et couleurs appliqués les deux
  382.         if( $tailles && $couleurs) {
  383.             $declinationTaille $this->em->getRepository(Declination::class)->find(1);
  384.             $declinationCouleur $this->em->getRepository(Declination::class)->find(2);
  385.             // Fusionner les deux filtres en un seul
  386.             $filtres array_merge($tailles$couleurs);
  387.             $query->innerJoin('App\Entity\GroupDeclinationValue''g''with''g.produitDeclination= d')
  388.                 ->innerJoin('App\Entity\ValueDeclination''v''with''v= g.value')
  389.                 ->andWhere("v.name in (:tailles) or v.id in (:couleurs) or v.parent in (:couleurs)")
  390.                 ->setParameter('couleurs'$couleurs)
  391.                 ->setParameter('tailles'$tailles)
  392.                 ->groupBy('v.declination')
  393.                 ->having('v.declination=2');
  394.         }
  395.         // Order by
  396.         switch ($orderBy) {
  397.             case 1:
  398.                 $query->orderBy('p.name''ASC');
  399.                 break;
  400.             case 2:
  401.                 $query->orderBy('p.name''DESC');
  402.                 break;
  403.             case 3:
  404.                 $query->orderBy('p.price_ttc''ASC');
  405.                 break;
  406.             case 4:
  407.                 $query->orderBy('p.price_ttc''DESC');
  408.                 break;
  409.             case 5:
  410.                 $query->orderBy('p.createdAt''ASC');
  411.                 break;
  412.             case 6:
  413.                 $query->orderBy('p.createdAt''DESC');
  414.                 break;
  415.         }
  416.         $query->getQuery();
  417.         // set page size
  418.         $pageSize $request->query->get('pageSize');;
  419.         // load doctrine Paginator
  420.         $paginator = new \Doctrine\ORM\Tools\Pagination\Paginator($query);
  421.         // you can get total items
  422.         $totalItems count($paginator);
  423.         // get total pages
  424.         $pagesCount ceil($totalItems $pageSize);
  425.         // now get one page's items:
  426.         $paginator
  427.             ->getQuery()
  428.             ->setFirstResult($pageSize * ($page-1)) // set the offset
  429.             ->setMaxResults($pageSize); // set the limit
  430.         $data= array();
  431.         foreach ($paginator as $pageItem) {
  432.             // do stuff with results...
  433.             $pageItem->setImage($this->getDefaultImage(null$pageItem));
  434.             array_push($data,$pageItem);
  435.         }
  436.         // Les nombres de pages
  437.         $pages = array();
  438.         for($i=max($page-31);$i<=min($page+3$pagesCount) ;$i++){
  439.             array_push($pages,$i);
  440.         }
  441.         $response = [
  442.             'res' => 'OK',
  443.             'data' => $data,
  444.             'pagesCount' => $pagesCount,
  445.             'total' => $totalItems,
  446.             'pages' => $pages,
  447.             'message' => 'Produits récupérés avec succès.',
  448.         ];
  449.         return new jsonResponse($response);
  450.     }
  451.     /**
  452.      * @Route("/promotion", name="promo_products")
  453.      */
  454.     public function promoProducts(): Response
  455.     {
  456.         return $this->render('front/pages/promoProducts.html.twig');
  457.     }
  458.     /**
  459.      * @Route("/promotion-dec", name="promo_products_dec")
  460.      */
  461.     public function promoProductsDec(): Response
  462.     {
  463.         return $this->render('front/dec/promoProductsDec.html.twig');
  464.     }
  465.     /**
  466.      * @Route("/api/promotion", name="api_promo_products", options={"expose"=true}, methods={"GET"})
  467.      */
  468.     public function promoProductsAPI(Request $request): Response
  469.     {
  470.         $page $request->query->get('page');
  471.         $orderBy $request->query->get('orderBy');
  472.         //Les Filtres de recherche
  473.         $tailles preg_split('@,@'$request->query->get('tailles'), NULLPREG_SPLIT_NO_EMPTY);
  474.         $couleurs preg_split('@,@'$request->query->get('couleurs'), NULLPREG_SPLIT_NO_EMPTY);
  475.         $maxPrice floatval($request->query->get('maxPrice'));
  476.         $minPrice floatval($request->query->get('minPrice'));
  477.         // Récupérer la date encours
  478.         $date = new \DateTime('now');
  479.         $query $this->em->createQueryBuilder();
  480.         $query->add('select''p')
  481.             ->from('App\Entity\Produit''p')
  482.             ->join('App\Entity\Promotion''c''with''p.promotion=c')
  483.             ->where('p.promotion is not null')
  484.             ->andWhere('c.startAt <= :date')
  485.             ->andWhere('c.endAt >= :date')
  486.             ->setParameter('date'$date)
  487.             ->andWhere('p.deletedAt is null')
  488.             ->andWhere('p.showInWebSite = 1')
  489.             ->andWhere('p.price_ttc between :minPrice and :maxPrice')
  490.             ->setParameter('maxPrice'$maxPrice)
  491.             ->setParameter('minPrice'$minPrice);
  492.         // Appliquer les filtres de tailles si ils sont appliqués
  493.         if( $tailles && !$couleurs) {
  494.             $declination $this->em->getRepository(Declination::class)->find(1);
  495.             $query->innerJoin('App\Entity\ProduitDeclinationValue''d''with''d.produit=p')
  496.                 ->innerJoin('App\Entity\GroupDeclinationValue''g''with''g.produitDeclination= d')
  497.                 ->innerJoin('App\Entity\ValueDeclination''v''with''v= g.value')
  498.                 ->andWhere("v.name in (:tailles)")
  499.                 ->andWhere('v.declination = :declination')
  500.                 ->setParameter('declination'$declination)
  501.                 ->setParameter('tailles'$tailles);
  502.         }
  503.         // Appliquer les filtres de couleurs si ils sont appliqués seulement
  504.         if( $couleurs && !$tailles) {
  505.             $declination $this->em->getRepository(Declination::class)->find(2);
  506.             $query->innerJoin('App\Entity\ProduitDeclinationValue''d''with''d.produit=p')
  507.                 ->innerJoin('App\Entity\GroupDeclinationValue''g''with''g.produitDeclination= d')
  508.                 ->innerJoin('App\Entity\ValueDeclination''v''with''v= g.value')
  509.                 ->andWhere("v.id in (:couleurs) or v.parent in (:couleurs)")
  510.                 ->andWhere('v.declination = :declination')
  511.                 ->setParameter('declination'$declination)
  512.                 ->setParameter('couleurs'$couleurs);
  513.         }
  514.         // Appliquer les filtres de tailles et couleurs appliqués les deux
  515.         if( $tailles && $couleurs) {
  516.             $declinationTaille $this->em->getRepository(Declination::class)->find(1);
  517.             $declinationCouleur $this->em->getRepository(Declination::class)->find(2);
  518.             // Fusionner les deux filtres en un seul
  519.             $filtres array_merge($tailles$couleurs);
  520.             $query->innerJoin('App\Entity\ProduitDeclinationValue''d''with''d.produit=p')
  521.                 ->innerJoin('App\Entity\GroupDeclinationValue''g''with''g.produitDeclination= d')
  522.                 ->innerJoin('App\Entity\ValueDeclination''v''with''v= g.value')
  523.                 ->andWhere("v.name in (:tailles) or v.id in (:couleurs) or v.parent in (:couleurs)")
  524.                 /* ->andWhere('v.declination = :declinationTaille OR v.declination = :declinationCouleur')
  525.                  ->setParameter('declinationTaille', $declinationTaille)*/
  526.                 ->setParameter('couleurs'$couleurs)
  527.                 ->setParameter('tailles'$tailles);
  528.         }
  529.         // Order by
  530.         switch ($orderBy) {
  531.             case 1:
  532.                 $query->orderBy('p.name''ASC');
  533.                 break;
  534.             case 2:
  535.                 $query->orderBy('p.name''DESC');
  536.                 break;
  537.             case 3:
  538.                 $query->orderBy('p.price_ttc''ASC');
  539.                 break;
  540.             case 4:
  541.                 $query->orderBy('p.price_ttc''DESC');
  542.                 break;
  543.             case 5:
  544.                 $query->orderBy('p.createdAt''ASC');
  545.                 break;
  546.             case 6:
  547.                 $query->orderBy('p.createdAt''DESC');
  548.                 break;
  549.         }
  550.         // set page size
  551.         $pageSize $request->query->get('pageSize');;
  552.         // load doctrine Paginator
  553.         $paginator = new \Doctrine\ORM\Tools\Pagination\Paginator($query);
  554.         // you can get total items
  555.         $totalItems count($paginator);
  556.         // get total pages
  557.         $pagesCount ceil($totalItems $pageSize);
  558.         // now get one page's items:
  559.         $paginator
  560.             ->getQuery()
  561.             ->setFirstResult($pageSize * ($page 1)) // set the offset
  562.             ->setMaxResults($pageSize); // set the limit
  563.         $data = array();
  564.         foreach ($paginator as $pageItem) {
  565.             // do stuff with results...
  566.             array_push($data$pageItem);
  567.         }
  568.         foreach ($data as $product) {
  569.             $product->image $this->getDefaultImage($product);
  570.         }
  571.         // Les nombres de pages
  572.         $pages = array();
  573.         for ($i max($page 31); $i <= min($page 3$pagesCount); $i++) {
  574.             array_push($pages$i);
  575.         }
  576.         $response = [
  577.             'res' => 'OK',
  578.             'data' => $data,
  579.             'pagesCount' => $pagesCount,
  580.             'total' => $totalItems,
  581.             'pages' => $pages,
  582.             'message' => 'Produits récupérés avec succès.',
  583.         ];
  584.         return new jsonResponse($response);
  585.     }
  586.     /**
  587.      * @Route("/api/promotion-dec", name="api_promo_products_dec", options={"expose"=true}, methods={"GET"})
  588.      */
  589.     public function promoProductsAPIDec(Request $request): Response
  590.     {
  591.         $page $request->query->get('page');
  592.         $orderBy $request->query->get('orderBy');
  593.         //Les Filtres de recherche
  594.         $tailles preg_split('@,@'$request->query->get('tailles'), NULLPREG_SPLIT_NO_EMPTY);
  595.         $couleurs preg_split('@,@'$request->query->get('couleurs'), NULLPREG_SPLIT_NO_EMPTY);
  596.         $maxPrice floatval($request->query->get('maxPrice'));
  597.         $minPrice floatval($request->query->get('minPrice'));
  598.         // Récupérer la date encours
  599.         $date = new \DateTime('now');
  600.         //$query = $this->em->createQueryBuilder();
  601.         $produits $this->em->getRepository(ProduitDeclinationValue::class);
  602.         // build the query for the doctrine paginator
  603.         $query $produits->createQueryBuilder('d');
  604.         $query->innerJoin('App\Entity\Produit''p''with''d.produit=p')
  605.             ->innerJoin('App\Entity\Promotion''c''with''p.promotion=c')
  606.             ->where('p.promotion is not null')
  607.             ->andWhere('c.startAt <= :date')
  608.             ->andWhere('c.endAt >= :date')
  609.             ->setParameter('date'$date)
  610.             ->andWhere('p.deletedAt is null')
  611.             ->andWhere('p.showInWebSite = 1')
  612.             ->andWhere('p.price_ttc between :minPrice and :maxPrice')
  613.             ->setParameter('maxPrice'$maxPrice)
  614.             ->setParameter('minPrice'$minPrice)
  615.             ->groupBy('p.id,v.id');;
  616.         // Appliquer les filtres de tailles si ils sont ne pas appliqués
  617.         if( !$tailles && !$couleurs) {
  618.             $declination $this->em->getRepository(Declination::class)->find(1);
  619.             $query->innerJoin('App\Entity\GroupDeclinationValue''g''with''g.produitDeclination= d')
  620.                 ->innerJoin('App\Entity\ValueDeclination''v''with''v= g.value')
  621.                 ->andWhere('v.declination=2');
  622.         }
  623.         // Appliquer les filtres de tailles si ils sont appliqués
  624.         if( $tailles && !$couleurs) {
  625.             $declination $this->em->getRepository(Declination::class)->find(1);
  626.             $query->innerJoin('App\Entity\GroupDeclinationValue''g''with''g.produitDeclination= d')
  627.                 ->innerJoin('App\Entity\ValueDeclination''v''with''v= g.value')
  628.                 ->andWhere("v.name in (:tailles)")
  629.                 ->setParameter('tailles'$tailles);
  630.         }
  631.         // Appliquer les filtres de couleurs si ils sont appliqués seulement
  632.         if( $couleurs && !$tailles) {
  633.             $declination $this->em->getRepository(Declination::class)->find(2);
  634.             $query->innerJoin('App\Entity\GroupDeclinationValue''g''with''g.produitDeclination= d')
  635.                 ->innerJoin('App\Entity\ValueDeclination''v''with''v= g.value')
  636.                 ->andWhere("v.id in (:couleurs) or v.parent in (:couleurs)")
  637.                 ->setParameter('couleurs'$couleurs);
  638.         }
  639.         // Appliquer les filtres de tailles et couleurs appliqués les deux
  640.         if( $tailles && $couleurs) {
  641.             $declinationTaille $this->em->getRepository(Declination::class)->find(1);
  642.             $declinationCouleur $this->em->getRepository(Declination::class)->find(2);
  643.             // Fusionner les deux filtres en un seul
  644.             $filtres array_merge($tailles$couleurs);
  645.             $query->innerJoin('App\Entity\GroupDeclinationValue''g''with''g.produitDeclination= d')
  646.                 ->innerJoin('App\Entity\ValueDeclination''v''with''v= g.value')
  647.                 ->andWhere("v.name in (:tailles) or v.id in (:couleurs) or v.parent in (:couleurs)")
  648.                 ->setParameter('couleurs'$couleurs)
  649.                 ->setParameter('tailles'$tailles)
  650.                 ->groupBy('v.declination')
  651.                 ->having('v.declination=2');
  652.         }
  653.         // Order by
  654.         switch ($orderBy) {
  655.             case 1:
  656.                 $query->orderBy('p.name''ASC');
  657.                 break;
  658.             case 2:
  659.                 $query->orderBy('p.name''DESC');
  660.                 break;
  661.             case 3:
  662.                 $query->orderBy('p.price_ttc''ASC');
  663.                 break;
  664.             case 4:
  665.                 $query->orderBy('p.price_ttc''DESC');
  666.                 break;
  667.             case 5:
  668.                 $query->orderBy('p.createdAt''ASC');
  669.                 break;
  670.             case 6:
  671.                 $query->orderBy('p.createdAt''DESC');
  672.                 break;
  673.         }
  674.         // set page size
  675.         $pageSize $request->query->get('pageSize');;
  676.         // load doctrine Paginator
  677.         $paginator = new \Doctrine\ORM\Tools\Pagination\Paginator($query);
  678.         // you can get total items
  679.         $totalItems count($paginator);
  680.         // get total pages
  681.         $pagesCount ceil($totalItems $pageSize);
  682.         // now get one page's items:
  683.         $paginator
  684.             ->getQuery()
  685.             ->setFirstResult($pageSize * ($page 1)) // set the offset
  686.             ->setMaxResults($pageSize); // set the limit
  687.         $data = array();
  688.         foreach ($paginator as $pageItem) {
  689.             // do stuff with results...
  690.             $pageItem->setImage($this->getDefaultImage(null$pageItem));
  691.             array_push($data,$pageItem);
  692.         }
  693.         // Les nombres de pages
  694.         $pages = array();
  695.         for ($i max($page 31); $i <= min($page 3$pagesCount); $i++) {
  696.             array_push($pages$i);
  697.         }
  698.         $response = [
  699.             'res' => 'OK',
  700.             'data' => $data,
  701.             'pagesCount' => $pagesCount,
  702.             'total' => $totalItems,
  703.             'pages' => $pages,
  704.             'message' => 'Produits récupérés avec succès.',
  705.         ];
  706.         return new jsonResponse($response);
  707.     }
  708.     /**
  709.      * @Route("/search/{idCategory}/{search}", name="product_search", options={"expose"=true}, methods={"GET"})
  710.      */
  711.     public function searchProducts(Request $request,$idCategory,$search): Response
  712.     {
  713.         $categories = [];
  714.         if($idCategory) {
  715.             $category $this->em->getRepository(Category::class)->find($idCategory);
  716.             // Récupérer les catégories fils
  717.             array_push($categories$category);
  718.             foreach ($category->getSubCategories() as $child) {
  719.                 array_push($categories$child);
  720.                 foreach ($child->getSubCategories() as $sub) {
  721.                     array_push($categories$sub);
  722.                 }
  723.             }
  724.         }
  725.         return $this->render('front/pages/searchProducts.html.twig', [
  726.             'idCategory' => $idCategory,
  727.             'categories' => $categories,
  728.             'search' => $search,
  729.         ]);
  730.     }
  731.     /**
  732.      * @Route("/search-dec/{idCategory}/{search}", name="product_search_dec", options={"expose"=true}, methods={"GET"})
  733.      */
  734.     public function searchProductsDec(Request $request,$idCategory,$search): Response
  735.     {
  736.         $categories = [];
  737.         if($idCategory) {
  738.             $category $this->em->getRepository(Category::class)->find($idCategory);
  739.             // Récupérer les catégories fils
  740.             array_push($categories$category);
  741.             foreach ($category->getSubCategories() as $child) {
  742.                 array_push($categories$child);
  743.                 foreach ($child->getSubCategories() as $sub) {
  744.                     array_push($categories$sub);
  745.                 }
  746.             }
  747.         }
  748.         return $this->render('front/dec/searchProductsDec.html.twig', [
  749.             'idCategory' => $idCategory,
  750.             'categories' => $categories,
  751.             'search' => $search,
  752.         ]);
  753.     }
  754.     /**
  755.      * @Route("/api/product-search", name="api_product_search", options={"expose"=true}, methods={"GET"})
  756.      */
  757.     public function serachProductsAPI(Request $request): Response
  758.     {
  759.         $category_id $request->query->get('id');
  760.         $search $request->query->get('search');
  761.         $page $request->query->get('page');
  762.         $orderBy $request->query->get('orderBy');
  763.         $categories = [];
  764.         $category $this->em->getRepository(Category::class)->find($category_id);
  765.         if ($category){
  766.             // Récupérer kes catégories fils
  767.             array_push($categories$category);
  768.             foreach ($category->getSubCategories() as $child) {
  769.                 array_push($categories$child);
  770.                 foreach ($child->getSubCategories() as $sub) {
  771.                     array_push($categories$sub);
  772.                 }
  773.             }
  774.         }
  775.         //Les Filtres de recherche
  776.         $tailles preg_split('@,@'$request->query->get('tailles'), NULLPREG_SPLIT_NO_EMPTY);
  777.         $couleurs preg_split('@,@'$request->query->get('couleurs'), NULLPREG_SPLIT_NO_EMPTY);
  778.         $maxPrice floatval($request->query->get('maxPrice'));
  779.         $minPrice floatval($request->query->get('minPrice'));
  780.         // get the product repository
  781.         $produits $this->em->getRepository(Produit::class);
  782.         // build the query for the doctrine paginator
  783.         $query $produits->createQueryBuilder('p')
  784.             ->where('p.name like :search OR p.description like :search OR p.reference like :search')
  785.             ->setParameter('search''%' $search '%')
  786.             ->andWhere('p.deletedAt is null')
  787.             ->andWhere('p.showInWebSite = 1')
  788.             ->andWhere('p.price_ttc between :minPrice and :maxPrice')
  789.             ->setParameter('maxPrice'$maxPrice)
  790.             ->setParameter('minPrice'$minPrice);
  791.         // Si catégorie est sélectionnée
  792.         if( $category) {
  793.             $query->andWhere('p.categories in (:cat)')
  794.                 ->setParameter('cat'$categories);
  795.         }
  796.         // Appliquer les filtres de tailles si ils sont appliqués
  797.         if( $tailles && !$couleurs) {
  798.             $declination $this->em->getRepository(Declination::class)->find(1);
  799.             $query->innerJoin('App\Entity\ProduitDeclinationValue''d''with''d.produit=p')
  800.                 ->innerJoin('App\Entity\GroupDeclinationValue''g''with''g.produitDeclination= d')
  801.                 ->innerJoin('App\Entity\ValueDeclination''v''with''v= g.value')
  802.                 ->andWhere("v.name in (:tailles)")
  803.                 ->andWhere('v.declination = :declination')
  804.                 ->setParameter('declination'$declination)
  805.                 ->setParameter('tailles'$tailles);
  806.         }
  807.         // Appliquer les filtres de couleurs si ils sont appliqués seulement
  808.         if( $couleurs && !$tailles) {
  809.             $declination $this->em->getRepository(Declination::class)->find(2);
  810.             $query->innerJoin('App\Entity\ProduitDeclinationValue''d''with''d.produit=p')
  811.                 ->innerJoin('App\Entity\GroupDeclinationValue''g''with''g.produitDeclination= d')
  812.                 ->innerJoin('App\Entity\ValueDeclination''v''with''v= g.value')
  813.                 ->andWhere("v.id in (:couleurs) or v.parent in (:couleurs)")
  814.                 ->andWhere('v.declination = :declination')
  815.                 ->setParameter('declination'$declination)
  816.                 ->setParameter('couleurs'$couleurs);
  817.         }
  818.         // Appliquer les filtres de tailles et couleurs appliqués les deux
  819.         if( $tailles && $couleurs) {
  820.             $declinationTaille $this->em->getRepository(Declination::class)->find(1);
  821.             $declinationCouleur $this->em->getRepository(Declination::class)->find(2);
  822.             // Fusionner les deux filtres en un seul
  823.             $filtres array_merge($tailles$couleurs);
  824.             $query->innerJoin('App\Entity\ProduitDeclinationValue''d''with''d.produit=p')
  825.                 ->innerJoin('App\Entity\GroupDeclinationValue''g''with''g.produitDeclination= d')
  826.                 ->innerJoin('App\Entity\ValueDeclination''v''with''v= g.value')
  827.                 ->andWhere("v.name in (:tailles) or v.id in (:couleurs) or v.parent in (:couleurs)")
  828.                 /* ->andWhere('v.declination = :declinationTaille OR v.declination = :declinationCouleur')
  829.                  ->setParameter('declinationTaille', $declinationTaille)*/
  830.                 ->setParameter('couleurs'$couleurs)
  831.                 ->setParameter('tailles'$tailles);
  832.         }
  833.         // Order by
  834.         switch ($orderBy) {
  835.             case 1:
  836.                 $query->orderBy('p.name''ASC');
  837.                 break;
  838.             case 2:
  839.                 $query->orderBy('p.name''DESC');
  840.                 break;
  841.             case 3:
  842.                 $query->orderBy('p.price_ttc''ASC');
  843.                 break;
  844.             case 4:
  845.                 $query->orderBy('p.price_ttc''DESC');
  846.                 break;
  847.             case 5:
  848.                 $query->orderBy('p.createdAt''ASC');
  849.                 break;
  850.             case 6:
  851.                 $query->orderBy('p.createdAt''DESC');
  852.                 break;
  853.         }
  854.             $query->getQuery();
  855.         // set page size
  856.         $pageSize $request->query->get('pageSize');;
  857.         // load doctrine Paginator
  858.         $paginator = new \Doctrine\ORM\Tools\Pagination\Paginator($query);
  859.         // you can get total items
  860.         $totalItems count($paginator);
  861.         // get total pages
  862.         $pagesCount ceil($totalItems $pageSize);
  863.         // now get one page's items:
  864.         $paginator
  865.             ->getQuery()
  866.             ->setFirstResult($pageSize * ($page-1)) // set the offset
  867.             ->setMaxResults($pageSize); // set the limit
  868.         $data= array();
  869.         foreach ($paginator as $pageItem) {
  870.             // do stuff with results...
  871.             // A vérifier
  872.             /*if( $tailles && $couleurs) {
  873.                 $filtres = array_merge($tailles, $couleurs);
  874.                 // Vérifier si les declinaison respectes les filtres
  875.                 foreach ($pageItem->getProduitDeclinationValues() as $entity) {
  876.                     foreach ($entity->getGroupDeclinationValues() as $group) {
  877.                         if( !in_array($group->getValue()->getName(), $filtres)){
  878.                             break 2;
  879.                         }
  880.                     }
  881.                     array_push($data, $pageItem);
  882.                 }
  883.             }
  884.             else{
  885.                 array_push($data, $pageItem);
  886.             }*/
  887.             array_push($data$pageItem);
  888.         }
  889.         foreach ($data as $product){
  890.             $product->image $this->getDefaultImage$product);
  891.         }
  892.         // Les nombres de pages
  893.         $pages = array();
  894.         for($i=max($page-31);$i<=min($page+3$pagesCount) ;$i++){
  895.             array_push($pages,$i);
  896.         }
  897.         $response = [
  898.             'res' => 'OK',
  899.             'data' => $data,
  900.             'pagesCount' => $pagesCount,
  901.             'total' => $totalItems,
  902.             'pages' => $pages,
  903.             'message' => 'Produits récupérés avec succès.',
  904.         ];
  905.         return new jsonResponse($response);
  906.     }
  907.     /**
  908.      * @Route("/api/product-search-dec", name="api_product_search_dec", options={"expose"=true}, methods={"GET"})
  909.      */
  910.     public function serachProductsDecAPI(Request $request): Response
  911.     {
  912.         $category_id $request->query->get('id');
  913.         $search $request->query->get('search');
  914.         $page $request->query->get('page');
  915.         $orderBy $request->query->get('orderBy');
  916.         $categories = [];
  917.         $category $this->em->getRepository(Category::class)->find($category_id);
  918.         if ($category){
  919.             // Récupérer kes catégories fils
  920.             array_push($categories$category);
  921.             foreach ($category->getSubCategories() as $child) {
  922.                 array_push($categories$child);
  923.                 foreach ($child->getSubCategories() as $sub) {
  924.                     array_push($categories$sub);
  925.                 }
  926.             }
  927.         }
  928.         //Les Filtres de recherche
  929.         $tailles preg_split('@,@'$request->query->get('tailles'), NULLPREG_SPLIT_NO_EMPTY);
  930.         $couleurs preg_split('@,@'$request->query->get('couleurs'), NULLPREG_SPLIT_NO_EMPTY);
  931.         $maxPrice floatval($request->query->get('maxPrice'));
  932.         $minPrice floatval($request->query->get('minPrice'));
  933.         // get the product dec repository
  934.         $produits $this->em->getRepository(ProduitDeclinationValue::class);
  935.         // build the query for the doctrine paginator
  936.         $query $produits->createQueryBuilder('d');
  937.         // build the query for the doctrine paginator
  938.         $query->innerJoin('App\Entity\Produit''p''with''d.produit=p')
  939.             ->where('p.name like :search OR p.description like :search OR p.reference like :search')
  940.             ->setParameter('search''%' $search '%')
  941.             ->andWhere('p.deletedAt is null')
  942.             ->andWhere('p.showInWebSite = 1')
  943.             ->andWhere('p.price_ttc between :minPrice and :maxPrice')
  944.             ->setParameter('maxPrice'$maxPrice)
  945.             ->setParameter('minPrice'$minPrice)
  946.             ->groupBy('p.id,v.id');
  947.         // Si catégorie est sélectionnée
  948.         if( $category) {
  949.             $query->andWhere('p.categories in (:cat)')
  950.                 ->setParameter('cat'$categories);
  951.         }
  952.         // Appliquer les filtres de tailles si ils sont ne pas appliqués
  953.         if( !$tailles && !$couleurs) {
  954.             $declination $this->em->getRepository(Declination::class)->find(1);
  955.             $query->innerJoin('App\Entity\GroupDeclinationValue''g''with''g.produitDeclination= d')
  956.                 ->innerJoin('App\Entity\ValueDeclination''v''with''v= g.value')
  957.                 ->andWhere('v.declination=2');
  958.         }
  959.         // Appliquer les filtres de tailles si ils sont appliqués
  960.         if( $tailles && !$couleurs) {
  961.             $declination $this->em->getRepository(Declination::class)->find(1);
  962.             $query->innerJoin('App\Entity\GroupDeclinationValue''g''with''g.produitDeclination= d')
  963.                 ->innerJoin('App\Entity\ValueDeclination''v''with''v= g.value')
  964.                 ->andWhere("v.name in (:tailles)")
  965.                 ->setParameter('tailles'$tailles);
  966.         }
  967.         // Appliquer les filtres de couleurs si ils sont appliqués seulement
  968.         if( $couleurs && !$tailles) {
  969.             $declination $this->em->getRepository(Declination::class)->find(2);
  970.             $query->innerJoin('App\Entity\GroupDeclinationValue''g''with''g.produitDeclination= d')
  971.                 ->innerJoin('App\Entity\ValueDeclination''v''with''v= g.value')
  972.                 ->andWhere("v.id in (:couleurs) or v.parent in (:couleurs)")
  973.                 ->setParameter('couleurs'$couleurs);
  974.         }
  975.         // Appliquer les filtres de tailles et couleurs appliqués les deux
  976.         if( $tailles && $couleurs) {
  977.             $declinationTaille $this->em->getRepository(Declination::class)->find(1);
  978.             $declinationCouleur $this->em->getRepository(Declination::class)->find(2);
  979.             // Fusionner les deux filtres en un seul
  980.             $filtres array_merge($tailles$couleurs);
  981.             $query->innerJoin('App\Entity\GroupDeclinationValue''g''with''g.produitDeclination= d')
  982.                 ->innerJoin('App\Entity\ValueDeclination''v''with''v= g.value')
  983.                 ->andWhere("v.name in (:tailles) or v.id in (:couleurs) or v.parent in (:couleurs)")
  984.                 ->setParameter('couleurs'$couleurs)
  985.                 ->setParameter('tailles'$tailles)
  986.                 ->groupBy('v.declination')
  987.                 ->having('v.declination=2');
  988.         }
  989.         // Order by
  990.         switch ($orderBy) {
  991.             case 1:
  992.                 $query->orderBy('p.name''ASC');
  993.                 break;
  994.             case 2:
  995.                 $query->orderBy('p.name''DESC');
  996.                 break;
  997.             case 3:
  998.                 $query->orderBy('p.price_ttc''ASC');
  999.                 break;
  1000.             case 4:
  1001.                 $query->orderBy('p.price_ttc''DESC');
  1002.                 break;
  1003.             case 5:
  1004.                 $query->orderBy('p.createdAt''ASC');
  1005.                 break;
  1006.             case 6:
  1007.                 $query->orderBy('p.createdAt''DESC');
  1008.                 break;
  1009.         }
  1010.         $query->getQuery();
  1011.         // set page size
  1012.         $pageSize $request->query->get('pageSize');;
  1013.         // load doctrine Paginator
  1014.         $paginator = new \Doctrine\ORM\Tools\Pagination\Paginator($query);
  1015.         // you can get total items
  1016.         $totalItems count($paginator);
  1017.         // get total pages
  1018.         $pagesCount ceil($totalItems $pageSize);
  1019.         // now get one page's items:
  1020.         $paginator
  1021.             ->getQuery()
  1022.             ->setFirstResult($pageSize * ($page-1)) // set the offset
  1023.             ->setMaxResults($pageSize); // set the limit
  1024.         $data= array();
  1025.         foreach ($paginator as $pageItem) {
  1026.             // do stuff with results...
  1027.             $pageItem->setImage($this->getDefaultImage(null$pageItem));
  1028.             array_push($data,$pageItem);
  1029.         }
  1030.         // Les nombres de pages
  1031.         $pages = array();
  1032.         for($i=max($page-31);$i<=min($page+3$pagesCount) ;$i++){
  1033.             array_push($pages,$i);
  1034.         }
  1035.         $response = [
  1036.             'res' => 'OK',
  1037.             'data' => $data,
  1038.             'pagesCount' => $pagesCount,
  1039.             'total' => $totalItems,
  1040.             'pages' => $pages,
  1041.             'message' => 'Produits récupérés avec succès.',
  1042.         ];
  1043.         return new jsonResponse($response);
  1044.     }
  1045.     /**
  1046.      * @Route("/good-plan", name="pack_products")
  1047.      */
  1048.     public function goodPlan(): Response
  1049.     {
  1050.         return $this->render('front/pages/packProducts.html.twig');
  1051.     }
  1052.     /**
  1053.      * @Route("/who-are-we", name="who_are_we")
  1054.      */
  1055.     public function whoAreWe(): Response
  1056.     {
  1057.         return $this->render('front/pages/whoAreWe.html.twig');
  1058.     }
  1059.     /**
  1060.      * @Route("/delivery-information", name="delivery_information")
  1061.      */
  1062.     public function deliveryInformation(): Response
  1063.     {
  1064.         return $this->render('front/pages/deliveryInformation.html.twig');
  1065.     }
  1066.     /**
  1067.      * @Route("/return-and-exchange", name="return_and_exchange")
  1068.      */
  1069.     public function returnAndExchange(): Response
  1070.     {
  1071.         return $this->render('front/pages/returnAndExchange.html.twig');
  1072.     }
  1073.     /**
  1074.      * @Route("/question", name="question")
  1075.      */
  1076.     public function question(): Response
  1077.     {
  1078.         return $this->render('front/pages/question.html.twig');
  1079.     }
  1080.     /**
  1081.      * @Route("/size-guide", name="size_guide")
  1082.      */
  1083.     public function sizeGuide(): Response
  1084.     {
  1085.         return $this->render('front/pages/sizeGuide.html.twig');
  1086.     }
  1087.     /**
  1088.      * @Route("/terms-of-sales", name="terms_of_sales")
  1089.      */
  1090.     public function termsOfSales(): Response
  1091.     {
  1092.         return $this->render('front/pages/termsOfSales.html.twig');
  1093.     }
  1094.     /**
  1095.      * @Route("/contact", name="contact")
  1096.      */
  1097.     public function contact(): Response
  1098.     {
  1099.         return $this->render('front/pages/contact.html.twig');
  1100.     }
  1101. }