src/Controller/ProductController.php line 35

Open in your IDE?
  1. <?php
  2. namespace App\Controller;
  3. use Pimcore\Controller\FrontendController;
  4. use Symfony\Component\HttpFoundation\Request;
  5. use Symfony\Component\HttpFoundation\Response;
  6. use Symfony\Component\HttpFoundation\JsonResponse;
  7. use Symfony\Component\Routing\Annotation\Route;
  8. use Pimcore\Model\DataObject\Product;
  9. use Pimcore\Model\DataObject\Data\UrlSlug;
  10. use Pimcore\Model\DataObject\Category;
  11. use Pimcore\Model\DataObject\Rivestimenti;
  12. use Pimcore\Model\DataObject\RivestimentiCategory;
  13. use Pimcore\Model\DataObject\Finiture;
  14. use Pimcore\Model\DataObject\FinitureTipologie;
  15. use Pimcore\Db;
  16. use Pimcore\Bundle\EcommerceFrameworkBundle\Factory;
  17. use Pimcore\Bundle\EcommerceFrameworkBundle\FilterService\ListHelper;
  18. use Pimcore\Bundle\EcommerceFrameworkBundle\IndexService\ProductList\DefaultMysql;
  19. use Pimcore\Bundle\EcommerceFrameworkBundle\IndexService\ProductList\ElasticSearch\AbstractElasticSearch;
  20. use Pimcore\Bundle\EcommerceFrameworkBundle\IndexService\ProductList\ProductListInterface;
  21. use Knp\Component\Pager\Pagination\SlidingPagination;
  22. use Knp\Component\Pager\PaginatorInterface;
  23. use Pimcore\Config;
  24. use Symfony\Contracts\Translation\TranslatorInterface;
  25. class ProductController extends FrontendController
  26. {
  27.     /**
  28.      * @Route("/{locale}/{path}/{category}", name="lista", requirements={"locale"="it|en", "path"="(prodotti|products)", "category"=".*?"})
  29.      *
  30.      * @return Response
  31.      */
  32.     public function listaAction(Request $requestFactory $ecommerceFactoryListHelper $listHelperPaginatorInterface $paginator): Response
  33.     {
  34.         $params array_merge($request->query->all(), $request->attributes->all());
  35.         $category Category::getbyUrl($params['category'], $params['locale'], true);
  36.         if(!$category){
  37.             return $this->redirect('/');
  38.         }
  39.         $indexService $ecommerceFactory->getIndexService();
  40.         $productListing $indexService->getProductListForCurrentTenant();
  41.         $productListing->setCategory($category);
  42.         $params['productListing'] = $productListing;
  43.         $params['categorydo'] = $category;
  44.         $filterDefinition $category->getFilterdefinition();
  45.         if ($request->get('filterdefinition') instanceof FilterDefinition) {
  46.             $filterDefinition $request->get('filterdefinition');
  47.         }
  48.         if (empty($filterDefinition)) {
  49.             $filterDefinition Config::getWebsiteConfig()['fallbackFilterdefinition'];
  50.         }
  51.         $filterService $ecommerceFactory->getFilterService();
  52.         $listHelper->setupProductList($filterDefinition$productListing$params$filterServicetrue);
  53.         $params['filterService'] = $filterService;
  54.         $params['filterDefinition'] = $filterDefinition;
  55.         $paginator $paginator->paginate(
  56.             $productListing,
  57.             $request->get('page'1),
  58.             $filterDefinition->getPageLimit()
  59.         );
  60.         $params['results'] = $paginator;
  61.         $params['paginationVariables'] = $paginator->getPaginationData();
  62.         $params['pageTitle'] = $category->getPageTitle();
  63.         $params['pageDescription'] = $category->getPageDescription();
  64.         $params['intro'] = $category->getIntro();
  65.         $params['description'] = $category->getDescription();        
  66.         return $this->render('product/product-list.html.twig'$params);
  67.         //print_r($params);
  68.         /*$products = new Product\Listing();
  69.         return $this->render('product/list.html.twig', [
  70.             'products' => $products
  71.         ]);*/
  72.         /*$params = array_merge($request->query->all(), $request->attributes->all());
  73.         //needed to make sure category filter filters for active category
  74.         $params['parentCategoryIds'] = $params['category'] ?? null;
  75.         $category = Category::getById($params['category'] ?? -1);
  76.         $params['category'] = $category;
  77.         if ($category) {
  78.             //$headTitleHelper($category->getName());
  79.             //$breadcrumbHelperService->enrichCategoryPage($category);
  80.         }
  81.         $indexService = $ecommerceFactory->getIndexService();
  82.         $productListing = $indexService->getProductListForCurrentTenant();
  83.         $productListing->setCategory(Category::getById(781));
  84.         foreach($productListing as $prod){
  85.             echo $prod->getId()."<br/>";
  86.         }
  87.         $productListing->setVariantMode(ProductListInterface::VARIANT_MODE_VARIANTS_ONLY);
  88.         $params['productListing'] = $productListing;
  89.         // load current filter
  90.         if ($category) {
  91.             $filterDefinition = $category->getFilterdefinition();
  92.             //track segments for personalization
  93.             //$segmentTrackingHelperService->trackSegmentsForCategory($category);
  94.             $trackingManager = $ecommerceFactory->getTrackingManager();
  95.             $trackingManager->trackCategoryPageView($category->getName(), null);
  96.         }
  97.         if ($request->get('filterdefinition') instanceof FilterDefinition) {
  98.             $filterDefinition = $request->get('filterdefinition');
  99.         }
  100.         if (empty($filterDefinition)) {
  101.             $filterDefinition = Config::getWebsiteConfig()['fallbackFilterdefinition'];
  102.         }
  103.         $filterService = $ecommerceFactory->getFilterService();
  104.         $listHelper->setupProductList($filterDefinition, $productListing, $params, $filterService, true);
  105.         $params['filterService'] = $filterService;
  106.         $params['filterDefinition'] = $filterDefinition;
  107.         // init pagination
  108.         $paginator = $paginator->paginate(
  109.             $productListing,
  110.             $request->get('page', 1),
  111.             $filterDefinition->getPageLimit()
  112.         );
  113.         $params['results'] = $paginator;
  114.         $params['paginationVariables'] = $paginator->getPaginationData();
  115.         // track product impressions
  116.         $trackingManager = $ecommerceFactory->getTrackingManager();
  117.         foreach ($paginator as $product) {
  118.             $trackingManager->trackProductImpression($product, 'grid');
  119.         }
  120.         return $this->render('product/listing.html.twig', $params);*/
  121.     }
  122.     public function detailAction(Request $requestProduct $objectUrlSlug $urlSlug): Response
  123.     {
  124.         $rivestimenti $object->getRivestimenti();
  125.         $rivestimenti_id = [];
  126.         foreach($rivestimenti as $rivestimento){
  127.             $rivestimenti_id[] = $rivestimento->getId();
  128.         }
  129.         $finiture $object->getFiniture();
  130.         $finiture_id = [];
  131.         foreach($finiture as $finitura){
  132.             $finiture_id[] = $finitura->getId();
  133.         }
  134.         return $this->render('product/detail.html.twig', [
  135.             'product' => $object,
  136.             'rivestimenti' => implode(","$rivestimenti_id),
  137.             'finiture' => implode(","$finiture_id),
  138.             'metaDescription' => $object->getDescrizione()
  139.         ]);
  140.     }
  141.     /**
  142.      * @Route("/{locale}/get-product-coatings", name="get-product-coatings", requirements={"locale"="it|en"})
  143.      *
  144.      * @return Response
  145.      */
  146.     public function getProductsCoatingsAction(Request $requestTranslatorInterface $translator): Response
  147.     {
  148.         $lifetime 99999;
  149.         $ids explode(","$request->get('ids'));
  150.         $data = [];
  151.         foreach ($ids as $id) {
  152.             $cacheKey md5('pr-'.$request->get("locale")."-".$id);
  153.             if(!$dataId \Pimcore\Cache::load($cacheKey)) {
  154.                 $dataId = [];
  155.                 $rivestimentiListing = new Rivestimenti\Listing();
  156.                 $rivestimentiListing->filterByTipoRivestimento(RivestimentiCategory::getById($id));
  157.                 $rivestimentiListing->filterByPath("/Product Data/Rivestimenti/""!=");
  158.                 $rivestimentiListing->setOrderKey('colore');
  159.                 $rivestimentiListing->setOrder('ASC');
  160.                 foreach ($rivestimentiListing as $listing) {
  161.                     $miniatura $listing->getMiniatura();
  162.                     if ($miniatura) {
  163.                         $miniatura $miniatura->getThumbnail('rivestimenti_thumbnail')->getFrontendPath();
  164.                     }
  165.                     $tipologia_rivestimento = [];
  166.                     $tipologia_rivestimento_string '';
  167.                     foreach($listing->getTipologiaRivestimento() as $type){
  168.                         $tipologia_rivestimento[] = $type->getName();
  169.                         $tipologia_rivestimento_string .= $this->normalizeItemId($listing->getTipoRivestimento()->getName().".tipologia".$type->getName()."|");
  170.                     }
  171.                     $dataId[] = [
  172.                         'id' => $listing->getId(),
  173.                         'codice' => $listing->getCodice(),
  174.                         'categoria' => $listing->getCategoria(),
  175.                         'tipologia' => $listing->getTipoRivestimento()->getName(),
  176.                         'tipologia_rivestimento' => $tipologia_rivestimento,
  177.                         'tipologia_rivestimento_string' => substr($tipologia_rivestimento_string0, -1),
  178.                         'colore' => $listing->getColore(),
  179.                         'miniatura' => $miniatura,
  180.                     ];
  181.                 }
  182.                 \Pimcore\Cache::setForceImmediateWrite(true);
  183.                 \Pimcore\Cache::save(
  184.                     $dataId,
  185.                     $cacheKey,
  186.                     [],
  187.                     $lifetime);
  188.             }
  189.             $data array_merge($data$dataId);
  190.         }
  191.         if($request->get('filters')){
  192.             $output = [];
  193.             $ecopelle_tipologia = [];
  194.             $ecopelle_categoria = [];
  195.             $ecopelle_colore = [];
  196.             $stoffa_tipologia = [];
  197.             $stoffa_categoria = [];
  198.             $stoffa_colore = [];
  199.             $pelle_tipologia = [];
  200.             $pelle_colore = [];
  201.             foreach($data as $rivestimento){
  202.                 if($rivestimento['tipologia'] == 'ECOPELLE' || $rivestimento['tipologia'] == 'SYNTHETIC LEATHER'){
  203.                     foreach($rivestimento['tipologia_rivestimento'] as $id => $type){
  204.                         $ecopelle_tipologia[] = $type;
  205.                     }
  206.                     if($rivestimento['colore']!='')
  207.                         $ecopelle_colore[] = $rivestimento['colore'];
  208.                     $ecopelle_categoria[] = $rivestimento['categoria'];
  209.                 }
  210.                 if($rivestimento['tipologia'] == 'STOFFA' || $rivestimento['tipologia'] == 'FABRIC'){
  211.                     foreach($rivestimento['tipologia_rivestimento'] as $id => $type){
  212.                         $stoffa_tipologia[] = $type;
  213.                     }
  214.                     if($rivestimento['colore']!='')
  215.                         $stoffa_colore[] = $rivestimento['colore'];
  216.                     $stoffa_categoria[] = $rivestimento['categoria'];
  217.                 }
  218.                 if($rivestimento['tipologia'] == 'PELLE' || $rivestimento['tipologia'] == 'REAL LEATHER'){
  219.                     foreach($rivestimento['tipologia_rivestimento'] as $id => $type){
  220.                         $pelle_tipologia[] = $type;
  221.                     }
  222.                     if($rivestimento['colore']!='')
  223.                         $pelle_colore[] = $rivestimento['colore'];
  224.                 }
  225.             }
  226.             $ecopelle_tipologia $this->fixFilterArray($ecopelle_tipologia);
  227.             $ecopelle_categoria $this->fixFilterArray($ecopelle_categoria);
  228.             $ecopelle_colore $this->fixFilterArray($ecopelle_colore);
  229.             $stoffa_tipologia $this->fixFilterArray($stoffa_tipologia);
  230.             $stoffa_categoria $this->fixFilterArray($stoffa_categoria);
  231.             $stoffa_colore $this->fixFilterArray($stoffa_colore);
  232.             $pelle_tipologia $this->fixFilterArray($pelle_tipologia);
  233.             $pelle_colore $this->fixFilterArray($pelle_colore);
  234.             if(count($ecopelle_tipologia)>0) {
  235.                 $output[$translator->trans('ECOPELLE')] = [
  236.                         'tipologia' => $ecopelle_tipologia,
  237.                         'categoria' => $ecopelle_categoria,
  238.                         'colore' => $ecopelle_colore,
  239.                 ];
  240.             }
  241.             if(count($stoffa_tipologia)>0) {
  242.                 $output[$translator->trans('STOFFA')] = [
  243.                         'tipologia' => $stoffa_tipologia,
  244.                         'categoria' => $stoffa_categoria,
  245.                         'colore' => $stoffa_colore,
  246.                 ];
  247.             }
  248.             if(count($pelle_tipologia)>0) {
  249.                 $output[$translator->trans('PELLE')] = [
  250.                         'tipologia' => $pelle_tipologia,
  251.                         'colore' => $pelle_colore,
  252.                 ];
  253.             }
  254.             $html '';
  255.             //echo '<pre>'; print_r($output);
  256.             foreach($output as $type => $data) {
  257.                 $html .= "<button class=\"h4 mb-0 accordion-button rounded-0 bg-transparent shadow-none px-0 collapsed\" data-bs-toggle=\"collapse\" data-bs-target=\"#accordion-".$this->fixId($type)."\" aria-expanded=\"false\" aria-controls=\"accordion-".$type."\">".$translator->trans($type)."</button>
  258.             <div id=\"accordion-".$this->fixId($type)."\" class=\"pb-20 mb-10 accordion-collapse collapse\" data-bs-parent=\"#parentRivestimenti \">";
  259.                 foreach($data as $accordion => $items) {
  260.                     $html .= "<div class=\"accordion-item rounded-0 border-0\">
  261.                         <div class=\"h4 accordion-header mb-0\">
  262.                             <button class=\"accordion-button rounded-0 bg-transparent shadow-none px-0 collapsed\" type=\"button\" data-bs-toggle=\"collapse\" data-bs-target=\"#accordion-".$this->fixId($type.$accordion)."\" aria-expanded=\"false\" aria-controls=\"accordion-".$type.$accordion."\">".$translator->trans($accordion)."</button>
  263.                         </div>
  264.                         <div id=\"accordion-".$this->fixId($type.$accordion)."\" class=\"accordion-collapse collapse \" data-bs-parent=\"#accordion-".$type."\" >
  265.                             <div class=\"accordion-body px-0\">";
  266.                                 foreach($items as $item) {
  267.                                     $colore '';
  268.                                     $class_colore '';
  269.                                     if($accordion == 'colore'){
  270.                                         $colore "<span class=\"color-bull d-block rounded-circle border border-gray ".$this->colorTable($item)."\"></span> ";
  271.                                         $class_colore " d-flex gap-5 fs-16";
  272.                                     }
  273.                                     $html .= "<div class=\"form-check\">
  274.                                                     <input class=\"form-check-input shadow-none\" type=\"checkbox\" value=\"".$this->normalizeItemId($type.".".$accordion.$item)."\" id=\"".$this->normalizeItemId($type.".".$accordion.$item)."\">
  275.                                                     <label class=\"form-check-label".$class_colore."\" for=\"".$this->normalizeItemId($type.".".$accordion.$item)."\">".$colore.$translator->trans($item)."</label>
  276.                                                 </div>";
  277.                                 }
  278.                             $html .= "</div>
  279.                         </div>
  280.                     </div>";
  281.                 }
  282.             $html .= "</div>";
  283.             }
  284.             return new Response($html);
  285.         }
  286.         return new JsonResponse($data);
  287.     }
  288.     public function normalizeItemId($item){
  289.         $item strtolower($item);
  290.         $item str_replace(" """$item);
  291.         return $item;
  292.     }
  293.     public function fixId($text){
  294.         $text str_replace(" ""-"$text);
  295.         return $text;
  296.     }
  297.     public function colorTable($color){
  298.         switch ($color) {
  299.             case "ARANCIONE":
  300.                 return 'bg-orange';
  301.                 break;
  302.             case "AZZURRO":
  303.                 return 'bg-light-blue';
  304.                 break;
  305.             case "BEIGE":
  306.                 return 'bg-beige';
  307.                 break;
  308.             case "BIANCO":
  309.                 return 'bg-white';
  310.                 break;
  311.             case "BLU":
  312.                 return 'bg-blue';
  313.                 break;
  314.             case "FANGO":
  315.                 return 'bg-clay-brown';
  316.                 break;
  317.             case "GIALLO":
  318.                 return 'bg-yellow';
  319.                 break;
  320.             case "GRIGIO":
  321.                 return 'bg-gray';
  322.                 break;
  323.             case "MARRONE":
  324.                 return 'bg-brown';
  325.                 break;
  326.             case "NERO":
  327.                 return 'bg-black';
  328.                 break;
  329.             case "ROSA":
  330.                 return 'bg-pink';
  331.                 break;
  332.             case "ROSSO":
  333.                 return 'bg-red';
  334.                 break;
  335.             case "TORTORA":
  336.                 return 'bg-toupe';
  337.                 break;
  338.             case "VERDE":
  339.                 return 'bg-green';
  340.                 break;
  341.             case "VIOLA":
  342.                 return 'bg-violet';
  343.                 break;
  344.             case "VERDE VIOLA":
  345.                 return 'bg-purple-green';
  346.                 break;
  347.             default:
  348.                 return 'bg-white';
  349.         }
  350.     }
  351.     public function fixFilterArray($filter){
  352.         $filter array_unique($filter);
  353.         asort($filter);
  354.         return $filter;
  355.     }
  356.     /**
  357.      * @Route("/{locale}/get-product-finishes", name="get-product-finishes", requirements={"locale"="it|en"})
  358.      *
  359.      * @return Response
  360.      */
  361.     public function getProductsFinishesAction(Request $requestTranslatorInterface $translator): Response
  362.     {
  363.         $lifetime 99999;
  364.         $cacheKey md5('pf-'.$request->get("locale")."-".$request->get('ids'));
  365.         if(!$data \Pimcore\Cache::load($cacheKey)) {
  366.             $ids explode(","$request->get('ids'));
  367.             $data = [];
  368.             foreach ($ids as $id) {
  369.                 $finitureListing = new Finiture\Listing();
  370.                 $finitureListing->filterByTipologiaFinitura(FinitureTipologie::getById($id));
  371.                 $finitureListing->setOrderKey('titolo');
  372.                 $finitureListing->setOrder('ASC');
  373.                 foreach ($finitureListing as $listing) {
  374.                     $frassino = [];
  375.                     $frassino_string '';
  376.                     $faggio = [];
  377.                     $faggio_string '';
  378.                     $metallo = [];
  379.                     $metallo_string '';
  380.                     $miniatura $listing->getMiniatura();
  381.                     if ($miniatura) {
  382.                         $miniatura $miniatura->getThumbnail('rivestimenti_thumbnail')->getFrontendPath();
  383.                     }
  384.                     if(is_array($listing->getFinitureLegnoFrassino())) {
  385.                         foreach ($listing->getFinitureLegnoFrassino() as $filtro) {
  386.                             $frassino[] = $filtro;
  387.                             $frassino_string $this->normalizeItemId("finiturefrassino.".$filtro."|");
  388.                         }
  389.                     }
  390.                     if(is_array($listing->getFinitureLegnoFaggio())) {
  391.                         foreach ($listing->getFinitureLegnoFaggio() as $filtro) {
  392.                             $faggio[] = $filtro;
  393.                             $faggio_string $this->normalizeItemId("finiturefaggio.".$filtro."|");
  394.                         }
  395.                     }
  396.                     if(is_array($listing->getFinitureMetallo())) {
  397.                         foreach ($listing->getFinitureMetallo() as $filtro) {
  398.                             $metallo[] = $filtro;
  399.                             $metallo_string $this->normalizeItemId("finituremetallo.".$filtro."|");
  400.                         }
  401.                     }
  402.                     $data[] = [
  403.                         'id' => $listing->getId(),
  404.                         'codice' => $listing->getCodice(),
  405.                         'titolo' => $translator->trans($listing->getTitolo()),
  406.                         'miniatura' => $miniatura,
  407.                         'frassino' => $frassino,
  408.                         'faggio' => $faggio,
  409.                         'metallo' => $metallo,
  410.                         'frassino_string' => substr($frassino_string0, -1),
  411.                         'faggio_string' => substr($faggio_string0, -1),
  412.                         'metallo_string' => substr($metallo_string0, -1),
  413.                     ];
  414.                 }
  415.             }
  416.             \Pimcore\Cache::setForceImmediateWrite(true);
  417.             \Pimcore\Cache::save(
  418.                 $data,
  419.                 $cacheKey,
  420.                 [],
  421.                 $lifetime);
  422.         }
  423.         if($request->get('filters')){
  424.             $output = [];
  425.             $frassino = [];
  426.             $faggio = [];
  427.             $metallo = [];
  428.             foreach($data as $finitura){
  429.                 if($finitura['faggio']) $faggio array_merge($faggio$finitura['faggio']);
  430.                 if($finitura['frassino']) $frassino array_merge($frassino$finitura['frassino']);
  431.                 if($finitura['metallo']) $metallo array_merge($metallo$finitura['metallo']);
  432.             }
  433.             $frassino $this->fixFilterArray($frassino);
  434.             $faggio $this->fixFilterArray($faggio);
  435.             $metallo $this->fixFilterArray($metallo);
  436.             if(count($frassino)>0) {
  437.                 $output['FINITURE']['FRASSINO'] = $frassino;
  438.             }
  439.             if(count($faggio)>0) {
  440.                 $output['FINITURE']['FAGGIO'] = $faggio;
  441.             }
  442.             if(count($metallo)>0) {
  443.                 $output['FINITURE']['METALLO'] = $metallo;
  444.             }
  445.             $html '';
  446.             /*foreach($output as $type => $data) {
  447.                 $html .= "<button class=\"h4 mb-0 accordion-button rounded-0 bg-transparent shadow-none px-0 collapsed\" data-bs-toggle=\"collapse\" data-bs-target=\"#accordion-".$type."\" aria-expanded=\"false\" aria-controls=\"accordion-".$type."\">".$type."</button>
  448.             <div id=\"accordion-".$type."\" class=\"pb-20 mb-10 accordion-collapse collapse\" data-bs-parent=\"#parentFiniture \">";
  449.                 foreach($data as $accordion => $items) {
  450.                     $html .= "<div class=\"accordion-item rounded-0 border-0 border-top border-bottom border-black mb-20\">
  451.                         <div class=\"h4 accordion-header mb-0\">
  452.                             <button class=\"accordion-button rounded-0 bg-transparent shadow-none px-0 collapsed\" type=\"button\" data-bs-toggle=\"collapse\" data-bs-target=\"#accordion-".$type.$accordion."\" aria-expanded=\"false\" aria-controls=\"accordion-".$type.$accordion."\">".$accordion."</button>
  453.                         </div>
  454.                         <div id=\"accordion-".$type.$accordion."\" class=\"accordion-collapse collapse \" data-bs-parent=\"#accordion-".$type."\">
  455.                             <div class=\"accordion-body px-0\">";
  456.                     foreach($items as $item) {
  457.                         $html .= "<div class=\"form-check\">
  458.                                                     <input class=\"form-check-input shadow-none\" type=\"checkbox\" value=\"".$this->normalizeItemId($type.$accordion.$item)."\" id=\"".$this->normalizeItemId($type.$accordion.$item)."\">
  459.                                                     <label class=\"form-check-label\" for=\"".$this->normalizeItemId($type.$accordion.$item)."\">".$item."</label>
  460.                                                 </div>";
  461.                     }
  462.                     $html .= "</div>
  463.                         </div>
  464.                     </div>";
  465.                 }
  466.                 $html .= "</div>";
  467.             }*/
  468.             foreach($output as $type => $data) {
  469.                 foreach($data as $accordion => $items) {
  470.                     $html .= "<button class=\"h4 mb-0 accordion-button rounded-0 bg-transparent shadow-none px-0 collapsed\" data-bs-toggle=\"collapse\" data-bs-target=\"#accordion-".$type.$accordion."\" aria-expanded=\"false\" aria-controls=\"accordion-".$type.$accordion."\">".$translator->trans($accordion)."</button>
  471.                                 <div id=\"accordion-".$type.$accordion."\" class=\"pb-20 mb-10 accordion-collapse collapse\" data-bs-parent=\"#accordion-".$type."\">";
  472.                     foreach($items as $item) {
  473.                         $html .= "<div class=\"form-check\">
  474.                                                     <input class=\"form-check-input shadow-none\" type=\"checkbox\" value=\"".$this->normalizeItemId($type.$accordion.".".$item)."\" id=\"".$this->normalizeItemId($type.$accordion.".".$item)."\">
  475.                                                     <label class=\"form-check-label\" for=\"".$this->normalizeItemId($type.$accordion.".".$item)."\">".$translator->trans($item)."</label>
  476.                                                 </div>";
  477.                     }
  478.                     $html .= "</div>";
  479.                 }
  480.             }
  481.             return new Response($html);
  482.         }
  483.         return new JsonResponse($data);
  484.     }
  485.     /**
  486.      * @Route("/{locale}/get-coating", name="get-product-coating", requirements={"locale"="it|en"})
  487.      *
  488.      * @return Response
  489.      */
  490.     public function getProductsCoatingAction(Request $requestTranslatorInterface $translator): Response
  491.     {
  492.         $id $request->get('id');
  493.         $rivestimento Rivestimenti::getById($id);
  494.         $data = [];
  495.         if($rivestimento instanceof \Pimcore\Model\DataObject\Rivestimenti){
  496.             $immagine $rivestimento->getImmagine();
  497.             if($immagine){
  498.                 $immagine $immagine->getFrontendPath();
  499.             }
  500.             $miniatura $rivestimento->getMiniatura();
  501.             if($miniatura){
  502.                 $miniatura $miniatura->getThumbnail('rivestimenti_thumbnail')->getFrontendPath();
  503.             }
  504.             $zoom $rivestimento->getZoom();
  505.             if($zoom){
  506.                 $zoom $zoom->getFrontendPath();
  507.             }
  508.         }
  509.         $output "
  510.                 <div class=\"d-flex flex-column flex-lg-row\">
  511.                     <div class=\"col-12 col-lg-6\">
  512.                         <figure class=\"zoomImage\" onmousemove=\"zoom(event)\" style=\"background-image: url($zoom)\">
  513.                             <img src=\"$zoom\" alt=\"\" class=\"w-100\" />
  514.                         </figure>
  515.                     </div>
  516.                     <div class=\"col-12 col-lg-6 pt-30 pt-lg-0 ps-lg-30\">
  517.                         <div class=\"d-flex justify-content-between position-lg-relative\">
  518.                             <h4 class=\"modal-title fs-5\" id=\"popupCoatingLabel\">".$rivestimento->getTitolo()."</h4>
  519.                             <button type=\"button\" class=\"btn-close\" data-bs-dismiss=\"modal\" aria-label=\"Close\"></button>
  520.                         </div>
  521.                         <div class=\"table fs-16\">
  522.                             <div class=\"d-flex\">
  523.                                 <div class=\"col-6 border-bottom border-gray px-0 py-5\">".$translator->trans('TIPOLOGIA')."</div>
  524.                                 <div class=\"col-6 border-bottom border-gray px-0 py-5\">".$translator->trans($rivestimento->getTipologia())."</div>
  525.                             </div>
  526.                             <div class=\"d-flex\">
  527.                                 <div class=\"col-6 border-bottom border-gray px-0 py-5\">".$translator->trans('CATEGORIA')."</div>
  528.                                 <div class=\"col-6 border-bottom border-gray px-0 py-5\">".$rivestimento->getCategoria()."</div>
  529.                             </div>
  530.                             <div class=\"d-flex\">
  531.                                 <div class=\"col-6 border-bottom border-gray px-0 py-5\">".$translator->trans('COMPOSIZIONE')."</div>
  532.                                 <div class=\"col-6 border-bottom border-gray px-0 py-5\">".$translator->trans($rivestimento->getComposizione())."</div>
  533.                             </div>
  534.                             <div class=\"d-flex\">
  535.                                 <div class=\"col-6 border-bottom border-gray px-0 py-5\">".$translator->trans("RESISTENZA ALL'ABRAZIONE")."</div>
  536.                                 <div class=\"col-6 border-bottom border-gray px-0 py-5\">".$translator->trans($rivestimento->getResistenzaAbrasione())."</div>
  537.                             </div>
  538.                             <div class=\"d-flex\">
  539.                                 <div class=\"col-6 border-bottom border-gray px-0 py-5\">".$translator->trans('ALTEZZA')."</div>
  540.                                 <div class=\"col-6 border-bottom border-gray px-0 py-5\">".$rivestimento->getAltezza()."</div>
  541.                             </div>
  542.                             <div class=\"d-flex\">
  543.                                 <div class=\"col-6 border-bottom border-gray px-0 py-5\">".$translator->trans('TRATTAMENTO')."</div>
  544.                                 <div class=\"col-6 border-bottom border-gray px-0 py-5\">".$translator->trans($rivestimento->getTrattamento())."</div>
  545.                             </div>
  546.                             <div class=\"d-flex\">
  547.                                 <div class=\"col-6 border-bottom border-gray px-0 py-5\">".$translator->trans('CALO AL LAVAGGIO IN ACQUA')."</div>
  548.                                 <div class=\"col-6 border-bottom border-gray px-0 py-5\">".$rivestimento->getCaloLavaggio()."</div>
  549.                             </div>
  550.                             <div class=\"d-flex\">
  551.                                 <div class=\"col-6 border-bottom border-gray px-0 py-5\">".$translator->trans('INFIAMMABILITÀ')."</div>
  552.                                 <div class=\"col-6 border-bottom border-gray px-0 py-5\">".$rivestimento->getInfiammabilita()."</div>
  553.                             </div>
  554.                             <div class=\"d-flex\">
  555.                                 <div class=\"col-6 border-bottom border-gray px-0 py-5\">".$translator->trans('NORME DI MANUTENZIONE')."</div>
  556.                                 <div class=\"col-6 border-bottom border-gray px-0 py-5 d-flex flex-wrap\">";
  557.         if(!$rivestimento->getCandeggiabile()) $output .= "<img src=\"/assets/images/icons/ico-non-candeggiabile.jpg\" alt=\"\" />";
  558.         if($rivestimento->getNoLavaggioInAcqua()) $output .= "<img src=\"/assets/images/icons/ico-no-lavaggio-acqua.jpg\" alt=\"\" />";
  559.         if($rivestimento->getNoAsciugaturaATamburo()) $output .= "<img src=\"/assets/images/icons/ico-no-asciugatura.jpg\" alt=\"\" />";
  560.         if($rivestimento->getNonPulireASecco()) $output .= "<img src=\"/assets/images/icons/ico-no-pulitura-secco.jpg\" alt=\"\" />";
  561.         if(!$rivestimento->getStiraturaAFerroConsentita()) $output .= "<img src=\"/assets/images/icons/ico-no-stiratura.jpg\" alt=\"\" />";
  562.                  $output .=    "</div>
  563.                             </div>
  564.                             <div class=\"d-flex\">
  565.                                 <div class=\"col-6 border-bottom border-gray px-0 py-5\">".$translator->trans('ATTENZIONE')."</div>
  566.                                 <div class=\"col-6 border-bottom border-gray px-0 py-5\">".$translator->trans("le tonalità colore sono indicative e possono differire dall'originale.")."</div>
  567.                             </div>
  568.                             <div class=\"d-flex\">
  569.                                 <div class=\"col-6 border-bottom border-gray px-0 py-5\">".$translator->trans('DECORO')."</div>
  570.                                 <div class=\"col-6 border-bottom border-gray px-0 py-5\">".$translator->trans('proporzione decoro su 50 cm di tessuto')."</div>
  571.                             </div>
  572.                         </div>
  573.                     </div>
  574.                 </div>";
  575.         return new Response($output);
  576.     }
  577.     /**
  578.      * @Route("/{locale}/get-finishing", name="get-product-finishing", requirements={"locale"="it|en"})
  579.      *
  580.      * @return Response
  581.      */
  582.     public function getProductsFinishingAction(Request $requestTranslatorInterface $translator): Response
  583.     {
  584.         $id $request->get('id');
  585.         $finitura Finiture::getById($id);
  586.         $data = [];
  587.         if($finitura instanceof \Pimcore\Model\DataObject\Finiture){
  588.             $immagine $finitura->getImmagine();
  589.             if($immagine){
  590.                 $immagine $immagine->getFrontendPath();
  591.             }
  592.             $miniatura $finitura->getMiniatura();
  593.             if($miniatura){
  594.                 $miniatura $miniatura->getThumbnail('rivestimenti_thumbnail')->getFrontendPath();
  595.             }
  596.             $zoom $finitura->getZoom();
  597.             if($zoom){
  598.                 $zoom $zoom->getFrontendPath();
  599.             }
  600.         }
  601.         $output "
  602.                 <div class=\"d-flex flex-column flex-lg-row\">
  603.                     <div class=\"col-12 col-lg-6\">
  604.                         <figure class=\"zoomImage\" onmousemove=\"zoom(event)\" style=\"background-image: url($zoom)\">
  605.                             <img src=\"$zoom\" alt=\"\" class=\"w-100\" />
  606.                         </figure>
  607.                     </div>
  608.                     <div class=\"col-12 col-lg-6 pt-30 pt-lg-0 ps-lg-30\">
  609.                         <div class=\"d-flex justify-content-between position-lg-relative\">
  610.                             <h4 class=\"modal-title fs-5\" id=\"popupCoatingLabel\">".$translator->trans($finitura->getTitolo())."</h4>
  611.                             <button type=\"button\" class=\"btn-close\" data-bs-dismiss=\"modal\" aria-label=\"Close\"></button>
  612.                         </div>
  613.                         <div class=\"table fs-16\">
  614.                             <div class=\"d-flex\">
  615.                                 <div class=\"col-6 border-bottom border-gray px-0 py-5\">".$translator->trans('TIPOLOGIA')."</div>
  616.                                 <div class=\"col-6 border-bottom border-gray px-0 py-5\">".$translator->trans($finitura->getTipoFinitura())."</div>
  617.                             </div>
  618.                             <div class=\"d-flex\">
  619.                                 <div class=\"col-6 border-bottom border-gray px-0 py-5\">".$translator->trans('DESCRIZIONE')."</div>
  620.                                 <div class=\"col-6 border-bottom border-gray px-0 py-5\">".$translator->trans($finitura->getDescrizione())."</div>
  621.                             </div>
  622.                         </div>
  623.                     </div>
  624.                 </div>";
  625.         return new Response($output);
  626.     }
  627.     public function listAction(Request $request): Response
  628.     {
  629.         return $this->render('product/product-list.html.twig');
  630.     }
  631.     public function getProductFilters($products): array
  632.     {
  633.         $attributes = [
  634.             'tipologia',
  635.             'stile',
  636.             'materialeStruttura',
  637.             'specifiche',
  638.             'utilizzo'
  639.         ];
  640.         $filters = [];
  641.         $products_id= [];
  642.         foreach($products as $product){
  643.             $products_id[] = $product->getId();
  644.         }
  645.         return $filters;
  646.     }
  647.     public function listCategoryAction(Request $request): Response
  648.     {
  649.         if ($request->get('type') === 'object') {
  650.             $root_category_id $request->get('id');
  651.             $root_category Category::getById($root_category_id);
  652.             if ($root_category instanceof \Pimcore\Model\DataObject\Category) {
  653.                 $products = new Product\Listing();
  654.                 $products->setCondition('categoria LIKE ?', ["%,".$root_category_id."%,"]);
  655.                 $products->setOrderKey('nome');
  656.                 $products->setOrder('ASC');
  657.                 $filters $this->getProductFilters($products);
  658.                 print_r($filters);
  659.                 return $this->render('product/list-category.html.twig', [
  660.                     'category' => $root_category,
  661.                     'products' => $products,
  662.                     'filters' => $filters
  663.                 ]);
  664.             }
  665.         }
  666.         throw new NotFoundHttpException('Error.');
  667.     }
  668.     /**
  669.      * @Route("/{locale}/search", name="search", methods={"GET"})
  670.      */
  671.     public function searchAction(Request $requestListHelper $listHelperFactory $ecommerceFactoryPaginatorInterface $paginator): Response
  672.     {
  673.         $params $request->query->all();
  674.         $params['category'] = Category::getById((int) ($params['category'] ?? -1));
  675.         $indexService $ecommerceFactory->getIndexService();
  676.         $productListing $indexService->getProductListForCurrentTenant();
  677.         //$productListing->setVariantMode(ProductListInterface::VARIANT_MODE_VARIANTS_ONLY);
  678.         $term strip_tags($request->query->get('term'));
  679.         if ($productListing instanceof AbstractElasticSearch) {
  680.             // simple elastic search query - uses multi-match query on all defined search_attributes
  681. //            $productListing->addQueryCondition($term);
  682.             //sample for a more specific elastic search query - not considers search_attributes but provides full flexibility
  683.             // this query weights cars more that accessories
  684.             $query = [
  685.                 'function_score' => [
  686.                     'query' => [
  687.                         'multi_match' => [
  688.                             'query' => $term,
  689.                             'type' => 'cross_fields',
  690.                             'operator' => 'and',
  691.                             'fields' => [
  692.                                 'attributes.name^4',
  693.                                 'attributes.name.analyzed',
  694.                                 'attributes.name.analyzed_ngram',
  695.                                 'attributes.manufacturer_name^3',
  696.                                 'attributes.manufacturer_name.analyzed',
  697.                                 'attributes.manufacturer_name.analyzed_ngram',
  698.                                 'attributes.color',
  699.                                 'attributes.color.analyzed',
  700.                                 'attributes.color.analyzed_ngram',
  701.                                 'attributes.carClass',
  702.                                 'attributes.carClass.analyzed',
  703.                                 'attributes.carClass.analyzed_ngram'
  704.                             ]
  705.                         ]
  706.                     ],
  707.                     'functions' => [
  708.                         [
  709.                             'filter' => ['match' => ['system.classId' => 'AP']],
  710.                             'weight' => 1
  711.                         ],
  712.                         [
  713.                             'filter' => ['match' => ['system.classId' => 'CAR']],
  714.                             'weight' => 2
  715.                         ]
  716.                     ],
  717.                     'boost_mode' => 'multiply'
  718.                 ]
  719.             ];
  720.             $productListing->addQueryCondition($query'searchTerm');
  721.         } else {
  722.             //default mysql search query condition - would also work for elastic search in that way
  723.             $term trim(preg_replace('/\s+/'' '$term));
  724.             if (!empty($term)) {
  725.                 foreach (explode(' '$term) as $t) {
  726.                     $productListing->addQueryCondition($t);
  727.                 }
  728.             }
  729.         }
  730.         if (isset($params['autocomplete'])) {
  731.             $resultset = [];
  732.             $productListing->setLimit(10);
  733.             foreach ($productListing as $product) {
  734.                 $result['href'] = $product->getUrl()[0]->getSlug();
  735.                 $result['image'] = '';
  736.                 if($product->getFotoPricipale()) {
  737.                     $result['image'] = $product->getFotoPricipale()->getThumbnail("product_thumbnail_gallery")->getPath();
  738.                 }
  739.                 $result['title'] = $product->getNome() ?? '';
  740.                 if ($product instanceof Prodotto) {
  741.                     $result['title'] .= ' ' $product->getNome();
  742.                 }
  743.                 $resultset[] = $result;
  744.             }
  745.             return $this->json($resultset);
  746.         }
  747.         $filterDefinition $params['filterDefinition'] = Config::getWebsiteConfig()['fallbackFilterdefinition'];
  748.         // create and init filter service
  749.         $filterService Factory::getInstance()->getFilterService();
  750.         $listHelper->setupProductList($filterDefinition$productListing$params$filterServicetrue);
  751.         $params['filterService'] = $filterService;
  752.         $params['products'] = $productListing;
  753.         // init pagination
  754.         $paginator $paginator->paginate(
  755.             $productListing,
  756.             $request->query->getInt('page'1),
  757.             $filterDefinition->getPageLimit()
  758.         );
  759.         $params['results'] = $paginator;
  760.         $params['paginationVariables'] = $paginator->getPaginationData();
  761.         $trackingManager $ecommerceFactory->getTrackingManager();
  762.         foreach ($paginator as $product) {
  763.             $trackingManager->trackProductImpression($product'search-results');
  764.         }
  765.         $params['language'] = $request->getLocale();
  766.         $params['term'] = $term;
  767.         return $this->render('product/search.html.twig'$params);
  768.     }
  769.     /**
  770.      * @Route("/{locale}/{path}", name="search_results", requirements={"locale"="it|en", "path"="(prodotti|products)"}, methods={"GET"})
  771.      */
  772.     public function searchProductsAction(Request $requestListHelper $listHelperFactory $ecommerceFactoryPaginatorInterface $paginatorTranslatorInterface $translator): Response
  773.     {
  774.         $params $request->query->all();
  775.         $params['category'] = Category::getById((int) ($params['category'] ?? -1));
  776.         $indexService $ecommerceFactory->getIndexService();
  777.         $productListing $indexService->getProductListForCurrentTenant();
  778.         //$productListing->setVariantMode(ProductListInterface::VARIANT_MODE_VARIANTS_ONLY);
  779.         $term strip_tags($request->query->get('term'));
  780.         if ($productListing instanceof AbstractElasticSearch) {
  781.             // simple elastic search query - uses multi-match query on all defined search_attributes
  782. //            $productListing->addQueryCondition($term);
  783.             //sample for a more specific elastic search query - not considers search_attributes but provides full flexibility
  784.             // this query weights cars more that accessories
  785.             $query = [
  786.                 'function_score' => [
  787.                     'query' => [
  788.                         'multi_match' => [
  789.                             'query' => $term,
  790.                             'type' => 'cross_fields',
  791.                             'operator' => 'and',
  792.                             'fields' => [
  793.                                 'attributes.name^4',
  794.                                 'attributes.name.analyzed',
  795.                                 'attributes.name.analyzed_ngram',
  796.                                 'attributes.manufacturer_name^3',
  797.                                 'attributes.manufacturer_name.analyzed',
  798.                                 'attributes.manufacturer_name.analyzed_ngram',
  799.                                 'attributes.color',
  800.                                 'attributes.color.analyzed',
  801.                                 'attributes.color.analyzed_ngram',
  802.                                 'attributes.carClass',
  803.                                 'attributes.carClass.analyzed',
  804.                                 'attributes.carClass.analyzed_ngram'
  805.                             ]
  806.                         ]
  807.                     ],
  808.                     'functions' => [
  809.                         [
  810.                             'filter' => ['match' => ['system.classId' => 'AP']],
  811.                             'weight' => 1
  812.                         ],
  813.                         [
  814.                             'filter' => ['match' => ['system.classId' => 'CAR']],
  815.                             'weight' => 2
  816.                         ]
  817.                     ],
  818.                     'boost_mode' => 'multiply'
  819.                 ]
  820.             ];
  821.             $productListing->addQueryCondition($query'searchTerm');
  822.         } else {
  823.             //default mysql search query condition - would also work for elastic search in that way
  824.             $term trim(preg_replace('/\s+/'' '$term));
  825.             if (!empty($term)) {
  826.                 foreach (explode(' '$term) as $t) {
  827.                     $productListing->addQueryCondition($t);
  828.                 }
  829.             }
  830.         }
  831.         if (isset($params['autocomplete'])) {
  832.             $resultset = [];
  833.             $productListing->setLimit(10);
  834.             foreach ($productListing as $product) {
  835.                 $result['href'] = $product->getUrl()[0]->getSlug();
  836.                 $result['image'] = '';
  837.                 if($product->getFotoPricipale()) {
  838.                     $result['image'] = $product->getFotoPricipale()->getThumbnail("product_thumbnail_gallery")->getPath();
  839.                 }
  840.                 $result['title'] = $product->getNome() ?? '';
  841.                 if ($product instanceof Prodotto) {
  842.                     $result['title'] .= ' ' $product->getNome();
  843.                 }
  844.                 $resultset[] = $result;
  845.             }
  846.             return $this->json($resultset);
  847.         }
  848.         $filterDefinition $params['filterDefinition'] = Config::getWebsiteConfig()['fallbackFilterdefinition'];
  849.         // create and init filter service
  850.         $filterService Factory::getInstance()->getFilterService();
  851.         $listHelper->setupProductList($filterDefinition$productListing$params$filterServicetrue);
  852.         $params['filterService'] = $filterService;
  853.         $params['products'] = $productListing;
  854.         // init pagination
  855.         $paginator $paginator->paginate(
  856.             $productListing,
  857.             $request->query->getInt('page'1),
  858.             $filterDefinition->getPageLimit()
  859.         );
  860.         $params['results'] = $paginator;
  861.         $params['paginationVariables'] = $paginator->getPaginationData();
  862.         $trackingManager $ecommerceFactory->getTrackingManager();
  863.         foreach ($paginator as $product) {
  864.             $trackingManager->trackProductImpression($product'search-results');
  865.         }
  866.         $params['language'] = $request->getLocale();
  867.         $params['term'] = $term;
  868.         $params['pageTitle'] = $translator->trans('Search results for:') . " " $term;
  869.         $params['pageDescription'] = $translator->trans('Search results for:') . " " $term;
  870.         $params['description'] = $translator->trans('Search results for:') . " " $term;
  871.         $params['categorydo']["name"] = null;
  872.         $params['productListing'] = $productListing;
  873.         return $this->render('product/product-list.html.twig'$params);
  874.     }
  875. }