<?php
namespace App\Controller\Front;
use App\Controller\Admin\ImageControllerTrait;
use App\Entity\Category;
use App\Entity\Declination;
use App\Entity\Document;
use App\Entity\Produit;
use Doctrine\ORM\EntityManagerInterface;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Annotation\Route;
use Symfony\Component\Serializer\Encoder\JsonEncoder;
use Symfony\Component\Serializer\Normalizer\AbstractNormalizer;
use Symfony\Component\Serializer\Normalizer\ObjectNormalizer;
use Symfony\Component\Serializer\Serializer;
use Symfony\Component\Serializer\SerializerInterface;
use Symfony\Component\HttpFoundation\JsonResponse;
class HomeController extends AbstractController
{
use ImageControllerTrait;
/** @var EntityManagerInterface */
private $em;
/**
* @var Serializer
*/
private $serializer;
public function __construct(EntityManagerInterface $manager, SerializerInterface $serializer)
{
$this->em = $manager;
$this->serializer = $serializer;
}
/**
* @Route("/", name="home", options={"expose"=true})
*/
public function home(): Response
{
$categories = $this->em->getRepository(Category::class)->findBy(['showInHomepage' => 1]);
// On va récupérer les produits crées jusqu'à 3 mois
$date = new \DateTime('now');
$date->modify('-90 day');
// get the product repository for newest product
$produits = $this->em->getRepository(Produit::class);
// build the query for the doctrine paginator
$query = $produits->createQueryBuilder('p')
->where('p.createdAt >= :date')
->andWhere('p.deletedAt is null')
->setParameter('date', $date)
->orderBy('p.createdAt', 'DESC')
->setMaxResults(10);
$products = $query->getQuery()->getResult();
// Recupérer les images
foreach ($products as $product) {
// Sélectionner l'iamge par défaut
$pictures = $product->getPicture()->filter(function ($element) {
return $element->getIsSelected() == 1;
});
$picture_name = ($pictures->isEmpty()) ? '../front/assets-new/imgs/no-image.png' : $pictures->first()->getImageName();
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))
$this->resizeImage($picture_name);
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))
$picture_name = 'no-image.png';
$product->image = $picture_name;
};
$query = $this->em->createQueryBuilder();
$query->add('select', 'p')
->from('App\Entity\Produit', 'p')
->join('App\Entity\ProduitDeclinationValue', 'd', 'with', 'd.produit=p')
->join('App\Entity\DocumentDeclinationProduit', 'c', 'with', 'c.produitDeclinationValue=d')
->where('p.deletedAt is null')
->groupBy('p.id')
->orderBy('count(p.id)', 'DESC')
->setMaxResults(10);
$topProducts = $query->getQuery()->getResult();
// Recupérer les images
foreach ($topProducts as $product) {
// Sélectionner l'iamge par défaut
$pictures = $product->getPicture()->filter(function ($element) {
return $element->getIsSelected() == 1;
});
$picture_name = ($pictures->isEmpty()) ? '../front/assets-new/imgs/no-image.png' : $pictures->first()->getImageName();
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))
$this->resizeImage($picture_name);
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))
$picture_name = 'no-image.png';
$product->image = $picture_name;
}
$document = $this->em->getRepository(Document::class)->find(26092);
$max = 200; // Maximum pour avoir une livraison gratuite
return $this->render('front/soon.html.twig', array(
'products' => $products,
'topProducts' => $topProducts,
'document' => $document,
'max' => $max
));
}
/**
* @Route("/api/category_home", name="api_category_home", options={"expose"=true}, methods={"GET"})
*/
public function newCategoryHomePI(Request $request): Response
{
// Récupérer les catégories à afficher dans la page d'acceuil (4 catégories)
$categories = $this->em->getRepository(Category::class)->findBy(['showInHomepage' => 1], ['id' => 'ASC'], 4, 0);
$data = array();
// Récupérer les produits de chaque catégories (8 derniers produits)
foreach ($categories as $category) {
$produits = $this->em->getRepository(Produit::class);
// Build the query for the doctrine paginator
$query = $produits->createQueryBuilder('p');
$query->where('p.categories = :cat')
->setParameter('cat', $category)
->andWhere('p.deletedAt is null')
->orderBy('p.id', 'DESC')
->setMaxResults(8);
$products = $query->getQuery()->getResult();
// Recupérer les images
foreach ($products as $product) {
// Sélectionner l'iamge par défaut
$pictures = $product->getPicture()->filter(function ($element) {
return $element->getIsSelected() == 1;
});
$picture_name = ($pictures->isEmpty()) ? '../front/assets-new/imgs/no-image.png' : $pictures->first()->getImageName();
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))
$this->resizeImage($picture_name);
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))
$picture_name = 'no-image.png';
$product->image = $picture_name;
}
array_push($data, (object)[
'category' => $category,
'products' => $products
]);
}
$response = [
'res' => 'OK',
'data' => $data,
'message' => 'Catégories récupérés avec succès.',
];
return new jsonResponse($response);
}
/**
* @Route("/home", name="home_index")
*/
public function index(): Response
{
$categories = $this->em->getRepository(Category::class)->findBy(['showInHomepage' => 1]);
// On va récupérer les produits crées jusqu'à 3 mois
$date = new \DateTime('now');
$date->modify('-90 day');
// get the product repository for newest product
$produits = $this->em->getRepository(Produit::class);
// build the query for the doctrine paginator
$query = $produits->createQueryBuilder('p')
->where('p.createdAt >= :date')
->andWhere('p.deletedAt is null')
->setParameter('date', $date)
->orderBy('p.createdAt', 'DESC')
->setMaxResults(10);
$products = $query->getQuery()->getResult();
// Recupérer les images
foreach ($products as $product) {
// Sélectionner l'iamge par défaut
$pictures = $product->getPicture()->filter(function ($element) {
return $element->getIsSelected() == 1;
});
$picture_name = ($pictures->isEmpty()) ? '../front/assets-new/imgs/no-image.png' : $pictures->first()->getImageName();
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))
$this->resizeImage($picture_name);
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))
$picture_name = 'no-image.png';
$product->image = $picture_name;
};
$query = $this->em->createQueryBuilder();
$query->add('select', 'p')
->from('App\Entity\Produit', 'p')
->join('App\Entity\ProduitDeclinationValue', 'd', 'with', 'd.produit=p')
->join('App\Entity\DocumentDeclinationProduit', 'c', 'with', 'c.produitDeclinationValue=d')
->where('p.deletedAt is null')
->groupBy('p.id')
->orderBy('count(p.id)', 'DESC')
->setMaxResults(10);
$topProducts = $query->getQuery()->getResult();
// Recupérer les images
foreach ($topProducts as $product) {
// Sélectionner l'iamge par défaut
$pictures = $product->getPicture()->filter(function ($element) {
return $element->getIsSelected() == 1;
});
$picture_name = ($pictures->isEmpty()) ? '../front/assets-new/imgs/no-image.png' : $pictures->first()->getImageName();
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))
$this->resizeImage($picture_name);
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))
$picture_name = 'no-image.png';
$product->image = $picture_name;
}
$document = $this->em->getRepository(Document::class)->find(26092);
$max = 200; // Maximum pour avoir une livraison gratuite
return $this->render('front/home.html.twig', array(
'products' => $products,
'topProducts' => $topProducts,
'document' => $document,
'max' => $max
));
}
/**
* @Route("/new-products", name="new_products")
*/
public function newProducts(): Response
{
return $this->render('front/pages/newProducts.html.twig');
}
/**
* @Route("/api/new_products", name="api_new_products", options={"expose"=true}, methods={"GET"})
*/
public function newProductsAPI(Request $request): Response
{
$page = $request->query->get('page');
$orderBy = $request->query->get('orderBy');
//Les Filtres de recherche
$tailles = preg_split('@,@', $request->query->get('tailles'), NULL, PREG_SPLIT_NO_EMPTY);
$couleurs = preg_split('@,@', $request->query->get('couleurs'), NULL, PREG_SPLIT_NO_EMPTY);
$maxPrice = floatval($request->query->get('maxPrice'));
$minPrice = floatval($request->query->get('minPrice'));
// On va récupérer les produits crées jusqu'à 3 mois
$date = new \DateTime('now');
$date->modify('-90 day');
// get the product repository
$produits = $this->em->getRepository(Produit::class);
// build the query for the doctrine paginator
$query = $produits->createQueryBuilder('p')
->where('p.createdAt >= :date')
->andWhere('p.deletedAt is null')
->setParameter('date', $date)
->andWhere('p.price_ttc between :minPrice and :maxPrice')
->setParameter('maxPrice', $maxPrice)
->setParameter('minPrice', $minPrice);
// Appliquer les filtres de tailles si ils sont appliqués
if ($tailles && !$couleurs) {
$declination = $this->em->getRepository(Declination::class)->find(1);
$query->innerJoin('App\Entity\ProduitDeclinationValue', 'd', 'with', 'd.produit=p')
->innerJoin('App\Entity\GroupDeclinationValue', 'g', 'with', 'g.produitDeclination= d')
->innerJoin('App\Entity\ValueDeclination', 'v', 'with', 'v= g.value')
->andWhere("v.name in (:tailles)")
->andWhere('v.declination = :declination')
->setParameter('declination', $declination)
->setParameter('tailles', $tailles);
}
// Appliquer les filtres de couleurs si ils sont appliqués seulement
if ($couleurs && !$tailles) {
$declination = $this->em->getRepository(Declination::class)->find(2);
$query->innerJoin('App\Entity\ProduitDeclinationValue', 'd', 'with', 'd.produit=p')
->innerJoin('App\Entity\GroupDeclinationValue', 'g', 'with', 'g.produitDeclination= d')
->innerJoin('App\Entity\ValueDeclination', 'v', 'with', 'v= g.value')
->andWhere("v.id in (:couleurs) or v.parent in (:couleurs)")
->andWhere('v.declination = :declination')
->setParameter('declination', $declination)
->setParameter('couleurs', $couleurs);
}
// Appliquer les filtres de tailles et couleurs appliqués les deux
if ($tailles && $couleurs) {
$declinationTaille = $this->em->getRepository(Declination::class)->find(1);
$declinationCouleur = $this->em->getRepository(Declination::class)->find(2);
// Fusionner les deux filtres en un seul
$filtres = array_merge($tailles, $couleurs);
$query->innerJoin('App\Entity\ProduitDeclinationValue', 'd', 'with', 'd.produit=p')
->innerJoin('App\Entity\GroupDeclinationValue', 'g', 'with', 'g.produitDeclination= d')
->innerJoin('App\Entity\ValueDeclination', 'v', 'with', 'v= g.value')
->andWhere("v.name in (:tailles) or v.id in (:couleurs) or v.parent in (:couleurs)")
/* ->andWhere('v.declination = :declinationTaille OR v.declination = :declinationCouleur')
->setParameter('declinationTaille', $declinationTaille)*/
->setParameter('couleurs', $couleurs)
->setParameter('tailles', $tailles);
}
// Order by
switch ($orderBy) {
case 1:
$query->orderBy('p.name', 'ASC');
break;
case 2:
$query->orderBy('p.name', 'DESC');
break;
case 3:
$query->orderBy('p.price_ttc', 'ASC');
break;
case 4:
$query->orderBy('p.price_ttc', 'DESC');
break;
}
$query->getQuery();
// set page size
$pageSize = $request->query->get('pageSize');;
// load doctrine Paginator
$paginator = new \Doctrine\ORM\Tools\Pagination\Paginator($query);
// you can get total items
$totalItems = count($paginator);
// get total pages
$pagesCount = ceil($totalItems / $pageSize);
// now get one page's items:
$paginator
->getQuery()
->setFirstResult($pageSize * ($page-1)) // set the offset
->setMaxResults($pageSize); // set the limit
$data= array();
foreach ($paginator as $pageItem) {
// do stuff with results...
array_push($data,$pageItem);
}
// Recupérer les images
foreach ($data as $product) {
// Sélectionner l'iamge par défaut
$pictures = $product->getPicture()->filter(function ($element) {
return $element->getIsSelected() == 1;
});
$picture_name = ($pictures->isEmpty()) ? '../front/assets-new/imgs/no-image.png' : $pictures->first()->getImageName();
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))
$this->resizeImage($picture_name);
/*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))
$picture_name = 'no-image.png';*/
$product->image = $picture_name;
}
// Les nombres de pages
$pages = array();
for($i=max($page-3, 1);$i<=min($page+3, $pagesCount) ;$i++){
array_push($pages,$i);
}
$response = [
'res' => 'OK',
'data' => $data,
'pagesCount' => $pagesCount,
'total' => $totalItems,
'pages' => $pages,
'message' => 'Produits récupérés avec succès.',
];
return new jsonResponse($response);
}
/**
* @Route("/promotion", name="promo_products")
*/
public function promoProducts(): Response
{
return $this->render('front/pages/promoProducts.html.twig');
}
/**
* @Route("/api/promotion", name="api_promo_products", options={"expose"=true}, methods={"GET"})
*/
public function promoProductsAPI(Request $request): Response
{
$page = $request->query->get('page');
$orderBy = $request->query->get('orderBy');
//Les Filtres de recherche
$tailles = preg_split('@,@', $request->query->get('tailles'), NULL, PREG_SPLIT_NO_EMPTY);
$couleurs = preg_split('@,@', $request->query->get('couleurs'), NULL, PREG_SPLIT_NO_EMPTY);
$maxPrice = floatval($request->query->get('maxPrice'));
$minPrice = floatval($request->query->get('minPrice'));
// get the product repository
$produits = $this->em->getRepository(Produit::class);
// Récupérer la date encours
$date = new \DateTime('now');
$query = $this->em->createQueryBuilder();
$query->add('select', 'p')
->from('App\Entity\Produit', 'p')
->join('App\Entity\Promotion', 'c', 'with', 'p.promotion=c')
->where('p.promotion is not null')
->andWhere('c.startAt <= :date')
->andWhere('c.endAt >= :date')
->setParameter('date', $date)
->andWhere('p.deletedAt is null')
->andWhere('p.price_ttc between :minPrice and :maxPrice')
->setParameter('maxPrice', $maxPrice)
->setParameter('minPrice', $minPrice);
// Appliquer les filtres de tailles si ils sont appliqués
if ($tailles && !$couleurs) {
$declination = $this->em->getRepository(Declination::class)->find(1);
$query->innerJoin('App\Entity\ProduitDeclinationValue', 'd', 'with', 'd.produit=p')
->innerJoin('App\Entity\GroupDeclinationValue', 'g', 'with', 'g.produitDeclination= d')
->innerJoin('App\Entity\ValueDeclination', 'v', 'with', 'v= g.value')
->andWhere("v.name in (:tailles)")
->andWhere('v.declination = :declination')
->setParameter('declination', $declination)
->setParameter('tailles', $tailles);
}
// Appliquer les filtres de couleurs si ils sont appliqués seulement
if ($couleurs && !$tailles) {
$declination = $this->em->getRepository(Declination::class)->find(2);
$query->innerJoin('App\Entity\ProduitDeclinationValue', 'd', 'with', 'd.produit=p')
->innerJoin('App\Entity\GroupDeclinationValue', 'g', 'with', 'g.produitDeclination= d')
->innerJoin('App\Entity\ValueDeclination', 'v', 'with', 'v= g.value')
->andWhere("v.id in (:couleurs) or v.parent in (:couleurs)")
->andWhere('v.declination = :declination')
->setParameter('declination', $declination)
->setParameter('couleurs', $couleurs);
}
// Appliquer les filtres de tailles et couleurs appliqués les deux
if ($tailles && $couleurs) {
$declinationTaille = $this->em->getRepository(Declination::class)->find(1);
$declinationCouleur = $this->em->getRepository(Declination::class)->find(2);
// Fusionner les deux filtres en un seul
$filtres = array_merge($tailles, $couleurs);
$query->innerJoin('App\Entity\ProduitDeclinationValue', 'd', 'with', 'd.produit=p')
->innerJoin('App\Entity\GroupDeclinationValue', 'g', 'with', 'g.produitDeclination= d')
->innerJoin('App\Entity\ValueDeclination', 'v', 'with', 'v= g.value')
->andWhere("v.name in (:tailles) or v.id in (:couleurs) or v.parent in (:couleurs)")
/* ->andWhere('v.declination = :declinationTaille OR v.declination = :declinationCouleur')
->setParameter('declinationTaille', $declinationTaille)*/
->setParameter('couleurs', $couleurs)
->setParameter('tailles', $tailles);
}
// Order by
switch ($orderBy) {
case 1:
$query->orderBy('p.name', 'ASC');
break;
case 2:
$query->orderBy('p.name', 'DESC');
break;
case 3:
$query->orderBy('p.price_ttc', 'ASC');
break;
case 4:
$query->orderBy('p.price_ttc', 'DESC');
break;
}
// set page size
$pageSize = $request->query->get('pageSize');;
// load doctrine Paginator
$paginator = new \Doctrine\ORM\Tools\Pagination\Paginator($query);
// you can get total items
$totalItems = count($paginator);
// get total pages
$pagesCount = ceil($totalItems / $pageSize);
// now get one page's items:
$paginator
->getQuery()
->setFirstResult($pageSize * ($page-1)) // set the offset
->setMaxResults($pageSize); // set the limit
$data= array();
foreach ($paginator as $pageItem) {
// do stuff with results...
array_push($data,$pageItem);
}
foreach ($data as $product) {
// Sélectionner l'iamge par défaut
$pictures = $product->getPicture()->filter(function ($element) {
return $element->getIsSelected() == 1;
});
$picture_name = ($pictures->isEmpty()) ? '../front/assets-new/imgs/no-image.png' : $pictures->first()->getImageName();
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))
$this->resizeImage($picture_name);
/*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))
$picture_name = 'no-image.png';*/
$product->image = $picture_name;
}
// Les nombres de pages
$pages = array();
for($i=max($page-3, 1);$i<=min($page+3, $pagesCount) ;$i++){
array_push($pages,$i);
}
$response = [
'res' => 'OK',
'data' => $data,
'pagesCount' => $pagesCount,
'total' => $totalItems,
'pages' => $pages,
'message' => 'Produits récupérés avec succès.',
];
return new jsonResponse($response);
}
/**
* @Route("/search/{idCategory}/{search}", name="product_search", options={"expose"=true}, methods={"GET"})
*/
public function searchProducts(Request $request,$idCategory,$search): Response
{
return $this->render('front/pages/searchProducts.html.twig', [
'idCategory' => $idCategory,
'search' => $search,
]);
}
/**
* @Route("/api/product-search", name="api_product_search", options={"expose"=true}, methods={"GET"})
*/
public function serachProductsAPI(Request $request): Response
{
$category_id = $request->query->get('id');
$search = $request->query->get('search');
$page = $request->query->get('page');
$orderBy = $request->query->get('orderBy');
$category = $this->em->getRepository(Category::class)->find($category_id);
//Les Filtres de recherche
$tailles = preg_split('@,@', $request->query->get('tailles'), NULL, PREG_SPLIT_NO_EMPTY);
$couleurs = preg_split('@,@', $request->query->get('couleurs'), NULL, PREG_SPLIT_NO_EMPTY);
$maxPrice = floatval($request->query->get('maxPrice'));
$minPrice = floatval($request->query->get('minPrice'));
// get the product repository
$produits = $this->em->getRepository(Produit::class);
// build the query for the doctrine paginator
$query = $produits->createQueryBuilder('p')
->where('p.name like :search OR p.description like :search OR p.reference like :search')
->setParameter('search', '%' . $search . '%')
->andWhere('p.deletedAt is null')
->andWhere('p.price_ttc between :minPrice and :maxPrice')
->setParameter('maxPrice', $maxPrice)
->setParameter('minPrice', $minPrice);
// Si catégorie sélectionné
if ($category) {
$query->andWhere('p.categories = :cat')
->setParameter('cat', $category);
}
// Appliquer les filtres de tailles si ils sont appliqués
if ($tailles && !$couleurs) {
$declination = $this->em->getRepository(Declination::class)->find(1);
$query->innerJoin('App\Entity\ProduitDeclinationValue', 'd', 'with', 'd.produit=p')
->innerJoin('App\Entity\GroupDeclinationValue', 'g', 'with', 'g.produitDeclination= d')
->innerJoin('App\Entity\ValueDeclination', 'v', 'with', 'v= g.value')
->andWhere("v.name in (:tailles)")
->andWhere('v.declination = :declination')
->setParameter('declination', $declination)
->setParameter('tailles', $tailles);
}
// Appliquer les filtres de couleurs si ils sont appliqués seulement
if ($couleurs && !$tailles) {
$declination = $this->em->getRepository(Declination::class)->find(2);
$query->innerJoin('App\Entity\ProduitDeclinationValue', 'd', 'with', 'd.produit=p')
->innerJoin('App\Entity\GroupDeclinationValue', 'g', 'with', 'g.produitDeclination= d')
->innerJoin('App\Entity\ValueDeclination', 'v', 'with', 'v= g.value')
->andWhere("v.id in (:couleurs) or v.parent in (:couleurs)")
->andWhere('v.declination = :declination')
->setParameter('declination', $declination)
->setParameter('couleurs', $couleurs);
}
// Appliquer les filtres de tailles et couleurs appliqués les deux
if ($tailles && $couleurs) {
$declinationTaille = $this->em->getRepository(Declination::class)->find(1);
$declinationCouleur = $this->em->getRepository(Declination::class)->find(2);
// Fusionner les deux filtres en un seul
$filtres = array_merge($tailles, $couleurs);
$query->innerJoin('App\Entity\ProduitDeclinationValue', 'd', 'with', 'd.produit=p')
->innerJoin('App\Entity\GroupDeclinationValue', 'g', 'with', 'g.produitDeclination= d')
->innerJoin('App\Entity\ValueDeclination', 'v', 'with', 'v= g.value')
->andWhere("v.name in (:tailles) or v.id in (:couleurs) or v.parent in (:couleurs)")
/* ->andWhere('v.declination = :declinationTaille OR v.declination = :declinationCouleur')
->setParameter('declinationTaille', $declinationTaille)*/
->setParameter('couleurs', $couleurs)
->setParameter('tailles', $tailles);
}
// Order by
switch ($orderBy) {
case 1:
$query->orderBy('p.name', 'ASC');
break;
case 2:
$query->orderBy('p.name', 'DESC');
break;
case 3:
$query->orderBy('p.price_ttc', 'ASC');
break;
case 4:
$query->orderBy('p.price_ttc', 'DESC');
break;
}
$query->getQuery();
// set page size
$pageSize = $request->query->get('pageSize');;
// load doctrine Paginator
$paginator = new \Doctrine\ORM\Tools\Pagination\Paginator($query);
// you can get total items
$totalItems = count($paginator);
// get total pages
$pagesCount = ceil($totalItems / $pageSize);
// now get one page's items:
$paginator
->getQuery()
->setFirstResult($pageSize * ($page-1)) // set the offset
->setMaxResults($pageSize); // set the limit
$data= array();
foreach ($paginator as $pageItem) {
// do stuff with results...
// A vérifier
/*if ($tailles && $couleurs) {
$filtres = array_merge($tailles, $couleurs);
// Vérifier si les declinaison respectes les filtres
foreach ($pageItem->getProduitDeclinationValues() as $entity) {
foreach ($entity->getGroupDeclinationValues() as $group) {
if (!in_array($group->getValue()->getName(), $filtres)){
break 2;
}
}
array_push($data, $pageItem);
}
}
else{
array_push($data, $pageItem);
}*/
array_push($data, $pageItem);
}
foreach ($data as $product){
// Sélectionner l'iamge par défaut
$pictures = $product->getPicture()->filter(function($element) {
return $element->getIsSelected() == 1;
});
$picture_name = ($pictures->isEmpty()) ? '../front/assets-new/imgs/no-image.png' : $pictures->first()->getImageName();
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))
$this->resizeImage($picture_name);
/*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))
$picture_name = 'no-image.png';*/
$product->image = $picture_name;
}
// Les nombres de pages
$pages = array();
for($i=max($page-3, 1);$i<=min($page+3, $pagesCount) ;$i++){
array_push($pages,$i);
}
$response = [
'res' => 'OK',
'data' => $data,
'pagesCount' => $pagesCount,
'total' => $totalItems,
'pages' => $pages,
'message' => 'Produits récupérés avec succès.',
];
return new jsonResponse($response);
}
/**
* @Route("/good-plan", name="pack_products")
*/
public function goodPlan(): Response
{
return $this->render('front/pages/packProducts.html.twig');
}
/**
* @Route("/who-are-we", name="who_are_we")
*/
public function whoAreWe(): Response
{
return $this->render('front/pages/whoAreWe.html.twig');
}
/**
* @Route("/delivery-information", name="delivery_information")
*/
public function deliveryInformation(): Response
{
return $this->render('front/pages/deliveryInformation.html.twig');
}
/**
* @Route("/return-and-exchange", name="return_and_exchange")
*/
public function returnAndExchange(): Response
{
return $this->render('front/pages/returnAndExchange.html.twig');
}
/**
* @Route("/question", name="question")
*/
public function question(): Response
{
return $this->render('front/pages/question.html.twig');
}
/**
* @Route("/size-guide", name="size_guide")
*/
public function sizeGuide(): Response
{
return $this->render('front/pages/sizeGuide.html.twig');
}
/**
* @Route("/terms-of-sales", name="terms_of_sales")
*/
public function termsOfSales(): Response
{
return $this->render('front/pages/termsOfSales.html.twig');
}
/**
* @Route("/contact", name="contact")
*/
public function contact(): Response
{
return $this->render('front/pages/contact.html.twig');
}
}