<?php
namespace App\Controller;
use App\Entity\Product;
use App\Form\Filter\EshopFilterType;
use App\Repository\ProductRepository;
use App\Services\EshopFilter;
use Knp\Component\Pager\PaginatorInterface;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\HttpFoundation\Session\Session;
use Symfony\Component\Routing\Annotation\Route;
class EshopController extends AbstractController
{
#[Route('/eshop', name: 'app_eshop_index')]
public function index(
ProductRepository $productRepository,
Request $request,
PaginatorInterface $paginator,
Session $session,
EshopFilter $productFilter
): Response
{
// clear filter
if ($productFilter->clearFilter($session, $request) == true) {
return $this->redirect($this->generateUrl('app_eshop_index'));
}
// ulozeni strankovace
$paginationSettings = $productFilter->storePaginationSettings($session, $request);
$data = [
'material' => $session->get('filter-eshop-material', null),
'category' => $session->get('filter-eshop-category', null),
'priceFrom' => $session->get('filter-eshop-price-from', null),
'priceTo' => $session->get('filter-eshop-price-to', null),
'orderBy' => $session->get('filter-eshop-order-by', 'ASC'),
];
$formFilter = $this->createForm(EshopFilterType::class, $data, [
'action' => $this->generateUrl('app_eshop_index'),
'method' => 'post',
'request' => $request,
'is_admin' => $this->isGranted('ROLE_ADMIN', $this->getUser())
]);
// ulozim filtr do session
$productFilter->storeFilter($formFilter, $request, $session);
// aplikace filtru do vybirani dat
$queryBuilder = $productRepository->createQueryBuilder('p');
/** @var Product[] $products */
$products = $productFilter->applyFilter($session, $request, $queryBuilder, $paginator);
return $this->render('eshop/index.html.twig', [
'products' => $products,
'filter' => $formFilter->createView(),
'pageSize' => $paginationSettings['pageSize']
]);
}
#[Route('/eshop/product/{product}', name: 'app_eshop_product_detail')]
public function detail(Product $product){
return $this->render('eshop/product_detail.html.twig', [
'product' => $product,
]);
}
}