<?php
namespace App\Controller\Front;
use App\Entity\Category;
use App\Entity\Declination;
use App\Entity\Produit;
use App\Entity\Slider;
use App\Entity\ProduitDeclinationValue;
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 ImageTrait;
/** @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);
$sliders=$this->em->getRepository(Slider::class)->findBy(['isActive'=>true],['order'=>'asc']);
// Requete pour récupérer la nouvelle collection
$query = $produits->createQueryBuilder('p')
->where('p.createdAt >= :date')
->andWhere('p.deletedAt is null')
->andWhere('p.showInWebSite = 1')
->setParameter('date', $date)
->orderBy('p.createdAt', 'DESC')
->setMaxResults(10);
$products = $query->getQuery()->getResult();
shuffle($products);
$products = array_slice($products, 0, 10);
// Recupérer les images
foreach ($products as $product) {
$product->image = $this->getDefaultImage($product);
};
// Requête pour récupérer les top ventes
// On va récupérer les produits crées jusqu'à 1 mois
$date = new \DateTime('now');
$date->modify('-30 day');
$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')
->andWhere('c.createdAt > = :date')
->andWhere('p.showInWebSite = 1')
->setParameter('date', $date)
->groupBy('p.id')
->orderBy('count(p.id)', 'DESC')
->setMaxResults(50);
// dernierere 90 jours
$topProducts = $query->getQuery()->getResult();
//shuffle the $topproduct array and get the first 10 elements
shuffle($topProducts);
$topProducts = array_slice($topProducts, 0, 10);
// Recupérer les images
foreach ($topProducts as $product) {
$product->image = $this->getDefaultImage( $product);
}
// Maximum pour avoir une livraison gratuite
$max = isset($_ENV['FREE_DELIVERY_AMOUNT']) ? floatval($_ENV['FREE_DELIVERY_AMOUNT']) : 0;
$publicDir=$this->getParameter('kernel.project_dir')."/public";
if($this->getParameter('app.under_construction')=="true")
return $this->render('front/soon.html.twig');
else
return $this->render('front/home.html.twig', array(
'sliders'=>$sliders,
'products' => $products,
'topProducts' => $topProducts,
'max' => $max,
'exist_banner1'=>file_exists($publicDir ."/images/banner/banner-9.jpg"),
'exist_banner2'=>file_exists($publicDir."/images/banner/banner-10.jpg")
));
}
/**
* @Route("/api/category_home", name="api_category_home", options={"expose"=true}, methods={"GET"})
*/
public function newCategoryHomeAPI(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], ['homepageOrder' => 'ASC'], 10, 0);
// création de catégorie virtuelle Meilleure sélection
/* $category = new Category();
$category->setName('Meilleure sélection');
array_unshift($categories, $category);*/
$data = array();
// Récupérer les produits de chaque catégorie (8 derniers produits)
foreach ($categories as $category) {
$produits = $this->em->getRepository(Produit::class);
// Build the query for the doctrine paginator
$query = $produits->createQueryBuilder('p');
/* if( $category->getName() == 'Meilleure sélection') {
$query->where('p.bestSelection = 1')
->andWhere('p.deletedAt is null')
->andWhere('p.showInWebSite = 1')
->orderBy('p.id', 'DESC')
->setMaxResults(30);
} else {*/
$query->where('p.categories = :cat')
->setParameter('cat', $category)
->andWhere('p.deletedAt is null')
->andWhere('p.showInWebSite = 1')
->orderBy('p.id', 'DESC')
->setMaxResults(30);
/* }*/
$products = $query->getQuery()->getResult();
shuffle($products);
$products = array_slice($products, 0, 8);
// Recupérer les images
foreach ($products as $product) {
$product->image = $this->getDefaultImage($product);
}
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) {
$product->image = $this->getDefaultImage( $product);
};
$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) {
$product->image = $this->getDefaultImage( $product);
}
// Maximum pour avoir une livraison gratuite
$max = isset($_ENV['FREE_DELIVERY_AMOUNT']) ? floatval($_ENV['FREE_DELIVERY_AMOUNT']) : 0;
return $this->render('front/home.html.twig', array(
'products' => $products,
'topProducts' => $topProducts,
'max' => $max
));
}
/**
* @Route("/new-products", name="new_products")
*/
public function newProducts(): Response
{
return $this->render('front/pages/newProducts.html.twig');
}
/**
* @Route("/new-products-dec", name="new_products_dec")
*/
public function newProductsDec(): Response
{
return $this->render('front/dec/newProductsDec.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');
// build the query for the doctrine paginator
$query = $this->em->getRepository(Produit::class)->createQueryBuilder('p')
->where('p.createdAt >= :date')
->andWhere('p.deletedAt is null')
->andWhere('p.showInWebSite = 1')
->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;
case 5:
$query->orderBy('p.createdAt', 'ASC');
break;
case 6:
$query->orderBy('p.createdAt', '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) {
$product->image = $this->getDefaultImage($product);
}
// 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("/api/new-products-dec", name="api_new_products_dec", options={"expose"=true}, methods={"GET"})
*/
public function newProductsDecAPI(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 dec repository
$produits = $this->em->getRepository(ProduitDeclinationValue::class);
// build the query for the doctrine paginator
$query = $produits->createQueryBuilder('d');
// build the query for the doctrine paginator
$query->innerJoin('App\Entity\Produit', 'p', 'with', 'd.produit=p')
->where('p.createdAt >= :date')
->andWhere('p.deletedAt is null')
->andWhere('p.showInWebSite = 1')
->setParameter('date', $date)
->andWhere('p.price_ttc between :minPrice and :maxPrice')
->setParameter('maxPrice', $maxPrice)
->setParameter('minPrice', $minPrice)
->groupBy('p.id,v.id');
// Appliquer les filtres de tailles si ils sont ne pas appliqués
if( !$tailles && !$couleurs) {
$declination = $this->em->getRepository(Declination::class)->find(1);
$query->innerJoin('App\Entity\GroupDeclinationValue', 'g', 'with', 'g.produitDeclination= d')
->innerJoin('App\Entity\ValueDeclination', 'v', 'with', 'v= g.value')
->andWhere('v.declination=2');
}
// 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\GroupDeclinationValue', 'g', 'with', 'g.produitDeclination= d')
->innerJoin('App\Entity\ValueDeclination', 'v', 'with', 'v= g.value')
->andWhere("v.name in (:tailles)")
->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\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)")
->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\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)")
->setParameter('couleurs', $couleurs)
->setParameter('tailles', $tailles)
->groupBy('v.declination')
->having('v.declination=2');
}
// 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;
case 5:
$query->orderBy('p.createdAt', 'ASC');
break;
case 6:
$query->orderBy('p.createdAt', '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...
$pageItem->setImage($this->getDefaultImage(null, $pageItem));
array_push($data,$pageItem);
}
// 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("/promotion-dec", name="promo_products_dec")
*/
public function promoProductsDec(): Response
{
return $this->render('front/dec/promoProductsDec.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'));
// 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.showInWebSite = 1')
->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;
case 5:
$query->orderBy('p.createdAt', 'ASC');
break;
case 6:
$query->orderBy('p.createdAt', '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) {
$product->image = $this->getDefaultImage($product);
}
// 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("/api/promotion-dec", name="api_promo_products_dec", options={"expose"=true}, methods={"GET"})
*/
public function promoProductsAPIDec(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'));
// Récupérer la date encours
$date = new \DateTime('now');
//$query = $this->em->createQueryBuilder();
$produits = $this->em->getRepository(ProduitDeclinationValue::class);
// build the query for the doctrine paginator
$query = $produits->createQueryBuilder('d');
$query->innerJoin('App\Entity\Produit', 'p', 'with', 'd.produit=p')
->innerJoin('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.showInWebSite = 1')
->andWhere('p.price_ttc between :minPrice and :maxPrice')
->setParameter('maxPrice', $maxPrice)
->setParameter('minPrice', $minPrice)
->groupBy('p.id,v.id');;
// Appliquer les filtres de tailles si ils sont ne pas appliqués
if( !$tailles && !$couleurs) {
$declination = $this->em->getRepository(Declination::class)->find(1);
$query->innerJoin('App\Entity\GroupDeclinationValue', 'g', 'with', 'g.produitDeclination= d')
->innerJoin('App\Entity\ValueDeclination', 'v', 'with', 'v= g.value')
->andWhere('v.declination=2');
}
// 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\GroupDeclinationValue', 'g', 'with', 'g.produitDeclination= d')
->innerJoin('App\Entity\ValueDeclination', 'v', 'with', 'v= g.value')
->andWhere("v.name in (:tailles)")
->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\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)")
->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\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)")
->setParameter('couleurs', $couleurs)
->setParameter('tailles', $tailles)
->groupBy('v.declination')
->having('v.declination=2');
}
// 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;
case 5:
$query->orderBy('p.createdAt', 'ASC');
break;
case 6:
$query->orderBy('p.createdAt', '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...
$pageItem->setImage($this->getDefaultImage(null, $pageItem));
array_push($data,$pageItem);
}
// 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
{
$categories = [];
if($idCategory) {
$category = $this->em->getRepository(Category::class)->find($idCategory);
// Récupérer les catégories fils
array_push($categories, $category);
foreach ($category->getSubCategories() as $child) {
array_push($categories, $child);
foreach ($child->getSubCategories() as $sub) {
array_push($categories, $sub);
}
}
}
return $this->render('front/pages/searchProducts.html.twig', [
'idCategory' => $idCategory,
'categories' => $categories,
'search' => $search,
]);
}
/**
* @Route("/search-dec/{idCategory}/{search}", name="product_search_dec", options={"expose"=true}, methods={"GET"})
*/
public function searchProductsDec(Request $request,$idCategory,$search): Response
{
$categories = [];
if($idCategory) {
$category = $this->em->getRepository(Category::class)->find($idCategory);
// Récupérer les catégories fils
array_push($categories, $category);
foreach ($category->getSubCategories() as $child) {
array_push($categories, $child);
foreach ($child->getSubCategories() as $sub) {
array_push($categories, $sub);
}
}
}
return $this->render('front/dec/searchProductsDec.html.twig', [
'idCategory' => $idCategory,
'categories' => $categories,
'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');
$categories = [];
$category = $this->em->getRepository(Category::class)->find($category_id);
if ($category){
// Récupérer kes catégories fils
array_push($categories, $category);
foreach ($category->getSubCategories() as $child) {
array_push($categories, $child);
foreach ($child->getSubCategories() as $sub) {
array_push($categories, $sub);
}
}
}
//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.showInWebSite = 1')
->andWhere('p.price_ttc between :minPrice and :maxPrice')
->setParameter('maxPrice', $maxPrice)
->setParameter('minPrice', $minPrice);
// Si catégorie est sélectionnée
if( $category) {
$query->andWhere('p.categories in (:cat)')
->setParameter('cat', $categories);
}
// 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;
case 5:
$query->orderBy('p.createdAt', 'ASC');
break;
case 6:
$query->orderBy('p.createdAt', '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){
$product->image = $this->getDefaultImage( $product);
}
// 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("/api/product-search-dec", name="api_product_search_dec", options={"expose"=true}, methods={"GET"})
*/
public function serachProductsDecAPI(Request $request): Response
{
$category_id = $request->query->get('id');
$search = $request->query->get('search');
$page = $request->query->get('page');
$orderBy = $request->query->get('orderBy');
$categories = [];
$category = $this->em->getRepository(Category::class)->find($category_id);
if ($category){
// Récupérer kes catégories fils
array_push($categories, $category);
foreach ($category->getSubCategories() as $child) {
array_push($categories, $child);
foreach ($child->getSubCategories() as $sub) {
array_push($categories, $sub);
}
}
}
//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 dec repository
$produits = $this->em->getRepository(ProduitDeclinationValue::class);
// build the query for the doctrine paginator
$query = $produits->createQueryBuilder('d');
// build the query for the doctrine paginator
$query->innerJoin('App\Entity\Produit', 'p', 'with', 'd.produit=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.showInWebSite = 1')
->andWhere('p.price_ttc between :minPrice and :maxPrice')
->setParameter('maxPrice', $maxPrice)
->setParameter('minPrice', $minPrice)
->groupBy('p.id,v.id');
// Si catégorie est sélectionnée
if( $category) {
$query->andWhere('p.categories in (:cat)')
->setParameter('cat', $categories);
}
// Appliquer les filtres de tailles si ils sont ne pas appliqués
if( !$tailles && !$couleurs) {
$declination = $this->em->getRepository(Declination::class)->find(1);
$query->innerJoin('App\Entity\GroupDeclinationValue', 'g', 'with', 'g.produitDeclination= d')
->innerJoin('App\Entity\ValueDeclination', 'v', 'with', 'v= g.value')
->andWhere('v.declination=2');
}
// 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\GroupDeclinationValue', 'g', 'with', 'g.produitDeclination= d')
->innerJoin('App\Entity\ValueDeclination', 'v', 'with', 'v= g.value')
->andWhere("v.name in (:tailles)")
->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\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)")
->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\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)")
->setParameter('couleurs', $couleurs)
->setParameter('tailles', $tailles)
->groupBy('v.declination')
->having('v.declination=2');
}
// 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;
case 5:
$query->orderBy('p.createdAt', 'ASC');
break;
case 6:
$query->orderBy('p.createdAt', '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...
$pageItem->setImage($this->getDefaultImage(null, $pageItem));
array_push($data,$pageItem);
}
// 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');
}
}