<?php
namespace App\Controller;
use Pimcore\Controller\FrontendController;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\HttpFoundation\JsonResponse;
use Symfony\Component\Routing\Annotation\Route;
use Pimcore\Model\DataObject\Product;
use Pimcore\Model\DataObject\Data\UrlSlug;
use Pimcore\Model\DataObject\Category;
use Pimcore\Model\DataObject\Rivestimenti;
use Pimcore\Model\DataObject\RivestimentiCategory;
use Pimcore\Model\DataObject\Finiture;
use Pimcore\Model\DataObject\FinitureTipologie;
use Pimcore\Db;
use Pimcore\Bundle\EcommerceFrameworkBundle\Factory;
use Pimcore\Bundle\EcommerceFrameworkBundle\FilterService\ListHelper;
use Pimcore\Bundle\EcommerceFrameworkBundle\IndexService\ProductList\DefaultMysql;
use Pimcore\Bundle\EcommerceFrameworkBundle\IndexService\ProductList\ElasticSearch\AbstractElasticSearch;
use Pimcore\Bundle\EcommerceFrameworkBundle\IndexService\ProductList\ProductListInterface;
use Knp\Component\Pager\Pagination\SlidingPagination;
use Knp\Component\Pager\PaginatorInterface;
use Pimcore\Config;
use Symfony\Contracts\Translation\TranslatorInterface;
class ProductController extends FrontendController
{
/**
* @Route("/{locale}/{path}/{category}", name="lista", requirements={"locale"="it|en", "path"="(prodotti|products)", "category"=".*?"})
*
* @return Response
*/
public function listaAction(Request $request, Factory $ecommerceFactory, ListHelper $listHelper, PaginatorInterface $paginator): Response
{
$params = array_merge($request->query->all(), $request->attributes->all());
$category = Category::getbyUrl($params['category'], $params['locale'], true);
if(!$category){
return $this->redirect('/');
}
$indexService = $ecommerceFactory->getIndexService();
$productListing = $indexService->getProductListForCurrentTenant();
$productListing->setCategory($category);
$params['productListing'] = $productListing;
$params['categorydo'] = $category;
$filterDefinition = $category->getFilterdefinition();
if ($request->get('filterdefinition') instanceof FilterDefinition) {
$filterDefinition = $request->get('filterdefinition');
}
if (empty($filterDefinition)) {
$filterDefinition = Config::getWebsiteConfig()['fallbackFilterdefinition'];
}
$filterService = $ecommerceFactory->getFilterService();
$listHelper->setupProductList($filterDefinition, $productListing, $params, $filterService, true);
$params['filterService'] = $filterService;
$params['filterDefinition'] = $filterDefinition;
$paginator = $paginator->paginate(
$productListing,
$request->get('page', 1),
$filterDefinition->getPageLimit()
);
$params['results'] = $paginator;
$params['paginationVariables'] = $paginator->getPaginationData();
$params['pageTitle'] = $category->getPageTitle();
$params['pageDescription'] = $category->getPageDescription();
$params['intro'] = $category->getIntro();
$params['description'] = $category->getDescription();
return $this->render('product/product-list.html.twig', $params);
//print_r($params);
/*$products = new Product\Listing();
return $this->render('product/list.html.twig', [
'products' => $products
]);*/
/*$params = array_merge($request->query->all(), $request->attributes->all());
//needed to make sure category filter filters for active category
$params['parentCategoryIds'] = $params['category'] ?? null;
$category = Category::getById($params['category'] ?? -1);
$params['category'] = $category;
if ($category) {
//$headTitleHelper($category->getName());
//$breadcrumbHelperService->enrichCategoryPage($category);
}
$indexService = $ecommerceFactory->getIndexService();
$productListing = $indexService->getProductListForCurrentTenant();
$productListing->setCategory(Category::getById(781));
foreach($productListing as $prod){
echo $prod->getId()."<br/>";
}
$productListing->setVariantMode(ProductListInterface::VARIANT_MODE_VARIANTS_ONLY);
$params['productListing'] = $productListing;
// load current filter
if ($category) {
$filterDefinition = $category->getFilterdefinition();
//track segments for personalization
//$segmentTrackingHelperService->trackSegmentsForCategory($category);
$trackingManager = $ecommerceFactory->getTrackingManager();
$trackingManager->trackCategoryPageView($category->getName(), null);
}
if ($request->get('filterdefinition') instanceof FilterDefinition) {
$filterDefinition = $request->get('filterdefinition');
}
if (empty($filterDefinition)) {
$filterDefinition = Config::getWebsiteConfig()['fallbackFilterdefinition'];
}
$filterService = $ecommerceFactory->getFilterService();
$listHelper->setupProductList($filterDefinition, $productListing, $params, $filterService, true);
$params['filterService'] = $filterService;
$params['filterDefinition'] = $filterDefinition;
// init pagination
$paginator = $paginator->paginate(
$productListing,
$request->get('page', 1),
$filterDefinition->getPageLimit()
);
$params['results'] = $paginator;
$params['paginationVariables'] = $paginator->getPaginationData();
// track product impressions
$trackingManager = $ecommerceFactory->getTrackingManager();
foreach ($paginator as $product) {
$trackingManager->trackProductImpression($product, 'grid');
}
return $this->render('product/listing.html.twig', $params);*/
}
public function detailAction(Request $request, Product $object, UrlSlug $urlSlug): Response
{
$rivestimenti = $object->getRivestimenti();
$rivestimenti_id = [];
foreach($rivestimenti as $rivestimento){
$rivestimenti_id[] = $rivestimento->getId();
}
$finiture = $object->getFiniture();
$finiture_id = [];
foreach($finiture as $finitura){
$finiture_id[] = $finitura->getId();
}
return $this->render('product/detail.html.twig', [
'product' => $object,
'rivestimenti' => implode(",", $rivestimenti_id),
'finiture' => implode(",", $finiture_id),
'metaDescription' => $object->getDescrizione()
]);
}
/**
* @Route("/{locale}/get-product-coatings", name="get-product-coatings", requirements={"locale"="it|en"})
*
* @return Response
*/
public function getProductsCoatingsAction(Request $request, TranslatorInterface $translator): Response
{
$lifetime = 99999;
$ids = explode(",", $request->get('ids'));
$data = [];
foreach ($ids as $id) {
$cacheKey = md5('pr-'.$request->get("locale")."-".$id);
if(!$dataId = \Pimcore\Cache::load($cacheKey)) {
$dataId = [];
$rivestimentiListing = new Rivestimenti\Listing();
$rivestimentiListing->filterByTipoRivestimento(RivestimentiCategory::getById($id));
$rivestimentiListing->filterByPath("/Product Data/Rivestimenti/", "!=");
$rivestimentiListing->setOrderKey('colore');
$rivestimentiListing->setOrder('ASC');
foreach ($rivestimentiListing as $listing) {
$miniatura = $listing->getMiniatura();
if ($miniatura) {
$miniatura = $miniatura->getThumbnail('rivestimenti_thumbnail')->getFrontendPath();
}
$tipologia_rivestimento = [];
$tipologia_rivestimento_string = '';
foreach($listing->getTipologiaRivestimento() as $type){
$tipologia_rivestimento[] = $type->getName();
$tipologia_rivestimento_string .= $this->normalizeItemId($listing->getTipoRivestimento()->getName().".tipologia".$type->getName()."|");
}
$dataId[] = [
'id' => $listing->getId(),
'codice' => $listing->getCodice(),
'categoria' => $listing->getCategoria(),
'tipologia' => $listing->getTipoRivestimento()->getName(),
'tipologia_rivestimento' => $tipologia_rivestimento,
'tipologia_rivestimento_string' => substr($tipologia_rivestimento_string, 0, -1),
'colore' => $listing->getColore(),
'miniatura' => $miniatura,
];
}
\Pimcore\Cache::setForceImmediateWrite(true);
\Pimcore\Cache::save(
$dataId,
$cacheKey,
[],
$lifetime);
}
$data = array_merge($data, $dataId);
}
if($request->get('filters')){
$output = [];
$ecopelle_tipologia = [];
$ecopelle_categoria = [];
$ecopelle_colore = [];
$stoffa_tipologia = [];
$stoffa_categoria = [];
$stoffa_colore = [];
$pelle_tipologia = [];
$pelle_colore = [];
foreach($data as $rivestimento){
if($rivestimento['tipologia'] == 'ECOPELLE' || $rivestimento['tipologia'] == 'SYNTHETIC LEATHER'){
foreach($rivestimento['tipologia_rivestimento'] as $id => $type){
$ecopelle_tipologia[] = $type;
}
if($rivestimento['colore']!='')
$ecopelle_colore[] = $rivestimento['colore'];
$ecopelle_categoria[] = $rivestimento['categoria'];
}
if($rivestimento['tipologia'] == 'STOFFA' || $rivestimento['tipologia'] == 'FABRIC'){
foreach($rivestimento['tipologia_rivestimento'] as $id => $type){
$stoffa_tipologia[] = $type;
}
if($rivestimento['colore']!='')
$stoffa_colore[] = $rivestimento['colore'];
$stoffa_categoria[] = $rivestimento['categoria'];
}
if($rivestimento['tipologia'] == 'PELLE' || $rivestimento['tipologia'] == 'REAL LEATHER'){
foreach($rivestimento['tipologia_rivestimento'] as $id => $type){
$pelle_tipologia[] = $type;
}
if($rivestimento['colore']!='')
$pelle_colore[] = $rivestimento['colore'];
}
}
$ecopelle_tipologia = $this->fixFilterArray($ecopelle_tipologia);
$ecopelle_categoria = $this->fixFilterArray($ecopelle_categoria);
$ecopelle_colore = $this->fixFilterArray($ecopelle_colore);
$stoffa_tipologia = $this->fixFilterArray($stoffa_tipologia);
$stoffa_categoria = $this->fixFilterArray($stoffa_categoria);
$stoffa_colore = $this->fixFilterArray($stoffa_colore);
$pelle_tipologia = $this->fixFilterArray($pelle_tipologia);
$pelle_colore = $this->fixFilterArray($pelle_colore);
if(count($ecopelle_tipologia)>0) {
$output[$translator->trans('ECOPELLE')] = [
'tipologia' => $ecopelle_tipologia,
'categoria' => $ecopelle_categoria,
'colore' => $ecopelle_colore,
];
}
if(count($stoffa_tipologia)>0) {
$output[$translator->trans('STOFFA')] = [
'tipologia' => $stoffa_tipologia,
'categoria' => $stoffa_categoria,
'colore' => $stoffa_colore,
];
}
if(count($pelle_tipologia)>0) {
$output[$translator->trans('PELLE')] = [
'tipologia' => $pelle_tipologia,
'colore' => $pelle_colore,
];
}
$html = '';
//echo '<pre>'; print_r($output);
foreach($output as $type => $data) {
$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>
<div id=\"accordion-".$this->fixId($type)."\" class=\"pb-20 mb-10 accordion-collapse collapse\" data-bs-parent=\"#parentRivestimenti \">";
foreach($data as $accordion => $items) {
$html .= "<div class=\"accordion-item rounded-0 border-0\">
<div class=\"h4 accordion-header mb-0\">
<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>
</div>
<div id=\"accordion-".$this->fixId($type.$accordion)."\" class=\"accordion-collapse collapse \" data-bs-parent=\"#accordion-".$type."\" >
<div class=\"accordion-body px-0\">";
foreach($items as $item) {
$colore = '';
$class_colore = '';
if($accordion == 'colore'){
$colore = "<span class=\"color-bull d-block rounded-circle border border-gray ".$this->colorTable($item)."\"></span> ";
$class_colore = " d-flex gap-5 fs-16";
}
$html .= "<div class=\"form-check\">
<input class=\"form-check-input shadow-none\" type=\"checkbox\" value=\"".$this->normalizeItemId($type.".".$accordion.$item)."\" id=\"".$this->normalizeItemId($type.".".$accordion.$item)."\">
<label class=\"form-check-label".$class_colore."\" for=\"".$this->normalizeItemId($type.".".$accordion.$item)."\">".$colore.$translator->trans($item)."</label>
</div>";
}
$html .= "</div>
</div>
</div>";
}
$html .= "</div>";
}
return new Response($html);
}
return new JsonResponse($data);
}
public function normalizeItemId($item){
$item = strtolower($item);
$item = str_replace(" ", "", $item);
return $item;
}
public function fixId($text){
$text = str_replace(" ", "-", $text);
return $text;
}
public function colorTable($color){
switch ($color) {
case "ARANCIONE":
return 'bg-orange';
break;
case "AZZURRO":
return 'bg-light-blue';
break;
case "BEIGE":
return 'bg-beige';
break;
case "BIANCO":
return 'bg-white';
break;
case "BLU":
return 'bg-blue';
break;
case "FANGO":
return 'bg-clay-brown';
break;
case "GIALLO":
return 'bg-yellow';
break;
case "GRIGIO":
return 'bg-gray';
break;
case "MARRONE":
return 'bg-brown';
break;
case "NERO":
return 'bg-black';
break;
case "ROSA":
return 'bg-pink';
break;
case "ROSSO":
return 'bg-red';
break;
case "TORTORA":
return 'bg-toupe';
break;
case "VERDE":
return 'bg-green';
break;
case "VIOLA":
return 'bg-violet';
break;
case "VERDE VIOLA":
return 'bg-purple-green';
break;
default:
return 'bg-white';
}
}
public function fixFilterArray($filter){
$filter = array_unique($filter);
asort($filter);
return $filter;
}
/**
* @Route("/{locale}/get-product-finishes", name="get-product-finishes", requirements={"locale"="it|en"})
*
* @return Response
*/
public function getProductsFinishesAction(Request $request, TranslatorInterface $translator): Response
{
$lifetime = 99999;
$cacheKey = md5('pf-'.$request->get("locale")."-".$request->get('ids'));
if(!$data = \Pimcore\Cache::load($cacheKey)) {
$ids = explode(",", $request->get('ids'));
$data = [];
foreach ($ids as $id) {
$finitureListing = new Finiture\Listing();
$finitureListing->filterByTipologiaFinitura(FinitureTipologie::getById($id));
$finitureListing->setOrderKey('titolo');
$finitureListing->setOrder('ASC');
foreach ($finitureListing as $listing) {
$frassino = [];
$frassino_string = '';
$faggio = [];
$faggio_string = '';
$metallo = [];
$metallo_string = '';
$miniatura = $listing->getMiniatura();
if ($miniatura) {
$miniatura = $miniatura->getThumbnail('rivestimenti_thumbnail')->getFrontendPath();
}
if(is_array($listing->getFinitureLegnoFrassino())) {
foreach ($listing->getFinitureLegnoFrassino() as $filtro) {
$frassino[] = $filtro;
$frassino_string = $this->normalizeItemId("finiturefrassino.".$filtro."|");
}
}
if(is_array($listing->getFinitureLegnoFaggio())) {
foreach ($listing->getFinitureLegnoFaggio() as $filtro) {
$faggio[] = $filtro;
$faggio_string = $this->normalizeItemId("finiturefaggio.".$filtro."|");
}
}
if(is_array($listing->getFinitureMetallo())) {
foreach ($listing->getFinitureMetallo() as $filtro) {
$metallo[] = $filtro;
$metallo_string = $this->normalizeItemId("finituremetallo.".$filtro."|");
}
}
$data[] = [
'id' => $listing->getId(),
'codice' => $listing->getCodice(),
'titolo' => $translator->trans($listing->getTitolo()),
'miniatura' => $miniatura,
'frassino' => $frassino,
'faggio' => $faggio,
'metallo' => $metallo,
'frassino_string' => substr($frassino_string, 0, -1),
'faggio_string' => substr($faggio_string, 0, -1),
'metallo_string' => substr($metallo_string, 0, -1),
];
}
}
\Pimcore\Cache::setForceImmediateWrite(true);
\Pimcore\Cache::save(
$data,
$cacheKey,
[],
$lifetime);
}
if($request->get('filters')){
$output = [];
$frassino = [];
$faggio = [];
$metallo = [];
foreach($data as $finitura){
if($finitura['faggio']) $faggio = array_merge($faggio, $finitura['faggio']);
if($finitura['frassino']) $frassino = array_merge($frassino, $finitura['frassino']);
if($finitura['metallo']) $metallo = array_merge($metallo, $finitura['metallo']);
}
$frassino = $this->fixFilterArray($frassino);
$faggio = $this->fixFilterArray($faggio);
$metallo = $this->fixFilterArray($metallo);
if(count($frassino)>0) {
$output['FINITURE']['FRASSINO'] = $frassino;
}
if(count($faggio)>0) {
$output['FINITURE']['FAGGIO'] = $faggio;
}
if(count($metallo)>0) {
$output['FINITURE']['METALLO'] = $metallo;
}
$html = '';
/*foreach($output as $type => $data) {
$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>
<div id=\"accordion-".$type."\" class=\"pb-20 mb-10 accordion-collapse collapse\" data-bs-parent=\"#parentFiniture \">";
foreach($data as $accordion => $items) {
$html .= "<div class=\"accordion-item rounded-0 border-0 border-top border-bottom border-black mb-20\">
<div class=\"h4 accordion-header mb-0\">
<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>
</div>
<div id=\"accordion-".$type.$accordion."\" class=\"accordion-collapse collapse \" data-bs-parent=\"#accordion-".$type."\">
<div class=\"accordion-body px-0\">";
foreach($items as $item) {
$html .= "<div class=\"form-check\">
<input class=\"form-check-input shadow-none\" type=\"checkbox\" value=\"".$this->normalizeItemId($type.$accordion.$item)."\" id=\"".$this->normalizeItemId($type.$accordion.$item)."\">
<label class=\"form-check-label\" for=\"".$this->normalizeItemId($type.$accordion.$item)."\">".$item."</label>
</div>";
}
$html .= "</div>
</div>
</div>";
}
$html .= "</div>";
}*/
foreach($output as $type => $data) {
foreach($data as $accordion => $items) {
$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>
<div id=\"accordion-".$type.$accordion."\" class=\"pb-20 mb-10 accordion-collapse collapse\" data-bs-parent=\"#accordion-".$type."\">";
foreach($items as $item) {
$html .= "<div class=\"form-check\">
<input class=\"form-check-input shadow-none\" type=\"checkbox\" value=\"".$this->normalizeItemId($type.$accordion.".".$item)."\" id=\"".$this->normalizeItemId($type.$accordion.".".$item)."\">
<label class=\"form-check-label\" for=\"".$this->normalizeItemId($type.$accordion.".".$item)."\">".$translator->trans($item)."</label>
</div>";
}
$html .= "</div>";
}
}
return new Response($html);
}
return new JsonResponse($data);
}
/**
* @Route("/{locale}/get-coating", name="get-product-coating", requirements={"locale"="it|en"})
*
* @return Response
*/
public function getProductsCoatingAction(Request $request, TranslatorInterface $translator): Response
{
$id = $request->get('id');
$rivestimento = Rivestimenti::getById($id);
$data = [];
if($rivestimento instanceof \Pimcore\Model\DataObject\Rivestimenti){
$immagine = $rivestimento->getImmagine();
if($immagine){
$immagine = $immagine->getFrontendPath();
}
$miniatura = $rivestimento->getMiniatura();
if($miniatura){
$miniatura = $miniatura->getThumbnail('rivestimenti_thumbnail')->getFrontendPath();
}
$zoom = $rivestimento->getZoom();
if($zoom){
$zoom = $zoom->getFrontendPath();
}
}
$output = "
<div class=\"d-flex flex-column flex-lg-row\">
<div class=\"col-12 col-lg-6\">
<figure class=\"zoomImage\" onmousemove=\"zoom(event)\" style=\"background-image: url($zoom)\">
<img src=\"$zoom\" alt=\"\" class=\"w-100\" />
</figure>
</div>
<div class=\"col-12 col-lg-6 pt-30 pt-lg-0 ps-lg-30\">
<div class=\"d-flex justify-content-between position-lg-relative\">
<h4 class=\"modal-title fs-5\" id=\"popupCoatingLabel\">".$rivestimento->getTitolo()."</h4>
<button type=\"button\" class=\"btn-close\" data-bs-dismiss=\"modal\" aria-label=\"Close\"></button>
</div>
<div class=\"table fs-16\">
<div class=\"d-flex\">
<div class=\"col-6 border-bottom border-gray px-0 py-5\">".$translator->trans('TIPOLOGIA')."</div>
<div class=\"col-6 border-bottom border-gray px-0 py-5\">".$translator->trans($rivestimento->getTipologia())."</div>
</div>
<div class=\"d-flex\">
<div class=\"col-6 border-bottom border-gray px-0 py-5\">".$translator->trans('CATEGORIA')."</div>
<div class=\"col-6 border-bottom border-gray px-0 py-5\">".$rivestimento->getCategoria()."</div>
</div>
<div class=\"d-flex\">
<div class=\"col-6 border-bottom border-gray px-0 py-5\">".$translator->trans('COMPOSIZIONE')."</div>
<div class=\"col-6 border-bottom border-gray px-0 py-5\">".$translator->trans($rivestimento->getComposizione())."</div>
</div>
<div class=\"d-flex\">
<div class=\"col-6 border-bottom border-gray px-0 py-5\">".$translator->trans("RESISTENZA ALL'ABRAZIONE")."</div>
<div class=\"col-6 border-bottom border-gray px-0 py-5\">".$translator->trans($rivestimento->getResistenzaAbrasione())."</div>
</div>
<div class=\"d-flex\">
<div class=\"col-6 border-bottom border-gray px-0 py-5\">".$translator->trans('ALTEZZA')."</div>
<div class=\"col-6 border-bottom border-gray px-0 py-5\">".$rivestimento->getAltezza()."</div>
</div>
<div class=\"d-flex\">
<div class=\"col-6 border-bottom border-gray px-0 py-5\">".$translator->trans('TRATTAMENTO')."</div>
<div class=\"col-6 border-bottom border-gray px-0 py-5\">".$translator->trans($rivestimento->getTrattamento())."</div>
</div>
<div class=\"d-flex\">
<div class=\"col-6 border-bottom border-gray px-0 py-5\">".$translator->trans('CALO AL LAVAGGIO IN ACQUA')."</div>
<div class=\"col-6 border-bottom border-gray px-0 py-5\">".$rivestimento->getCaloLavaggio()."</div>
</div>
<div class=\"d-flex\">
<div class=\"col-6 border-bottom border-gray px-0 py-5\">".$translator->trans('INFIAMMABILITÀ')."</div>
<div class=\"col-6 border-bottom border-gray px-0 py-5\">".$rivestimento->getInfiammabilita()."</div>
</div>
<div class=\"d-flex\">
<div class=\"col-6 border-bottom border-gray px-0 py-5\">".$translator->trans('NORME DI MANUTENZIONE')."</div>
<div class=\"col-6 border-bottom border-gray px-0 py-5 d-flex flex-wrap\">";
if(!$rivestimento->getCandeggiabile()) $output .= "<img src=\"/assets/images/icons/ico-non-candeggiabile.jpg\" alt=\"\" />";
if($rivestimento->getNoLavaggioInAcqua()) $output .= "<img src=\"/assets/images/icons/ico-no-lavaggio-acqua.jpg\" alt=\"\" />";
if($rivestimento->getNoAsciugaturaATamburo()) $output .= "<img src=\"/assets/images/icons/ico-no-asciugatura.jpg\" alt=\"\" />";
if($rivestimento->getNonPulireASecco()) $output .= "<img src=\"/assets/images/icons/ico-no-pulitura-secco.jpg\" alt=\"\" />";
if(!$rivestimento->getStiraturaAFerroConsentita()) $output .= "<img src=\"/assets/images/icons/ico-no-stiratura.jpg\" alt=\"\" />";
$output .= "</div>
</div>
<div class=\"d-flex\">
<div class=\"col-6 border-bottom border-gray px-0 py-5\">".$translator->trans('ATTENZIONE')."</div>
<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>
</div>
<div class=\"d-flex\">
<div class=\"col-6 border-bottom border-gray px-0 py-5\">".$translator->trans('DECORO')."</div>
<div class=\"col-6 border-bottom border-gray px-0 py-5\">".$translator->trans('proporzione decoro su 50 cm di tessuto')."</div>
</div>
</div>
</div>
</div>";
return new Response($output);
}
/**
* @Route("/{locale}/get-finishing", name="get-product-finishing", requirements={"locale"="it|en"})
*
* @return Response
*/
public function getProductsFinishingAction(Request $request, TranslatorInterface $translator): Response
{
$id = $request->get('id');
$finitura = Finiture::getById($id);
$data = [];
if($finitura instanceof \Pimcore\Model\DataObject\Finiture){
$immagine = $finitura->getImmagine();
if($immagine){
$immagine = $immagine->getFrontendPath();
}
$miniatura = $finitura->getMiniatura();
if($miniatura){
$miniatura = $miniatura->getThumbnail('rivestimenti_thumbnail')->getFrontendPath();
}
$zoom = $finitura->getZoom();
if($zoom){
$zoom = $zoom->getFrontendPath();
}
}
$output = "
<div class=\"d-flex flex-column flex-lg-row\">
<div class=\"col-12 col-lg-6\">
<figure class=\"zoomImage\" onmousemove=\"zoom(event)\" style=\"background-image: url($zoom)\">
<img src=\"$zoom\" alt=\"\" class=\"w-100\" />
</figure>
</div>
<div class=\"col-12 col-lg-6 pt-30 pt-lg-0 ps-lg-30\">
<div class=\"d-flex justify-content-between position-lg-relative\">
<h4 class=\"modal-title fs-5\" id=\"popupCoatingLabel\">".$translator->trans($finitura->getTitolo())."</h4>
<button type=\"button\" class=\"btn-close\" data-bs-dismiss=\"modal\" aria-label=\"Close\"></button>
</div>
<div class=\"table fs-16\">
<div class=\"d-flex\">
<div class=\"col-6 border-bottom border-gray px-0 py-5\">".$translator->trans('TIPOLOGIA')."</div>
<div class=\"col-6 border-bottom border-gray px-0 py-5\">".$translator->trans($finitura->getTipoFinitura())."</div>
</div>
<div class=\"d-flex\">
<div class=\"col-6 border-bottom border-gray px-0 py-5\">".$translator->trans('DESCRIZIONE')."</div>
<div class=\"col-6 border-bottom border-gray px-0 py-5\">".$translator->trans($finitura->getDescrizione())."</div>
</div>
</div>
</div>
</div>";
return new Response($output);
}
public function listAction(Request $request): Response
{
return $this->render('product/product-list.html.twig');
}
public function getProductFilters($products): array
{
$attributes = [
'tipologia',
'stile',
'materialeStruttura',
'specifiche',
'utilizzo'
];
$filters = [];
$products_id= [];
foreach($products as $product){
$products_id[] = $product->getId();
}
return $filters;
}
public function listCategoryAction(Request $request): Response
{
if ($request->get('type') === 'object') {
$root_category_id = $request->get('id');
$root_category = Category::getById($root_category_id);
if ($root_category instanceof \Pimcore\Model\DataObject\Category) {
$products = new Product\Listing();
$products->setCondition('categoria LIKE ?', ["%,".$root_category_id."%,"]);
$products->setOrderKey('nome');
$products->setOrder('ASC');
$filters = $this->getProductFilters($products);
print_r($filters);
return $this->render('product/list-category.html.twig', [
'category' => $root_category,
'products' => $products,
'filters' => $filters
]);
}
}
throw new NotFoundHttpException('Error.');
}
/**
* @Route("/{locale}/search", name="search", methods={"GET"})
*/
public function searchAction(Request $request, ListHelper $listHelper, Factory $ecommerceFactory, PaginatorInterface $paginator): Response
{
$params = $request->query->all();
$params['category'] = Category::getById((int) ($params['category'] ?? -1));
$indexService = $ecommerceFactory->getIndexService();
$productListing = $indexService->getProductListForCurrentTenant();
//$productListing->setVariantMode(ProductListInterface::VARIANT_MODE_VARIANTS_ONLY);
$term = strip_tags($request->query->get('term'));
if ($productListing instanceof AbstractElasticSearch) {
// simple elastic search query - uses multi-match query on all defined search_attributes
// $productListing->addQueryCondition($term);
//sample for a more specific elastic search query - not considers search_attributes but provides full flexibility
// this query weights cars more that accessories
$query = [
'function_score' => [
'query' => [
'multi_match' => [
'query' => $term,
'type' => 'cross_fields',
'operator' => 'and',
'fields' => [
'attributes.name^4',
'attributes.name.analyzed',
'attributes.name.analyzed_ngram',
'attributes.manufacturer_name^3',
'attributes.manufacturer_name.analyzed',
'attributes.manufacturer_name.analyzed_ngram',
'attributes.color',
'attributes.color.analyzed',
'attributes.color.analyzed_ngram',
'attributes.carClass',
'attributes.carClass.analyzed',
'attributes.carClass.analyzed_ngram'
]
]
],
'functions' => [
[
'filter' => ['match' => ['system.classId' => 'AP']],
'weight' => 1
],
[
'filter' => ['match' => ['system.classId' => 'CAR']],
'weight' => 2
]
],
'boost_mode' => 'multiply'
]
];
$productListing->addQueryCondition($query, 'searchTerm');
} else {
//default mysql search query condition - would also work for elastic search in that way
$term = trim(preg_replace('/\s+/', ' ', $term));
if (!empty($term)) {
foreach (explode(' ', $term) as $t) {
$productListing->addQueryCondition($t);
}
}
}
if (isset($params['autocomplete'])) {
$resultset = [];
$productListing->setLimit(10);
foreach ($productListing as $product) {
$result['href'] = $product->getUrl()[0]->getSlug();
$result['image'] = '';
if($product->getFotoPricipale()) {
$result['image'] = $product->getFotoPricipale()->getThumbnail("product_thumbnail_gallery")->getPath();
}
$result['title'] = $product->getNome() ?? '';
if ($product instanceof Prodotto) {
$result['title'] .= ' ' . $product->getNome();
}
$resultset[] = $result;
}
return $this->json($resultset);
}
$filterDefinition = $params['filterDefinition'] = Config::getWebsiteConfig()['fallbackFilterdefinition'];
// create and init filter service
$filterService = Factory::getInstance()->getFilterService();
$listHelper->setupProductList($filterDefinition, $productListing, $params, $filterService, true);
$params['filterService'] = $filterService;
$params['products'] = $productListing;
// init pagination
$paginator = $paginator->paginate(
$productListing,
$request->query->getInt('page', 1),
$filterDefinition->getPageLimit()
);
$params['results'] = $paginator;
$params['paginationVariables'] = $paginator->getPaginationData();
$trackingManager = $ecommerceFactory->getTrackingManager();
foreach ($paginator as $product) {
$trackingManager->trackProductImpression($product, 'search-results');
}
$params['language'] = $request->getLocale();
$params['term'] = $term;
return $this->render('product/search.html.twig', $params);
}
/**
* @Route("/{locale}/{path}", name="search_results", requirements={"locale"="it|en", "path"="(prodotti|products)"}, methods={"GET"})
*/
public function searchProductsAction(Request $request, ListHelper $listHelper, Factory $ecommerceFactory, PaginatorInterface $paginator, TranslatorInterface $translator): Response
{
$params = $request->query->all();
$params['category'] = Category::getById((int) ($params['category'] ?? -1));
$indexService = $ecommerceFactory->getIndexService();
$productListing = $indexService->getProductListForCurrentTenant();
//$productListing->setVariantMode(ProductListInterface::VARIANT_MODE_VARIANTS_ONLY);
$term = strip_tags($request->query->get('term'));
if ($productListing instanceof AbstractElasticSearch) {
// simple elastic search query - uses multi-match query on all defined search_attributes
// $productListing->addQueryCondition($term);
//sample for a more specific elastic search query - not considers search_attributes but provides full flexibility
// this query weights cars more that accessories
$query = [
'function_score' => [
'query' => [
'multi_match' => [
'query' => $term,
'type' => 'cross_fields',
'operator' => 'and',
'fields' => [
'attributes.name^4',
'attributes.name.analyzed',
'attributes.name.analyzed_ngram',
'attributes.manufacturer_name^3',
'attributes.manufacturer_name.analyzed',
'attributes.manufacturer_name.analyzed_ngram',
'attributes.color',
'attributes.color.analyzed',
'attributes.color.analyzed_ngram',
'attributes.carClass',
'attributes.carClass.analyzed',
'attributes.carClass.analyzed_ngram'
]
]
],
'functions' => [
[
'filter' => ['match' => ['system.classId' => 'AP']],
'weight' => 1
],
[
'filter' => ['match' => ['system.classId' => 'CAR']],
'weight' => 2
]
],
'boost_mode' => 'multiply'
]
];
$productListing->addQueryCondition($query, 'searchTerm');
} else {
//default mysql search query condition - would also work for elastic search in that way
$term = trim(preg_replace('/\s+/', ' ', $term));
if (!empty($term)) {
foreach (explode(' ', $term) as $t) {
$productListing->addQueryCondition($t);
}
}
}
if (isset($params['autocomplete'])) {
$resultset = [];
$productListing->setLimit(10);
foreach ($productListing as $product) {
$result['href'] = $product->getUrl()[0]->getSlug();
$result['image'] = '';
if($product->getFotoPricipale()) {
$result['image'] = $product->getFotoPricipale()->getThumbnail("product_thumbnail_gallery")->getPath();
}
$result['title'] = $product->getNome() ?? '';
if ($product instanceof Prodotto) {
$result['title'] .= ' ' . $product->getNome();
}
$resultset[] = $result;
}
return $this->json($resultset);
}
$filterDefinition = $params['filterDefinition'] = Config::getWebsiteConfig()['fallbackFilterdefinition'];
// create and init filter service
$filterService = Factory::getInstance()->getFilterService();
$listHelper->setupProductList($filterDefinition, $productListing, $params, $filterService, true);
$params['filterService'] = $filterService;
$params['products'] = $productListing;
// init pagination
$paginator = $paginator->paginate(
$productListing,
$request->query->getInt('page', 1),
$filterDefinition->getPageLimit()
);
$params['results'] = $paginator;
$params['paginationVariables'] = $paginator->getPaginationData();
$trackingManager = $ecommerceFactory->getTrackingManager();
foreach ($paginator as $product) {
$trackingManager->trackProductImpression($product, 'search-results');
}
$params['language'] = $request->getLocale();
$params['term'] = $term;
$params['pageTitle'] = $translator->trans('Search results for:') . " " . $term;
$params['pageDescription'] = $translator->trans('Search results for:') . " " . $term;
$params['description'] = $translator->trans('Search results for:') . " " . $term;
$params['categorydo']["name"] = null;
$params['productListing'] = $productListing;
return $this->render('product/product-list.html.twig', $params);
}
}