<?php
namespace App\Controller\Website;
use App\Controller\Website\Trait\FiltrationTrait;
use App\Entity\ProductFamily;
use App\Facade\ProductFacade;
use App\Facade\ProductFamilyFacade;
use App\Filtration\FiltrationFactory;
use App\Pagination\PaginationFactory;
use App\Repository\ProductFamilyRepository;
use App\Utils\SchemaManager;
use App\Utils\SnippetManager;
use Sulu\Bundle\MediaBundle\Api\Media;
use Sulu\Component\Content\Compat\StructureInterface;
use Sulu\Component\Webspace\Analyzer\Attributes\RequestAttributes;
use Sulu\Component\Webspace\Webspace;
use Symfony\Component\HttpFoundation\RedirectResponse;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use App\Repository\ProductRepository;
class ProductFamilyController extends SuluExtendController
{
use FiltrationTrait;
public function viewAction(
ProductFamily $productFamily,
ProductFamilyFacade $productFamilyFacade,
ProductRepository $productRepository,
ProductFacade $productFacade,
SchemaManager $schemaManager,
FiltrationFactory $filtrationFactory,
PaginationFactory $paginationFactory,
SnippetManager $snippetManager,
Request $request,
$_sulu,
$attributes = [],
$preview = false,
$partial = false,
): Response
{
/** @var Webspace $webspace */
$webspace = $request->attributes->get('_sulu')->getAttribute('webspace');
$limit = 18;
$page = $request->query->get('page', 1);
$queryFilters = $this->getQueryFilters($request);
$attributes = $this->getAttributes($attributes);
$attributes['breadcrumbs'] = $this->getBreadcrumbs('product_family', $productFamily->getUuid());
$schema = $schemaManager->getDefaultSchemas($attributes['breadcrumbs']);
$attributes['productFamily'] = $productFamily;
if(isset($attributes['content']['blocks'])) {
$blockList = $this->resolveBlocks($attributes['content']['blocks'], $schema);
if($blockList instanceof RedirectResponse) {
return $blockList;
}
$attributes['blocks'] = $blockList->getBlocks();
$schema = $blockList->getSchema();
}
// ---------------------------------------
// Aside settings
// ---------------------------------------
$filtrationSettings = $snippetManager->loadByArea('filtration_settings');
$filtration = $filtrationFactory->createProductsFiltration(
webspace: $webspace->getKey(),
locale: $request->getLocale(),
families: [$productFamily],
filters: $queryFilters,
);
$attributes['filtration'] = [
'variant' => 'inline',
'id' => 'category-filter-form-id',
'family_id' => $productFamily->getId(),
'form_list' => $filtration->render(
settings: $filtrationSettings['content'] ?? null,
productFamily: $productFamily,
),
];
$attributes['tags'] = [
'id' => 'category-filter-form-id',
'reset_btn' => [
'title' => 'Smazat všechny filtry',
'form' => 'category-filter-form-id',
],
];
$attributes['content_w_aside_props'] = [
'aside' => true,
'variant' => 'reverse',
'spacing' => 'top-md',
'extra_calss' => 'content-w-aside-category',
];
// ---------------------------------------
// Product family section
// ---------------------------------------
$attributes['families_section'] = [
'header' => [
'heading' => [
'title' => $productFamily->getTitle(),
'style' => 'h2',
],
],
'spacing' => 'none',
'form' => [
'cols' => 5,
'items' => $productFamilyFacade->renderProductFamilies($productFamily->getUuid(), $productFamily->getCategory()),
],
];
// ---------------------------------------
// Products
// ---------------------------------------
$qb = $productRepository->getProductsQueryBuilder(
webspace: $webspace->getKey(),
locale: $request->getLocale(),
families: [$productFamily],
types: $queryFilters['types'],
fixations: $queryFilters['fixations'],
minLuminousFlux: $queryFilters['minLuminousFlux'],
maxLuminousFlux: $queryFilters['maxLuminousFlux'],
cris: $queryFilters['cris'],
chromaticities: $queryFilters['chromaticities'],
dispersionVariants: $queryFilters['dispersionVariants'],
ips: $queryFilters['ips'],
radiationDirects: $queryFilters['radiationDirects'],
shapes: $queryFilters['shapes'],
minLength: $queryFilters['minLength'],
maxLength: $queryFilters['maxLength'],
minWidth: $queryFilters['minWidth'],
maxWidth: $queryFilters['maxWidth'],
minHeight: $queryFilters['minHeight'],
maxHeight: $queryFilters['maxHeight'],
colors: $queryFilters['colors'],
usages: $queryFilters['usages'],
maxTemperatures: $queryFilters['maxTemperatures'],
minTemperatures: $queryFilters['minTemperatures'],
minInputPower: $queryFilters['minInputPower'],
maxInputPower: $queryFilters['maxInputPower'],
minEfficiency: $queryFilters['minEfficiency'],
maxEfficiency: $queryFilters['maxEfficiency'],
elProtects: $queryFilters['elProtects'],
powerMethods: $queryFilters['powerMethods'],
resourceTypes: $queryFilters['resourceTypes'],
// lightSources: $queryFilters['lightSources'],
statuses: $queryFilters['statuses'],
mechanicalDurabilities: $queryFilters['mechanicalDurabilities'],
dispersions: $queryFilters['dispersions'],
drivers: $queryFilters['drivers'],
accessories: $queryFilters['accessories'],
);
$pagination = $paginationFactory->create();
$pagination->setMaxPerPage($limit);
$pagination->setPage($page);
$pagination->queryBuilderInit($qb);
$products = [];
if ($pagination->hasPageResults()) {
foreach ($pagination->getPageResults() as $pageResult) {
foreach ($pageResult as $product) {
$products[] = $productFacade->renderProduct($product);
}
}
}
$attributes['product_list_section']['group']['items'] = $products;
$attributes['product_list_section']['limit'] = $limit;
$attributes['product_list_section']['pagination'] = $pagination->renderPagination();
$attributes['product_list_section']['empty_title'] = 'Nebyly nalezeny žádné výsledky';
$attributes['_schema'] = implode('', $schema);
$this->setEntitySocialMeta($productFamily);
$this->setEntitySeoMeta($productFamily);
return $this->renderAll('pages/product-family.html.twig', $attributes, $preview, $partial);
}
public function listAction(
StructureInterface $structure,
ProductFamilyRepository $productFamilyRepository,
ProductFamilyFacade $productFamilyFacade,
PaginationFactory $paginationFactory,
SchemaManager $schemaManager,
Request $request,
RequestAttributes $_sulu,
$attributes = [],
$preview = false,
$partial = false,
): Response
{
$categoryId = $request->query->get('c');
$category = null;
$attributes = $this->getAttributes([], $structure);
$attributes['breadcrumbs'] = $this->getBreadcrumbs('product_family', $attributes['uuid']);
$schema = $schemaManager->getDefaultSchemas($attributes['breadcrumbs']);
$attributes['references']['header'] = [
'title' => [
'first' => $attributes['content']['title_first'],
'second' => $attributes['content']['title_second'],
],
'overline' => [
'title' => $attributes['content']['title_small'],
'symbol' => $attributes['content']['symbol'],
],
'perex' => $attributes['content']['description'],
];
if($attributes['content']['image_pill'] instanceof Media) {
/** @var Media $imagePill */
$imagePill = $attributes['content']['image_pill'];
$attributes['references']['header']['title']['pill'] = [
'src' => $imagePill->getThumbnails()['240x240'],
'srcset' => [
$imagePill->getThumbnails()['240x240'] . ' 1x',
$imagePill->getThumbnails()['480x480'] . ' 2x',
],
'alt' => $imagePill->getTitle(),
];
}
$limit = $attributes['content']['limit'] ?? 6;
$qb = $productFamilyRepository->prepareQueryBuilder(
$_sulu->getAttribute('webspace')->getKey(),
$_sulu->getAttribute('locale'),
$category?->getId()
);
$pagination = $paginationFactory->create();
$pagination->setMaxPerPage($limit);
$pagination->setPage(1);
$pagination->queryBuilderInit($qb);
$productFamilies = [];
if($pagination->hasPageResults()) {
$wideCounter = 0;
foreach($pagination->getPageResults() as $pageResult) {
foreach($pageResult as $productFamily) {
$wide = false;
$wideCounter++;
if($wideCounter === 1) {
$wide = true;
}
elseif($wideCounter === 6) {
$wideCounter = 0;
$wide = true;
}
$productFamilies[] = $productFamilyFacade->renderProductFamilies();
}
}
}
$attributes['references']['references'] = $productFamilies;
$attributes['references']['references_limit'] = $limit;
if($category) {
$attributes['references']['references_category'] = $category->getId();
}
if($pagination->hasNextPage()) {
$attributes['references']['references_load_more'] = true;
}
if(isset($attributes['content']['blocks'])) {
$blockList = $this->resolveBlocks($attributes['content']['blocks'], $schema);
if($blockList instanceof RedirectResponse) {
return $blockList;
}
$attributes['content']['blocks'] = $blockList->getBlocks();
$schema = $blockList->getSchema();
}
$attributes['_schema'] = implode('', $schema);
return $this->renderAll('pages/reference-list.html.twig', $attributes, $preview, $partial);
}
}