<?php
namespace App\Controller\FrontendShop;
use App\Entity\Gos\Category;
use App\Entity\Gos\Product;
use App\Entity\Gos\ProductAssociation;
use App\Entity\Gos\ProductVariant;
use App\Utils\ProductAssociationUtils;
use App\Utils\TemplateView;
use Doctrine\ORM\EntityManagerInterface;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\JsonResponse;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\Routing\Annotation\Route;
/**
* @Route("/")
*/
class ProductController extends AbstractController
{
private EntityManagerInterface $em;
private TemplateView $templateView;
public function __construct(EntityManagerInterface $em, TemplateView $templateView)
{
$this->em = $em;
$this->templateView = $templateView;
}
/**
* @Route("produkt/preview/{type}/{productAssociationId}", name="efProductPreview")
*/
public function previewAction($productAssociationId, $type = 'product'): JsonResponse
{
switch ($type)
{
case 'product':
$parameters = $this->templateView->resolveProductQuickPreviewParameters(
(int)$productAssociationId
);
$template = '/frontend-eforum/_partials/modules/productBanner.html.twig';
$parameters['isModal'] = 'isModal';
if (isset($parameters['product']))
{
foreach ($parameters['product']->getProducts() as $product)
{
/** @var Product $product */
if ($product->getIsEvent())
{
$template = '/frontend-eforum/_partials/modules/productEventBanner.html.twig';
}
}
}
break;
case 'changeSubscriptions':
case 'subscriptions':
$parameters = $this->templateView->resolveSubscriptionsPreviewParameters(
(int)$productAssociationId
);
if ($type === 'changeSubscriptions')
{
$parameters['change'] = true;
}
$template = '/frontend-eforum/_partials/modal-subscriptions.html.twig';
break;
}
if (isset($parameters) && isset($template))
{
if ($parameters['code'] != 500)
{
$body = $this->render($template, $parameters);
}
else
{
return $this->json([
'code' => 500,
'body' => ''
]);
}
return $this->json([
'code' => $parameters['code'],
'body' => $body->getContent()
]);
}
return $this->json([
'code' => 500,
'body' => ''
]);
}
/**
* @Route("{categorySlug}/{categoryChildSlug}/{productAssociationSlug}", name="efShowProduct", requirements={"categorySlug"="^(?!reset).*"})
* @Route("hiddenProduct/{categorySlug}/{categoryChildSlug}/{productAssociationSlug}", name="efShowHiddenProduct", requirements={"categorySlug"="^(?!reset).*"})
*/
public function showAction(Request $request, ProductAssociationUtils $associationUtils, $categoryChildSlug, $productAssociationSlug)
{
$repoProductAssociation = $this->em->getRepository(ProductAssociation::class);
/** @var ProductAssociation $productAssociation */
$productAssociation = $repoProductAssociation->findOneBySlug($productAssociationSlug);
/** @var Category $categoryChild */
$categoryChild = $this->em->getRepository(Category::class)->findOneByCategorySlug($categoryChildSlug);
if ($productAssociation === null)
{
throw $this->createNotFoundException();
}
if ($productAssociation->getIsHidden())
{
$route = $request->getUri();
$route = strpos($route, 'hiddenProduct');
if (!$route)
{
return $this->redirectToRoute('efShowDynamicTemplate');
}
}
$modules = $this->templateView->getView($productAssociation);
if ($modules === null)
{
return $this->redirectToRoute('efShowDynamicTemplate');
}
if ($categoryChild instanceof Category)
{
$modules['productsInCategory'] = $repoProductAssociation
->findAllWithinCategoryWithoutSelf($categoryChild->getId(), $productAssociation);
}
$parameters = $this->templateView->getExtraParameters(null, $productAssociation);
$parameters['modules'] = $modules;
$parameters['product'] = $productAssociation;
$parameters['productVariants'] = $productAssociation->getProductVariants()->toArray();
$parameters['breadcrumbs'] = [];
$parameters['isProductPage'] = true;
usort($parameters['productVariants'], [$associationUtils, 'sortProductVariantsByPrice']);
if ($productAssociation->getMainCategory() instanceof Category)
{
$parameters['breadcrumbs'][] = [
'url' => $this->generateUrl(
'category_show',
['category' => $productAssociation->getParentCategorySlug()]
),
'name' => $productAssociation->getMainCategory()->getCategoryName()
];
}
if ($productAssociation->getCategoryMaster() instanceof Category)
{
$parameters['breadcrumbs'][] = [
'url' => $this->generateUrl(
'category_show',
['category' => $productAssociation->getCategorySlug()]
),
'name' => $productAssociation->getCategoryMaster()->getCategoryName()
];
}
if ($productAssociation->getCategoryMaster() instanceof Category)
{
$parameters['breadcrumbs'][] = ['name' => $productAssociation->getTitle()];
}
// parameters to dataLayer
$categoriesList = [];
$categoriesList['6206'] = 'Oprogramowanie > Programy edukacyjne';
$categoriesList['6443'] = 'Oprogramowanie > Programy edukacyjne';
$categoriesList['6203'] = 'Oprogramowanie > Programy edukacyjne';
$categoriesList['6281'] = 'Oprogramowanie > Programy edukacyjne';
$categoriesList['6356'] = 'Oprogramowanie > Programy edukacyjne';
$categoriesList['6429'] = 'Oprogramowanie > Programy edukacyjne';
$categoriesList['6244'] = 'Oprogramowanie > Programy edukacyjne';
$categoriesList['5111'] = 'Oprogramowanie > Programy edukacyjne';
$categoriesList['5291'] = 'Oprogramowanie > Programy edukacyjne';
$categoriesList['5321'] = 'Oprogramowanie > Programy edukacyjne';
$categoriesList['5071'] = 'Oprogramowanie > Programy edukacyjne';
$categoriesList['5081'] = 'Oprogramowanie > Programy edukacyjne';
$categoriesList['5221'] = 'Oprogramowanie > Programy edukacyjne';
$categoriesList['61533'] = 'Media > Gazety i czasopisma';
$categoriesList['61708'] = 'Media > Gazety i czasopisma';
$categoriesList['61548'] = 'Media > Gazety i czasopisma';
$categoriesList['61703'] = 'Media > Gazety i czasopisma';
$categoriesList['61536'] = 'Media > Gazety i czasopisma';
$categoriesList['61706'] = 'Media > Gazety i czasopisma';
$categoriesList['61405'] = 'Media > Gazety i czasopisma';
$categoriesList['61540'] = 'Media > Gazety i czasopisma';
$categoriesList['61531'] = 'Media > Gazety i czasopisma';
$categoriesList['61543'] = 'Media > Gazety i czasopisma';
$categoriesList['61575'] = 'Media > Gazety i czasopisma';
$categoriesList['61410'] = 'Media > Gazety i czasopisma';
$categoriesList['61370'] = 'Media > Gazety i czasopisma';
$categoriesList['61544'] = 'Media > Gazety i czasopisma';
$categoriesList['61592'] = 'Media > Gazety i czasopisma';
$categoriesList['1505'] = 'Media > Gazety i czasopisma';
$categoriesList['61587'] = 'Media > Gazety i czasopisma';
$categoriesList['61705'] = 'Media > Gazety i czasopisma';
$categoriesList['61801'] = 'Media > Gazety i czasopisma';
$categoriesList['61528'] = 'Media > Gazety i czasopisma';
$categoriesList['61507'] = 'Media > Gazety i czasopisma';
$categoriesList['61555'] = 'Media > Gazety i czasopisma';
$categoriesList['4500'] = 'Media > Gazety i czasopisma';
$categoriesList['4754'] = 'Media > Gazety i czasopisma';
$categoriesList['4409'] = 'Media > Gazety i czasopisma';
$categoriesList['4408'] = 'Media > Gazety i czasopisma';
$categoriesList['4407'] = 'Media > Gazety i czasopisma';
$categoriesList['4667'] = 'Media > Gazety i czasopisma';
$categoriesList['4600'] = 'Media > Gazety i czasopisma';
$categoriesList['4606'] = 'Media > Gazety i czasopisma';
$categoriesList['4622'] = 'Media > Gazety i czasopisma';
$categoriesList['4683'] = 'Media > Gazety i czasopisma';
$categoriesList['4653'] = 'Media > Gazety i czasopisma';
$categoriesList['4406'] = 'Media > Gazety i czasopisma';
$categoriesList['4410'] = 'Media > Gazety i czasopisma';
$categoriesList['4405'] = 'Media > Gazety i czasopisma';
$categoriesList['4644'] = 'Media > Gazety i czasopisma';
$categoriesList['4654'] = 'Media > Gazety i czasopisma';
$categoriesList['4615'] = 'Media > Gazety i czasopisma';
$categoriesList['4635'] = 'Media > Gazety i czasopisma';
$categoriesList['4681'] = 'Media > Gazety i czasopisma';
$categoriesList['4680'] = 'Media > Gazety i czasopisma';
$categoriesList['4695'] = 'Media > Gazety i czasopisma';
$categoriesList['4753'] = 'Media > Gazety i czasopisma';
$categoriesList['4686'] = 'Media > Gazety i czasopisma';
$categoriesList['4674'] = 'Media > Gazety i czasopisma';
$categoriesList['4632'] = 'Media > Gazety i czasopisma';
$categoriesList['4697'] = 'Media > Gazety i czasopisma';
$categoriesList['4760'] = 'Media > Gazety i czasopisma';
$categoriesList['4655'] = 'Media > Gazety i czasopisma';
$categoriesList['4202'] = 'Media > Gazety i czasopisma';
$categoriesList['4699'] = 'Media > Gazety i czasopisma';
$categoriesList['4673'] = 'Media > Gazety i czasopisma';
$categoriesList['4245'] = 'Media > Gazety i czasopisma';
$categoriesList['4235'] = 'Media > Gazety i czasopisma';
$categoriesList['4237'] = 'Media > Gazety i czasopisma';
$categoriesList['4231'] = 'Media > Gazety i czasopisma';
$categoriesList['4218'] = 'Media > Gazety i czasopisma';
$categoriesList['4239'] = 'Media > Gazety i czasopisma';
$categoriesList['4698'] = 'Media > Gazety i czasopisma';
$categoriesList['4761'] = 'Media > Gazety i czasopisma';
$categoriesList['4689'] = 'Media > Gazety i czasopisma';
$categoriesList['4241'] = 'Media > Gazety i czasopisma';
$categoriesList['4217'] = 'Media > Gazety i czasopisma';
$categoriesList['8887'] = 'Media > Gazety i czasopisma';
$categoriesList['4764'] = 'Media > Gazety i czasopisma';
$categoriesList['4758'] = 'Media > Gazety i czasopisma';
$categoriesList['4785'] = 'Media > Gazety i czasopisma';
$categoriesList['4786'] = 'Media > Gazety i czasopisma';
$categoriesList['4782'] = 'Media > Gazety i czasopisma';
$dataLayer = false;
/** @var ProductVariant $variant */
foreach ($productAssociation->getProductVariants()->toArray() as $variant)
{
if ((preg_match('/ekonomiczn/', strtolower($variant->getTradeName())))
or
(preg_match('/jednostanowiskow/', strtolower($variant->getTradeName())))
)
{
$prodId = explode('/', $variant->getProductVariantNoComplete());
$prodId = ($prodId[0] ?? '');
$dataLayer = [];
$dataLayer['ecomm_prodid'] = $variant->getProductVariantNoComplete();
$dataLayer['ecomm_pagetype'] = 'product';
$dataLayer['ecomm_totalvalue'] = $variant->getPriceNet();
$dataLayer['ecomm_category'] = ($categoriesList[$prodId] ?? 'Media > Gazety i czasopisma');
break;
}
}
$parameters['dataLayer'] = $dataLayer;
return $this->render('frontend-eforum/index-product.html.twig', $parameters);
}
}