src/Controller/Website/ProductController.php line 274

Open in your IDE?
  1. <?php
  2. namespace App\Controller\Website;
  3. use App\Controller\Website\Trait\FiltrationTrait;
  4. use App\Entity\Product;
  5. use App\Entity\ProductIcon;
  6. use App\Facade\ProductFacade;
  7. use App\Facade\ProductVariantFacade;
  8. use App\Filtration\FiltrationFactory;
  9. use App\Pagination\PaginationFactory;
  10. use App\Repository\ProductCategoryRepository;
  11. use App\Repository\ProductFamilyRepository;
  12. use App\Repository\ProductRepository;
  13. use App\Repository\ProductVariantRepository;
  14. use App\Utils\SchemaManager;
  15. use App\Utils\SnippetManager;
  16. use Sulu\Bundle\ContactBundle\Api\Account as AccountApi;
  17. use Sulu\Bundle\MediaBundle\Api\Media;
  18. use Sulu\Bundle\MediaBundle\Media\Manager\MediaManagerInterface;
  19. use Sulu\Component\Content\Compat\StructureInterface;
  20. use Sulu\Component\Webspace\Analyzer\Attributes\RequestAttributes;
  21. use Sulu\Component\Webspace\Webspace;
  22. use Symfony\Component\HttpFoundation\RedirectResponse;
  23. use Symfony\Component\HttpFoundation\Request;
  24. use Symfony\Component\HttpFoundation\Response;
  25. class ProductController extends SuluExtendController
  26. {
  27.     use FiltrationTrait;
  28.     public function viewAction(
  29.         Product   $product,
  30.         ProductCategoryRepository     $productCategoryRepository,
  31.         ProductFamilyRepository     $productFamilyRepository,
  32.         ProductRepository     $productRepository,
  33.         ProductFacade            $productFacade,
  34.         ProductVariantRepository $productVariantRepository,
  35.         ProductVariantFacade     $productVariantFacade,
  36.         PaginationFactory        $paginationFactory,
  37.         FiltrationFactory        $filtrationFactory,
  38.         SnippetManager $snippetManager,
  39.         SchemaManager $schemaManager,
  40.         MediaManagerInterface $mediaManager,
  41.         Request     $request,
  42.                     $_sulu,
  43.                     $attributes = [],
  44.                     $preview false,
  45.                     $partial false,
  46.     ): Response
  47.     {
  48.         /** @var Webspace $webspace */
  49.         $webspace $request->attributes->get('_sulu')->getAttribute('webspace');
  50.         if (isset($_GET['pdf']) && isset($_GET['variantId'])) {
  51.             $productVariant $productVariantRepository->find($_GET['variantId']);
  52.             $product $productRepository->findOneByTitle($productVariant->getTitle(), $productVariant->getLocale());
  53.             $organizationArea $snippetManager->loadByArea('organization');
  54.             if ($organizationArea && $organizationArea['content']['organization']) {
  55.                 /** @var AccountApi $accountApi */
  56.                 $accountApi $organizationArea['content']['organization'];
  57.                 $account $accountApi->getEntity();
  58.                 $postalAddress $account->getMainAddress();
  59.                 $attributes['pdf_footer'] = [
  60.                     'url' => 'https://' $_SERVER['HTTP_HOST'] . $product->getRoute()->getPath(),
  61.                     'email' => [
  62.                         'title' => $account->getMainEmail(),
  63.                         'url' => 'mailto:' $account->getMainEmail()
  64.                     ],
  65.                     'phone' => [
  66.                         'title' => $account->getMainPhone(),
  67.                         'url' => 'tel:' $account->getMainPhone()
  68.                     ],
  69.                 ];
  70.                 if ($postalAddress) {
  71.                     $attributes['pdf_header']['columns'][0] = [
  72.                         'title' => $account->getName(),
  73.                         'content' => '<p>' $postalAddress->getStreet() . ' ' $postalAddress->getNumber() . '</br>' $postalAddress->getZip() . ' ' $postalAddress->getCity() . '</p>',
  74.                     ];
  75.                 }
  76.                 if ($account->getIdentificationNumber() && $account->getTaxIdentificationNumber()) {
  77.                     $attributes['pdf_header']['columns'][1] = [
  78.                         'content' => '<p><strong>IČO:</strong> ' $account->getIdentificationNumber() . '</br><strong>DIČ:</strong>' $account->getTaxIdentificationNumber() . '</p>',
  79.                     ];
  80.                 }
  81.             }
  82.             if ($productVariant) {
  83.                 $attributes['item'] = $productVariantFacade->renderProductVariantPdf($productVariant$webspace->getKey(), $productVariant->getLocale());
  84.                 return $this->renderAll('pages/product-pdf.html.twig'$attributes$preview$partial);
  85.             }
  86.         }
  87.         $limit 20;
  88.         $page $request->query->get('page'1);
  89.         $queryFilters $this->getQueryFilters($request);
  90.         $attributes $this->getAttributes($attributes);
  91.         $attributes['breadcrumbs'] = $this->getBreadcrumbs('product'$product->getUuid());
  92.         $schema $schemaManager->getDefaultSchemas($attributes['breadcrumbs']);
  93.         $attributes['product'] = $product;
  94.         if(isset($attributes['content']['blocks'])) {
  95.             $blockList $this->resolveBlocks($attributes['content']['blocks'], $schema);
  96.             if($blockList instanceof RedirectResponse) {
  97.                 return $blockList;
  98.             }
  99.             $attributes['blocks'] = $blockList->getBlocks();
  100.             $schema $blockList->getSchema();
  101.         }
  102.         // ---------------------------------------
  103.         // Product intro
  104.         // ---------------------------------------
  105.         $attributes['text_media_section'] = [
  106.             'header' => [
  107.                 'heading' => [
  108.                     'title' => $product->getTitle(),
  109.                 ],
  110.             ],
  111.             'header_position' => 'in',
  112.             'spacing' => 'none',
  113.             'variant' => 'product',
  114.         ];
  115.         if ($product->getDescription()) {
  116.             $attributes['text_media_section']['content'] = $product->getDescription();
  117.         }
  118.         if ($product->isImage()) {
  119.             $media $mediaManager->getById($product->getImage()->getId(), $product->getLocale());
  120.             $attributes['text_media_section']['media'] = [
  121.                 'img' => [
  122.                     'src' => $media->getThumbnails()['656x656'],
  123.                     'srcset' => [
  124.                         $media->getThumbnails()['656x656'] . ' 1x',
  125.                         $media->getThumbnails()['1312x1312'] . ' 2x',
  126.                     ],
  127.                 ],
  128.             ];
  129.             if ($productVariantRepository->isNewProductVariant($product->getTitle())) {
  130.                 $attributes['text_media_section']['media']['tag'] = [
  131.                     'title' => 'Novinka',
  132.                 ];
  133.             }
  134.         }
  135.         if ($product->getCode()) {
  136.             $attributes['text_media_section']['description']['code'] = $product->getCode();
  137.         }
  138.         if ($product->getCategory()) {
  139.             $productCategory $productCategoryRepository->findOneByImportId($product->getCategory(), $product->getLocale());
  140.             if ($productCategory) {
  141.                 $attributes['text_media_section']['description']['category'] = $productCategory->getTitle();
  142.             }
  143.         }
  144.         if ($product->getFamily()) {
  145.             $productFamily $productFamilyRepository->findOneByImportId($product->getFamily(), $product->getLocale());
  146.             if ($productFamily) {
  147.                 $attributes['text_media_section']['description']['family'] = $productFamily->getTitle();
  148.             }
  149.         }
  150.         $icons $product->getIcons()?->map(function(ProductIcon $productIcon) use($product$mediaManager) {
  151.             return $mediaManager->getById($productIcon->getMedia()->getId(), $product->getLocale());
  152.         });
  153.         if (!$icons->isEmpty()) {
  154.             /** @var Media $icon */
  155.             foreach ($icons as $icon) {
  156.                 $attributes['text_media_section']['description']['specs'][$icon->getId()] = [
  157.                     'tooltip' => [
  158.                         'icon' => [
  159.                             'src' => $icon->getThumbnails()['32x32'],
  160.                         ],
  161.                     ],
  162.                 ];
  163.                 if ($icon->getDescription()) {
  164.                     $attributes['text_media_section']['description']['specs'][$icon->getId()]['tooltip']['title'] = $icon->getDescription();
  165.                 }
  166.             }
  167.         }
  168.         // ---------------------------------------
  169.         // Product variants
  170.         // ---------------------------------------
  171.         $filtration $filtrationFactory->createProductVariantsFiltration(
  172.             webspace$webspace->getKey(),
  173.             locale$request->getLocale(),
  174.             products: [$product],
  175.             filters$queryFilters,
  176.         );
  177.         $qb $productVariantRepository->getProductVariantsQueryBuilder(
  178.             webspace$webspace->getKey(),
  179.             locale$request->getLocale(),
  180.             products: [$product],
  181.             types$queryFilters['types'],
  182.             fixations$queryFilters['fixations'],
  183.             minLuminousFlux$queryFilters['minLuminousFlux'],
  184.             maxLuminousFlux$queryFilters['maxLuminousFlux'],
  185.             cris$queryFilters['cris'],
  186.             chromaticities$queryFilters['chromaticities'],
  187.             dispersionVariants$queryFilters['dispersionVariants'],
  188.             ips$queryFilters['ips'],
  189.             radiationDirects$queryFilters['radiationDirects'],
  190.             shapes$queryFilters['shapes'],
  191.             minLength$queryFilters['minLength'],
  192.             maxLength$queryFilters['maxLength'],
  193.             minWidth$queryFilters['minWidth'],
  194.             maxWidth$queryFilters['maxWidth'],
  195.             minHeight$queryFilters['minHeight'],
  196.             maxHeight$queryFilters['maxHeight'],
  197.             colors$queryFilters['colors'],
  198.             usages$queryFilters['usages'],
  199.             maxTemperatures$queryFilters['maxTemperatures'],
  200.             minTemperatures$queryFilters['minTemperatures'],
  201.             minInputPower$queryFilters['minInputPower'],
  202.             maxInputPower$queryFilters['maxInputPower'],
  203.             minEfficiency$queryFilters['minEfficiency'],
  204.             maxEfficiency$queryFilters['maxEfficiency'],
  205.             elProtects$queryFilters['elProtects'],
  206.             powerMethods$queryFilters['powerMethods'],
  207.             resourceTypes$queryFilters['resourceTypes'],
  208. //            lightSources: $queryFilters['lightSources'],
  209.             statuses$queryFilters['statuses'],
  210.             mechanicalDurabilities$queryFilters['mechanicalDurabilities'],
  211.             dispersions$queryFilters['dispersions'],
  212.             drivers$queryFilters['drivers'],
  213.             accessories$queryFilters['accessories'],
  214.         );
  215.         $pagination $paginationFactory->create();
  216.         $pagination->setMaxPerPage($limit);
  217.         $pagination->setPage($page);
  218.         $pagination->queryBuilderInit($qb);
  219.         $variants = [];
  220.         if ($pagination->hasPageResults()) {
  221.             foreach ($pagination->getPageResults() as $pageResult) {
  222.                 foreach ($pageResult as $productVariant) {
  223.                     $variants[] = $productVariantFacade->renderProductVariant($productVariant);
  224.                 }
  225.             }
  226.         }
  227.         $filtrationSettings $snippetManager->loadByArea('filtration_settings');
  228.         $attributes['product_variants_section'] = [
  229.             'header' => [
  230.                 'heading' => [
  231.                     'title' => 'Varianty produktu',
  232.                 ],
  233.                 'variant' => 'left',
  234.             ],
  235.             'empty_title' => 'Žádné výsledky',
  236.             'filter' => [
  237.                 'id' => 'product-filter-form',
  238.                 'product_id' => $product->getId(),
  239.                 'reset_btn' => [
  240.                     'title' => 'Smazat všechny filtry',
  241.                     'form' => 'product-filter-form',
  242.                 ],
  243.                 'form_list' => $filtration->render(
  244.                     settings$filtrationSettings['content'] ?? null,
  245.                     product$product,
  246.                 ),
  247.             ],
  248.             'table' => [
  249.                 'items' => $variants,
  250.             ],
  251.             'pagination' => $pagination->renderPagination(),
  252.             'limit' => $limit,
  253.         ];
  254.         // ---------------------------------------
  255.         // Accessories
  256.         // ---------------------------------------
  257.         $productDetailSnippet $snippetManager->loadByArea('product_detail_settings'$webspace->getKey(), $product->getLocale());
  258.         $accessories $productVariantRepository->getAccessories($product->getTItle(), $webspace->getKey(), $product->getLocale());
  259.         $renderedAccessories $productRepository->renderAccessories($accessories$webspace->getKey(), $product->getLocale());
  260.         if ($renderedAccessories) {
  261.             $attributes['accessories_products_slider'] = [
  262.                 'id' => 'products-slider-1',
  263.                 'bg_color' => true,
  264.             ];
  265.             if ($productDetailSnippet && $productDetailSnippet['content']['accessories_title']) {
  266.                 $attributes['accessories_products_slider']['header']['heading']['title'] = $productDetailSnippet['content']['accessories_title'];
  267.             }
  268.             if ($productDetailSnippet && $productDetailSnippet['content']['accessories_description']) {
  269.                 $attributes['accessories_products_slider']['header']['perex'] = $productDetailSnippet['content']['accessories_description'];
  270.             }
  271.             $attributes['accessories_products_slider']['group']['items'] = $renderedAccessories;
  272.         }
  273.         // ---------------------------------------
  274.         // Similar products
  275.         // ---------------------------------------
  276.         $similarProducts $productFacade->renderProducts(
  277.             webspace$webspace->getKey(),
  278.             locale$product->getLocale(),
  279.             productCategoryImportId$product->getCategory(),
  280.             currentProductId$product->getId()
  281.         );
  282.        
  283.         if ($similarProducts) {
  284.             $attributes['similar_products_slider'] = [
  285.                 'id' => 'products-slider-2',
  286.                 'spacing' => 'bottom-0',
  287.             ];
  288.             if ($productDetailSnippet && $productDetailSnippet['content']['similar_products_title']) {
  289.                 $attributes['similar_products_slider']['header']['heading']['title'] = $productDetailSnippet['content']['similar_products_title'];
  290.             }
  291.             if ($productDetailSnippet && $productDetailSnippet['content']['similar_products_description']) {
  292.                 $attributes['similar_products_slider']['header']['perex'] = $productDetailSnippet['content']['similar_products_description'];
  293.             }
  294.             $attributes['similar_products_slider']['group']['items'] = $similarProducts;
  295.         }
  296.         $attributes['_schema'] = implode(''$schema);
  297.         $this->setEntitySocialMeta($product);
  298.         $this->setEntitySeoMeta($product);
  299.         return $this->renderAll('pages/product.html.twig'$attributes$preview$partial);
  300.     }
  301.     public function listAction(
  302.         StructureInterface $structure,
  303.         ProductCategoryRepository $productRepository,
  304.         PaginationFactory $paginationFactory,
  305.         SchemaManager $schemaManager,
  306.         Request     $request,
  307.         RequestAttributes $_sulu,
  308.         $attributes = [],
  309.         $preview false,
  310.         $partial false,
  311.     ): Response
  312.     {
  313.         $categoryId $request->query->get('c');
  314.         $category null;
  315.         $attributes $this->getAttributes([], $structure);
  316.         $attributes['breadcrumbs'] = $this->getBreadcrumbs('product_family'$attributes['uuid']);
  317.         $schema $schemaManager->getDefaultSchemas($attributes['breadcrumbs']);
  318.         $attributes['references']['header'] = [
  319.             'title' => [
  320.                 'first' => $attributes['content']['title_first'],
  321.                 'second' => $attributes['content']['title_second'],
  322.             ],
  323.             'overline' => [
  324.                 'title' => $attributes['content']['title_small'],
  325.                 'symbol' => $attributes['content']['symbol'],
  326.             ],
  327.             'perex' => $attributes['content']['description'],
  328.         ];
  329.         if($attributes['content']['image_pill'] instanceof Media) {
  330.             /** @var Media $imagePill */
  331.             $imagePill $attributes['content']['image_pill'];
  332.             $attributes['references']['header']['title']['pill'] = [
  333.                 'src' => $imagePill->getThumbnails()['240x240'],
  334.                 'srcset' => [
  335.                     $imagePill->getThumbnails()['240x240'] . ' 1x',
  336.                     $imagePill->getThumbnails()['480x480'] . ' 2x',
  337.                 ],
  338.                 'alt' => $imagePill->getTitle(),
  339.             ];
  340.         }
  341.         $limit $attributes['content']['limit'] ?? 6;
  342.         $qb $productRepository->prepareQueryBuilder(
  343.             $_sulu->getAttribute('webspace')->getKey(),
  344.             $_sulu->getAttribute('locale'),
  345.             $category?->getId()
  346.         );
  347.         $pagination $paginationFactory->create();
  348.         $pagination->setMaxPerPage($limit);
  349.         $pagination->setPage(1);
  350.         $pagination->queryBuilderInit($qb);
  351.         $products = [];
  352.         if($pagination->hasPageResults()) {
  353.             $wideCounter 0;
  354.             foreach($pagination->getPageResults() as $pageResult) {
  355.                 foreach($pageResult as $product) {
  356.                     $wide false;
  357.                     $wideCounter++;
  358.                     if($wideCounter === 1) {
  359.                         $wide true;
  360.                     }
  361.                     elseif($wideCounter === 6) {
  362.                         $wideCounter 0;
  363.                         $wide true;
  364.                     }
  365.                     $products[] = $productRepository->getFamilies();
  366.                 }
  367.             }
  368.         }
  369.         $attributes['references']['references'] = $products;
  370.         $attributes['references']['references_limit'] = $limit;
  371.         if($category) {
  372.             $attributes['references']['references_category'] = $category->getId();
  373.         }
  374.         if($pagination->hasNextPage()) {
  375.             $attributes['references']['references_load_more'] = true;
  376.         }
  377.         if(isset($attributes['content']['blocks'])) {
  378.             $blockList $this->resolveBlocks($attributes['content']['blocks'], $schema);
  379.             if($blockList instanceof RedirectResponse) {
  380.                 return $blockList;
  381.             }
  382.             $attributes['content']['blocks'] = $blockList->getBlocks();
  383.             $schema $blockList->getSchema();
  384.         }
  385.         $attributes['_schema'] = implode(''$schema);
  386.         return $this->renderAll('pages/reference-list.html.twig'$attributes$preview$partial);
  387.     }
  388. }