<?php
namespace App\Controller\Product;
use App\Entity\Product\Brand;
use App\Entity\Product\ProductCategory;
use App\Repository\ConfigurationRepository;
use App\Repository\Product\ProductConfigRepository;
use App\Repository\Product\ProductRepository;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\JsonResponse;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\Routing\Annotation\Route;
class AjaxProductController extends AbstractController
{
#[Route('/ajax/product/activ', name: 'app_ajax_product_all')]
public function activ(ProductRepository $repository)
{
$products = $repository->findBy(['is_activ' => true]);
$data = $this->renderView('/product/public/_list.html.twig', compact('products'));
return new JsonResponse([
'content' => $data
]);
}
#[Route('/ajax/product/parameters', name: 'app_ajax_product_parameters')]
public function parameters(ProductRepository $repository, Request $request, ProductConfigRepository $productConfigRepository)
{
$productConfig = $productConfigRepository->findOneBy([]);
$design = $productConfig->getDesign();
if ($request->get('product-id')) {
$ids = $request->query->all('product-id');
$products = $repository->findBy(array('id' => $ids));
} else {
$template = $request->query->get('template');
if ($template === '' || $template === null) {
$template = $productConfig->getTemplate();
}
$categories = $request->query->all('categories') ?? null;
$brand = $request->query->all('brand') ?? null;
$excludeCat = $request->query->get('exclude') ?? null;
$limit = $request->query->get('limit') ?? null;
$sort = $request->query->get('sort') ?? null;
$order = $request->query->get('order') ?? null;
$queryBuilder = $repository->createQueryBuilder('p')
->andWhere('p.is_activ = :isActiv')
->setParameter('isActiv', true);
if ($categories) {
$queryBuilder->leftJoin('p.categories', 'pc');
$queryBuilder->andWhere('pc.id IN (:categories)')
->setParameter('categories', $categories);
}
if ($brand) {
$queryBuilder->leftJoin('p.brand', 'b');
$queryBuilder->andWhere('b.id IN (:brand)')
->setParameter('brand', $brand);
}
if ($excludeCat) {
$queryBuilder->andWhere('p.category != :excludeCat')
->setParameter('excludeCat', $excludeCat);
}
if ($limit) {
$queryBuilder->setMaxResults($limit);
}
if ($sort && $order) {
$queryBuilder->orderBy('p.' . $sort, $order);
}
$products = $queryBuilder->getQuery()->getResult();
}
$data = $this->renderView('/product/public/_list.html.twig', compact('products', 'productConfig'));
return new JsonResponse([
'content' => $data
]);
}
#[Route('/ajax/product/parameters/admin', name: 'app_ajax_product_parameters_admin')]
public function parametersAdmin(ProductRepository $repository, Request $request, ConfigurationRepository $configurationRepository)
{
$config = $configurationRepository->findOneBy([]);
$category = $request->query->get('category') ?? null;
$brand = $request->query->get('brand') ?? null;
$limit = $request->query->get('limit') ?? null;
$sort = $request->query->get('sort') ?? null;
$order = $request->query->get('order') ?? null;
$active = $request->query->get('active') ?? null;
$queryBuilder = $repository->createQueryBuilder('p');
if ($active !== null) {
$queryBuilder->andWhere('p.is_activ = :isActiv')
->setParameter('isActiv', $active);
}
if ($category && $category !== 'null') {
$queryBuilder->leftJoin('p.categories', 'pc');
$queryBuilder->andWhere('pc.id IN (:productCategory)')
->setParameter('productCategory', $category);
}
if ($brand && $brand !== 'null') {
$queryBuilder->leftJoin('p.brand', 'b');
$queryBuilder->andWhere('b.id = :brand');
$queryBuilder->setParameter('brand', $brand);
}
if ($limit && $limit !== 'null') {
$queryBuilder->setMaxResults($limit);
}
if ($sort && $order && $sort !== 'null' && $order !== 'null') {
$queryBuilder->orderBy('p.' . $sort, $order);
}
$products = $queryBuilder->getQuery()->getResult();
$data = $this->renderView('/product/admin/product/_table.html.twig', compact('products', 'config'));
return new JsonResponse([
'content' => $data
]);
}
#[Route('/ajax/product/category/{id}', name: 'app_ajax_product_cat')]
public function category(ProductRepository $repository, ProductCategory $productCategory)
{
$products = $repository->searchByCategory($productCategory);
$title = $productCategory->getName();
$data = $this->renderView('/product/public/_list.html.twig', compact('products', 'title'));
return new JsonResponse([
'content' => $data
]);
}
#[Route('/ajax/product/brand/{id}', name: 'app_ajax_product_brand')]
public function brand(ProductRepository $repository, Brand $brand)
{
$products = $repository->searchByBrand($brand);
$title = $brand->getName();
$data = $this->renderView('/product/public/_list.html.twig', compact('products', 'title'));
return new JsonResponse([
'content' => $data
]);
}
}