custom/plugins/topdatatopfinderprosw6/src/Controller/TopFinderController.php line 967

Open in your IDE?
  1. <?php declare(strict_types=1);
  2. namespace Topdata\TopdataTopFinderProSW6\Controller;
  3. use Shopware\Core\Framework\Routing\Annotation\RouteScope;
  4. use Shopware\Core\Framework\Context;
  5. use Shopware\Storefront\Controller\StorefrontController;
  6. use Symfony\Component\HttpFoundation\Request;
  7. use Symfony\Component\HttpFoundation\Response;
  8. use Symfony\Component\Routing\Annotation\Route;
  9. use Symfony\Component\HttpFoundation\JsonResponse;
  10. use Shopware\Core\Framework\DataAbstractionLayer\EntityRepositoryInterface;
  11. use Shopware\Core\Framework\DataAbstractionLayer\Search\Criteria;
  12. use Shopware\Core\Framework\DataAbstractionLayer\Search\Filter\EqualsFilter;
  13. use Shopware\Core\Framework\DataAbstractionLayer\Search\Sorting\FieldSorting;
  14. use Shopware\Core\Framework\Validation\DataBag\RequestDataBag;
  15. use Shopware\Core\System\SalesChannel\SalesChannelContext;
  16. use Topdata\TopdataTopFinderProSW6\Storefront\Page\Topfinder\TopfinderPageLoader;
  17. use Topdata\TopdataTopFinderProSW6\Storefront\Page\Topfinder\DeviceListPageLoader;
  18. use Topdata\TopdataTopFinderProSW6\Storefront\Page\Topfinder\DeviceSuggestPageLoader;
  19. use Topdata\TopdataTopFinderProSW6\Storefront\Page\Topfinder\DeviceSearchPageLoader;
  20. use Topdata\TopdataTopFinderProSW6\Storefront\Page\Topfinder\TopfinderPage;
  21. use Shopware\Core\Content\Product\SalesChannel\Listing\ProductListingResult;
  22. use Topdata\TopdataConnectorSW6\Core\Content\Device\DeviceEntity;
  23. use Topdata\TopdataTopFinderProSW6\Component\Collection;
  24. use Shopware\Core\Framework\DataAbstractionLayer\EntityCollection;
  25. use Topdata\TopdataTopFinderProSW6\Component\SettingsService;
  26. use Shopware\Core\System\SalesChannel\Entity\SalesChannelRepositoryInterface;
  27. use Topdata\TopdataTopFinderProSW6\Storefront\Page\Topfinder\ListPageLoader;
  28. use Topdata\TopdataTopFinderProSW6\Storefront\Page\CompatibleDevicesWidget\CompatibleDevicesWidgetLoader;
  29. use Topdata\TopdataConnectorSW6\Component\Helper\EntitiesHelper;
  30. use Symfony\Component\HttpFoundation\Cookie;
  31. use Topdata\TopdataTopFinderProSW6\Storefront\Page\PopupFormWidget\PopupFormWidgetLoader;
  32. use Topdata\TopdataTopFinderProSW6\Storefront\Page\PopupDeviceWidget\PopupDeviceWidgetLoader;
  33. use Topdata\TopdataTopFinderProSW6\Storefront\Page\BrandLetter\BrandLetterPageLoader;
  34. use Topdata\TopdataTopFinderProSW6\Storefront\Page\OneBrandLetter\OneBrandLetterPageLoader;
  35. use Shopware\Core\Framework\Routing\Exception\MissingRequestParameterException;
  36. use Symfony\Component\HttpFoundation\RedirectResponse;
  37. use Topdata\TopdataTopFinderProSW6\Component\Helper;
  38. use Topdata\TopdataConnectorSW6\Core\Content\Device\Agregate\DeviceCustomer\DeviceCustomerEntity;
  39. use Topdata\TopdataTopFinderProSW6\Storefront\Page\PopupDeviceInfoWidget\PopupDeviceInfoWidgetLoader;
  40. use Shopware\Core\Framework\Uuid\Uuid;
  41. use Topdata\TopdataTopFinderProSW6\Storefront\Page\ListProducts\ListProductsLoader;
  42. use Topdata\TopdataTopFinderProSW6\Content\Product\Events\DeviceProductsCriteriaEvent;
  43. use Topdata\TopdataTopFinderProSW6\Storefront\Page\Device\DevicePage;
  44. use Topdata\TopdataTopFinderProSW6\Storefront\Page\Device\DevicePageLoader;
  45. use Shopware\Storefront\Page\Page;
  46. use Shopware\Core\Checkout\Cart\Exception\CustomerNotLoggedInException;
  47. use Symfony\Component\HttpKernel\EventListener\AbstractSessionListener;
  48. /**
  49.  * @RouteScope(scopes={"storefront"})
  50.  */
  51. class TopFinderController extends StorefrontController
  52. {
  53.     const POPUP_DEVICES_PRELOAD_LENGTH 20;
  54.     
  55.     /**
  56.      * @var ?array
  57.      */
  58.     private $deviceList null;
  59.     
  60.     /**
  61.      * @var SalesChannelRepositoryInterface 
  62.      */
  63.     private $productRepository;
  64.     
  65.     /**
  66.      * @var EntityRepositoryInterface 
  67.      */
  68.     private $brandRepository;
  69.     
  70.     /**
  71.      * @var EntityRepositoryInterface 
  72.      */
  73.     private $deviceRepository;
  74.     
  75.     /**
  76.      * @var EntityRepositoryInterface 
  77.      */
  78.     private $deviceCustomerRepository;
  79.     
  80.     /**
  81.      * @var EntityRepositoryInterface 
  82.      */
  83.     private $seriesRepository;
  84.     
  85.     /**
  86.      * @var EntityRepositoryInterface 
  87.      */
  88.     private $typeRepository;
  89.     
  90.     /**
  91.      * @var TopfinderPageLoader
  92.      */
  93.     private $topfinderPageLoader;
  94.     
  95.     /**
  96.      * @var DeviceListPageLoader
  97.      */
  98.     private $deviceListPageLoader;
  99.     
  100.     /**
  101.      * @var DeviceSuggestPageLoader
  102.      */
  103.     private $deviceSuggestPageLoader;
  104.     
  105.     /**
  106.      * @var DeviceSearchPageLoader
  107.      */
  108.     private $deviceSearchPageLoader;
  109.     
  110.     /**
  111.      * @var SettingsService
  112.      */
  113.     private $settings;
  114.     
  115.     /**
  116.      * @var ListPageLoader
  117.      */
  118.     private $listPageLoader;
  119.     
  120.     /**
  121.      * @var CompatibleDevicesWidgetLoader
  122.      */
  123.     private $compatibleDevicesWidgetLoader;
  124.     
  125.     /**
  126.      * @var type PopupDeviceWidgetLoader
  127.      */
  128.     private $popupDeviceWidgetLoader;
  129.     
  130.     /**
  131.      * @var PopupFormWidgetLoader
  132.      */
  133.     private $popupFormWidgetLoader;
  134.     
  135.     /**
  136.      * @var BrandLetterPageLoader
  137.      */
  138.     private $brandLetterPageLoader;
  139.     
  140.     /**
  141.      * @var OneBrandLetterPageLoader
  142.      */
  143.     private $oneBrandLetterPageLoader;
  144.     
  145.     /**
  146.      * @var PopupDeviceInfoWidgetLoader
  147.      */
  148.     private $popupDeviceInfoWidgetLoader;
  149.     
  150.     /**
  151.      * @var ListProductsLoader
  152.      */
  153.     private $listProductsLoader;
  154.     
  155.     /**
  156.      * @var DevicePageLoader
  157.      */
  158.     private $devicePageLoader;
  159.     
  160.     /**
  161.      * @var EntitiesHelper
  162.      */
  163.     private $entitiesHelper;
  164.     public function __construct(
  165.         SalesChannelRepositoryInterface $productRepository,
  166.         EntityRepositoryInterface $brandRepository,
  167.         EntityRepositoryInterface $deviceRepository,
  168.         EntityRepositoryInterface $seriesRepository,
  169.         EntityRepositoryInterface $typeRepository,
  170.         EntityRepositoryInterface $deviceCustomerRepository,
  171.         TopfinderPageLoader $topfinderPageLoader,
  172.         DeviceListPageLoader $deviceListPageLoader,
  173.         DeviceSuggestPageLoader $deviceSuggestPageLoader,
  174.         DeviceSearchPageLoader $deviceSearchPageLoader,
  175.         SettingsService $settingsService,
  176.         ListPageLoader $listPageLoader,
  177.         CompatibleDevicesWidgetLoader $compatibleDevicesWidgetLoader,
  178.         PopupFormWidgetLoader $popupFormWidgetLoader,
  179.         PopupDeviceWidgetLoader $popupDeviceWidgetLoader,
  180.         BrandLetterPageLoader $brandLetterPageLoader,
  181.         OneBrandLetterPageLoader $oneBrandLetterPageLoader,
  182.         PopupDeviceInfoWidgetLoader $popupDeviceInfoWidgetLoader,
  183.         ListProductsLoader $listProductsLoader,
  184.         DevicePageLoader $devicePageLoader,
  185.         EntitiesHelper $entitiesHelper
  186.     )
  187.     {
  188.         $this->productRepository $productRepository;
  189.         $this->brandRepository $brandRepository;
  190.         $this->deviceRepository $deviceRepository;
  191.         $this->seriesRepository $seriesRepository;
  192.         $this->typeRepository $typeRepository;
  193.         $this->topfinderPageLoader $topfinderPageLoader;
  194.         $this->deviceListPageLoader $deviceListPageLoader;
  195.         $this->deviceSuggestPageLoader $deviceSuggestPageLoader;
  196.         $this->deviceSearchPageLoader $deviceSearchPageLoader;
  197.         $this->settings $settingsService;
  198.         $this->listPageLoader $listPageLoader;
  199.         $this->compatibleDevicesWidgetLoader $compatibleDevicesWidgetLoader;
  200.         $this->popupFormWidgetLoader $popupFormWidgetLoader;
  201.         $this->popupDeviceWidgetLoader $popupDeviceWidgetLoader;
  202.         $this->brandLetterPageLoader $brandLetterPageLoader;
  203.         $this->oneBrandLetterPageLoader $oneBrandLetterPageLoader;
  204.         $this->deviceCustomerRepository $deviceCustomerRepository;
  205.         $this->popupDeviceInfoWidgetLoader $popupDeviceInfoWidgetLoader;
  206.         $this->listProductsLoader $listProductsLoader;
  207.         
  208.         $this->devicePageLoader $devicePageLoader;
  209.         $this->entitiesHelper $entitiesHelper;
  210.     }
  211.     
  212.     private function getSeriesArray($brandId) : array
  213.     {
  214.         $seriesArray = [];
  215.         
  216.         $criteria = new Criteria();
  217.         $criteria->addFilter(new EqualsFilter('enabled'true));
  218.         $criteria->addFilter(new EqualsFilter('brandId'$brandId));
  219.         $criteria->addSorting(new FieldSorting('label'FieldSorting::ASCENDING));
  220.         $series $this->seriesRepository->search($criteriaContext::createDefaultContext())->getEntities();
  221.         
  222.         if(!count($series)) {
  223.             return $seriesArray;
  224.         }
  225.         
  226.         
  227.         foreach ($series as $serie) {
  228.             $seriesArray[$serie->getCode()] = $serie->getLabel();
  229.         }
  230.         
  231.         return $seriesArray;
  232.     }
  233.     
  234.     /**
  235.      * @Route("/top-finder/get-series/{brandCode}", name="frontend.top_finder.get_series", methods={"GET","POST"}, defaults={"XmlHttpRequest"=true})
  236.      */
  237.     public function getSeries(Request $requestSalesChannelContext $salesChannelContext): JsonResponse
  238.     {
  239.         $brandCode $request->get('brandCode');
  240.         
  241.         if(!trim($brandCode)) {
  242.             return new JsonResponse(['found' => false]);
  243.         }
  244.         
  245.         $brand $this
  246.             ->brandRepository
  247.             ->search(
  248.                 (new Criteria())
  249.                     ->addFilter(new EqualsFilter('enabled'true))
  250.                     ->addFilter(new EqualsFilter('code'$brandCode)),
  251.                 $salesChannelContext->getContext()
  252.             )
  253.             ->getEntities()
  254.             ->first();
  255.         
  256.         if(!$brand) {
  257.             return new JsonResponse(['found' => false]);
  258.         }
  259.         
  260.         $brandId $brand->getId();
  261.         $seriesArray $this->getSeriesArray($brandId);
  262.         
  263.         if(!count($seriesArray)) {
  264.             return new JsonResponse(['found' => false]);
  265.         }
  266.         
  267.         return new JsonResponse([
  268.             'found' => true,
  269.             'items' => $seriesArray
  270.         ]);
  271.     }
  272.     
  273.     
  274.     public function getTypesArray($brandId) : array
  275.     {
  276.         $criteria = new Criteria();
  277.         $criteria->addFilter(new EqualsFilter('enabled'true));
  278.         $criteria->addFilter(new EqualsFilter('brandId'$brandId));
  279.         $criteria->addSorting(new FieldSorting('label'FieldSorting::ASCENDING));
  280.         $types $this->typeRepository->search($criteriaContext::createDefaultContext())->getEntities();
  281.         
  282.         if(!count($types)) {
  283.             return [];
  284.         }
  285.         
  286.         
  287.         $typesArray = [];
  288.         foreach ($types as $type) {
  289.             $typesArray[$type->getCode()] = $type->getLabel();
  290.         }
  291.         
  292.         return $typesArray;
  293.     }
  294.     
  295.     
  296.     /**
  297.      * @Route("/top-finder/get-types/{brandCode}", name="frontend.top_finder.get_types", methods={"GET","POST"}, defaults={"XmlHttpRequest"=true})
  298.      */
  299.     public function getTypes(Request $requestSalesChannelContext $salesChannelContext): JsonResponse
  300.     {
  301.         $brandCode $request->get('brandCode');
  302.         
  303.         if(!trim($brandCode)) {
  304.             return new JsonResponse(['found' => false]);
  305.         }
  306.         
  307.         $brand $this
  308.             ->brandRepository
  309.             ->search(
  310.                 (new Criteria())
  311.                     ->addFilter(new EqualsFilter('enabled'true))
  312.                     ->addFilter(new EqualsFilter('code'$brandCode)),
  313.                 $salesChannelContext->getContext()
  314.             )
  315.             ->getEntities()
  316.             ->first();
  317.         
  318.         if(!$brand) {
  319.             return new JsonResponse(['found' => false]);
  320.         }
  321.         
  322.         $brandId $brand->getId();
  323.         
  324.         $typesArray $this->getTypesArray($brandId);
  325.         
  326.         if(!count($typesArray)) {
  327.             return new JsonResponse(['found' => false]);
  328.         }
  329.         
  330.         return new JsonResponse([
  331.             'found' => true,
  332.             'items' => $typesArray
  333.         ]);
  334.     }
  335.     
  336.     
  337.     private function resolveCode($code$repository$context)
  338.     {
  339.         if($code == '0') {
  340.             return '0';
  341.         }
  342.         
  343.         if($code == '-1') {
  344.             return '-1';
  345.         }
  346.         
  347.         if(!trim($code)) {
  348.             return false;
  349.         }
  350.         
  351.         $entity $repository
  352.             ->search(
  353.                 (new Criteria())
  354.                     ->addFilter(new EqualsFilter('enabled'true))
  355.                     ->addFilter(new EqualsFilter('code'$code)),
  356.                 $context
  357.             )
  358.             ->getEntities()
  359.             ->first();
  360.         
  361.         if(!$entity) {
  362.             return false;
  363.         }
  364.         
  365.         return $entity->getId();
  366.     }
  367.     
  368.     /**
  369.      * @Route("/top-finder/get-devices/{brandCode}/{typeCode}/{seriesCode}", name="frontend.top_finder.get_devices", methods={"GET","POST"}, defaults={"XmlHttpRequest"=true})
  370.      */
  371.     public function getDevices(Request $requestSalesChannelContext $salesChannelContext): JsonResponse
  372.     {
  373.         $brandCode $this->resolveCode((string)$request->get('brandCode'), $this->brandRepository$salesChannelContext->getContext());
  374.         $seriesCode $this->resolveCode((string)$request->get('seriesCode'), $this->seriesRepository$salesChannelContext->getContext());
  375.         $typeCode $this->resolveCode((string)$request->get('typeCode'), $this->typeRepository$salesChannelContext->getContext());
  376.         
  377.         if(($brandCode === false) || ($seriesCode === false) || ($typeCode === false)) {
  378.             return new JsonResponse(['found' => false]);
  379.         }
  380.         
  381.         $devicesArray $this->getDevicesArray($brandCode$seriesCode$typeCode);
  382.         
  383.         if(!count($devicesArray)) {
  384.             return new JsonResponse(['found' => false]);
  385.         }
  386.         
  387.         return new JsonResponse([
  388.             'found' => true,
  389.             'items' => $devicesArray
  390.         ]);
  391.     }
  392.     
  393.     private function getDevicesArray($brandId$seriesId$typeIdbool $codeAsKey true) : array
  394.     {
  395.         $return = [];
  396.         $params = [];
  397.         /** @var \Doctrine\DBAL\Connection $connection */
  398.         $connection $this->container->get('Doctrine\DBAL\Connection');
  399.         
  400.         $params[] = 'is_enabled = 1';
  401.         
  402.         if(EntitiesHelper::isValidUuid($brandId)) {
  403.             $params[] = 'brand_id = 0x'.$brandId;
  404.         }
  405.         else {
  406.             return $return;
  407.         }
  408.         
  409.         if($seriesId == -1) {
  410.             $params[] = 'series_id is null';
  411.         }
  412.         elseif(EntitiesHelper::isValidUuid($seriesId)) {
  413.             $params[] = 'series_id = 0x'.$seriesId;
  414.         }
  415.         
  416.         if($typeId == -1) {
  417.             $params[] = 'type_id is null';
  418.         }
  419.         elseif(EntitiesHelper::isValidUuid($typeId)) {
  420.             $params[] = 'type_id = 0x'.$typeId;
  421.         }
  422.         
  423.         $devices $connection->fetchAll(
  424.             'SELECT code, model FROM `topdata_device`'
  425.             .' WHERE ('.implode(') AND ('$params).')'
  426.             .' ORDER BY model ASC');
  427.         
  428.         if($codeAsKey) {
  429.             foreach ($devices as $device) {
  430.                 $return[$device['code']] = $device['model'];
  431.             }
  432.         }
  433.         else {
  434.             $return $devices;
  435.         }
  436.         
  437.         return $return;
  438.         
  439.     }
  440.     
  441.     private function getEntityCollection(EntityRepositoryInterface $repository, array $params = [], ?string $sortingField nullbool $deleteNullParams true) : EntityCollection
  442.     {
  443.         $criteria = new Criteria();
  444.         foreach ($params as $key => $value) {
  445.             if(($value === null) && $deleteNullParams) {
  446.                 continue;
  447.             }
  448.             $criteria->addFilter(new EqualsFilter($key$value));
  449.         }
  450.         if($sortingField !== null) {
  451.             $criteria->addSorting(new FieldSorting($sortingFieldFieldSorting::ASCENDING));
  452.         }
  453.         $criteria->setLimit(999);
  454.         return $repository->search($criteriaContext::createDefaultContext())->getEntities();
  455.     }
  456.     
  457.     /**
  458.      * @Route("/top-finder/device/{deviceCode}", name="frontend.top_finder.device", methods={"GET","POST"}, defaults={"XmlHttpRequest"=true})
  459.      */
  460.     public function getDeviceNew(Request $requestSalesChannelContext $context): Response
  461.     {
  462.         /** @var DevicePage $page */
  463.         $page $this->devicePageLoader->load($request$context);
  464.         
  465.         $page->device->setInDeviceList(
  466.             in_array($page->device->getId(), 
  467.             $this->getDeviceList($context))
  468.         );
  469.         
  470.         if($request->isXmlHttpRequest() === false 
  471.             && $this->settings->getBool('showDeviceHistory'))
  472.         {
  473.             $this->setDeviceToHistory($request$page);
  474.         }
  475.         
  476.         if($request->isXmlHttpRequest() === false) {
  477.             $this->fillSelectboxes($page$page->device$context$request);
  478.         }
  479.         $response $this->renderStorefront(
  480.             '@TopdataTopFinderProSW6/storefront/page/topfinder/device-page.html.twig'
  481.             ['page' => $page]
  482.         );
  483.         
  484.         if($request->isXmlHttpRequest() === false) {
  485.             if($this->settings->getBool('showDeviceHistory')) {
  486.                 $response->headers->setCookie(
  487.                     Cookie::create(
  488.                         Helper::COOKIE_DEVICE_HISTORY,
  489.                         implode(','$page->deviceHistory),
  490.                         time() + 3600*24*30
  491.                     )
  492.                 );
  493.             }
  494.         }
  495.         
  496.         return $response;
  497.     }
  498.     
  499.     
  500.     /**
  501.      * @Route("/top-finder/device/{deviceCode}/{propertyGroupOptionId}", name="frontend.top_finder.device_tab", methods={"GET","POST"}, defaults={"XmlHttpRequest"=true})
  502.      */
  503.     public function getDeviceTab(Request $requestSalesChannelContext $context): Response
  504.     {
  505.         /** @var DevicePage $page */
  506.         $page $this->devicePageLoader->load($request$context);
  507.         
  508.         $page->device->setInDeviceList(in_array($page->device->getId(), $this->getDeviceList($context)));
  509.         
  510.         if($request->isXmlHttpRequest() === false 
  511.             && $this->settings->getBool('showDeviceHistory'))
  512.         {
  513.             $this->setDeviceToHistory($request$page);
  514.         }
  515.         
  516.         if($request->isXmlHttpRequest() === false) {
  517.             $this->fillSelectboxes($page$page->device$context$request);
  518.         }
  519.         $response $this->renderStorefront('@TopdataTopFinderProSW6/storefront/page/topfinder/device-page.html.twig', ['page' => $page]);
  520.         
  521.         if($request->isXmlHttpRequest() === false) {
  522.             if($this->settings->getBool('showDeviceHistory')) {
  523.                 $response->headers->setCookie(
  524.                     Cookie::create(
  525.                         Helper::COOKIE_DEVICE_HISTORY,
  526.                         implode(','$page->deviceHistory),
  527.                         time() + 3600*24*30
  528.                     )
  529.                 );
  530.             }
  531.         }
  532.         
  533.         return $response;
  534.     }
  535.     
  536.     
  537.     /**
  538.      * @Route("/top-finder/device-filters/{deviceCode}/{propertyGroupOptionId}", name="frontend.top_finder.device_tab_filters", methods={"GET","POST"}, defaults={"XmlHttpRequest"=true})
  539.      */
  540.     public function getDeviceTabFilters(Request $requestSalesChannelContext $context): Response
  541.     {
  542.         // Allows to fetch only aggregations over the gateway.
  543.         $request->request->set('only-aggregations'true);
  544.         // Allows to convert all post-filters to filters. This leads to the fact that only aggregation values are returned, which are combinable with the previous applied filters.
  545.         $request->request->set('reduce-aggregations'true);
  546.         /** @var DevicePage $page */
  547.         $page $this->devicePageLoader->load($request$contexttrue);
  548.         //$listing = $page->listing->getResult();
  549.         $listing $page->listing;
  550.         $mapped = [];
  551.         foreach ($listing->getAggregations() as $aggregation) {
  552.             $mapped[$aggregation->getName()] = $aggregation;
  553.         }
  554.         $response = new JsonResponse($mapped);
  555.         $response->headers->set(AbstractSessionListener::NO_AUTO_CACHE_CONTROL_HEADER'1');
  556.         return $response;
  557.     }
  558.     
  559.     
  560.     /**
  561.      * @Route("/top-finder/device-filters/{deviceCode}", name="frontend.top_finder.device_filters", methods={"GET","POST"}, defaults={"XmlHttpRequest"=true})
  562.      */
  563.     public function getDeviceFilters(Request $requestSalesChannelContext $context): Response
  564.     {
  565.         // Allows to fetch only aggregations over the gateway.
  566.         $request->request->set('only-aggregations'true);
  567.         // Allows to convert all post-filters to filters. This leads to the fact that only aggregation values are returned, which are combinable with the previous applied filters.
  568.         $request->request->set('reduce-aggregations'true);
  569.         /** @var DevicePage $page */
  570.         $page $this->devicePageLoader->load($request$contexttrue);
  571.         //$listing = $page->listing->getResult();
  572.         $listing $page->listing;
  573.         $mapped = [];
  574.         foreach ($listing->getAggregations() as $aggregation) {
  575.             $mapped[$aggregation->getName()] = $aggregation;
  576.         }
  577.         $response = new JsonResponse($mapped);
  578.         $response->headers->set(AbstractSessionListener::NO_AUTO_CACHE_CONTROL_HEADER'1');
  579.         return $response;
  580.     }
  581.     
  582.     private function setDeviceToHistory($request$page) : void
  583.     {
  584.         $device $page->device;
  585.         
  586.         $cokie $request->cookies->get(Helper::COOKIE_DEVICE_HISTORY);
  587.         $devicesHistory = [];
  588.         if($cokie) {
  589.             $devicesHistory explode(','$cokie);
  590.         }
  591.         if(!is_array($devicesHistory)) {
  592.             $devicesHistory = [];
  593.         }
  594.         $historyKey array_search($device->getId(), $devicesHistory);
  595.         if($historyKey !== false) {
  596.             unset($devicesHistory[$historyKey]);
  597.         }
  598.         $devicesHistory[] = $device->getId();
  599.         while(count($devicesHistory) > $this->settings->getInt('deviceHistoryElements')) {
  600.             array_shift($devicesHistory);
  601.         }
  602.         $page->deviceHistory $devicesHistory;
  603.     }
  604.     
  605.     
  606.     private function getProductListingByDevice(DeviceEntity $deviceSalesChannelContext $context) : ProductListingResult
  607.     {
  608.         $criteria = new Criteria($device->getProducts()->getIds());
  609.         
  610.         /** @var EventDispatcherInterface $eventDispatcher */
  611.         $eventDispatcher $this->container->get('event_dispatcher');
  612.         $eventDispatcher->dispatch(
  613.             new DeviceProductsCriteriaEvent($criteria$context)
  614.         );
  615.         
  616.         $result $this->productRepository->search($criteria$context);
  617.         $result ProductListingResult::createFrom($result);
  618.         
  619.         return $result;
  620.     }
  621.     
  622.     private function fillSelectboxes(Page $pageDeviceEntity $deviceSalesChannelContext $contextRequest $request) : void
  623.     {
  624.         $finderStruct $page->getHeader()->getExtension('finder');
  625.         if($finderStruct === null) {
  626.             $finderStruct = new Collection();
  627.         }
  628.         
  629.         if($device->getBrandId()) {
  630.             $brand $this
  631.                 ->brandRepository
  632.                 ->search(
  633.                     (new Criteria([$device->getBrandId()]))
  634.                         ->addFilter(new EqualsFilter('enabled'true)),
  635.                     $context->getContext()
  636.                 )
  637.                 ->getEntities()
  638.                 ->first();
  639.             if($brand) {
  640.                 $finderStruct->set('brandCode'$brand->getCode());
  641.             }
  642.         }
  643.         
  644.         if($device->getSeriesId()) {
  645.             $series $this
  646.                 ->seriesRepository
  647.                 ->search(
  648.                     (new Criteria([$device->getSeriesId()]))
  649.                         ->addFilter(new EqualsFilter('enabled'true)),
  650.                     $context->getContext()
  651.                 )
  652.                 ->getEntities()
  653.                 ->first();
  654.             if($series) {
  655.                 $finderStruct->set('seriesCode'$series->getCode());
  656.             }
  657.         }
  658.         
  659.         if($device->getTypeId()) {
  660.             $type $this
  661.                 ->typeRepository
  662.                 ->search(
  663.                     (new Criteria([$device->getTypeId()]))
  664.                         ->addFilter(new EqualsFilter('enabled'true)),
  665.                     $context->getContext()
  666.                 )
  667.                 ->getEntities()
  668.                 ->first();
  669.             if($type) {
  670.                 $finderStruct->set('typeCode'$type->getCode());
  671.             }
  672.         }
  673.         
  674.         $finderStruct->set('deviceCode'$device->getCode());
  675.         
  676.         if(is_array($page->deviceHistory) && count($page->deviceHistory)
  677.                 && ($this->settings->getBool('showDevicesSlider'
  678.                     || $this->settings->getBool('showDeviceHistorySelect'))
  679.         ) {
  680.             $criteria = (new Criteria(array_reverse($page->deviceHistory)))
  681.                 ->addFilter(new EqualsFilter('enabled'true))
  682.                 ->addAssociations(['brand','media']);
  683.             $devicesHistory $this->deviceRepository->search($criteria$context->getContext())->getElements();
  684.             foreach ($devicesHistory as $dev) {
  685.                 if($this->settings->getBool('showDevicelist')) {
  686.                     $dev->setInDeviceList(
  687.                         in_array(
  688.                             $dev->getId(), 
  689.                             $this->getDeviceList($context)
  690.                         )
  691.                     );
  692.                 } else {
  693.                     $dev->setInDeviceList(false);
  694.                 }
  695.             }
  696.             $devicesHistoryStruct = new Collection();
  697.             $devicesHistoryStruct->set('devices'$devicesHistory);
  698.             if($this->settings->getBool('showDeviceHistorySelect')) {
  699.                 $page->getHeader()->removeExtension('deviceHistory');
  700.                 $page->getHeader()->addExtension('deviceHistory'$devicesHistoryStruct);
  701.             }
  702.             if($this->settings->getBool('showDevicesSlider')) {
  703.                 
  704.                 $devicesHistoryStruct->set('userHiddable'$this->settings->getBool('deviceSliderUserHide'));
  705.                 $devicesHistoryStruct->set('hidden'$request->cookies->get(Helper::COOKIE_DEVICE_SLIDER) === 'hidden');
  706.                 
  707.                 $page->getHeader()->removeExtension('deviceSlider');
  708.                 $page->getHeader()->addExtension('deviceSlider'$devicesHistoryStruct);
  709.             }
  710.         }
  711.         
  712.         if($this->settings->getConfig('showSeries')) {
  713.             $series $this->getEntityCollection(
  714.                 $this->seriesRepository
  715.                 [
  716.                     'enabled'=>true,
  717.                     'brandId'=>$device->getBrandId()
  718.                 ],
  719.                 'label'
  720.             );
  721.             $finderStruct->set('series'$series);
  722.         }
  723.         
  724.         if($this->settings->getConfig('showTypes')) {
  725.             $types $this->getEntityCollection(
  726.                 $this->typeRepository
  727.                 [
  728.                     'enabled'=>true,
  729.                     'brandId'=>$device->getBrandId()
  730.                 ],
  731.                 'label'
  732.             );
  733.             $finderStruct->set('types'$types);
  734.         }
  735.         $devices $this->getDevicesArray($device->getBrandId(), $device->getSeriesId(), $device->getTypeId(), false);
  736. //        $devices = $this->getEntityCollection($this->deviceRepository, $deviceParams, 'model', false);
  737.         $finderStruct->set('devices'$devices);
  738.         
  739. //        $finderStruct->set('test', true);
  740. //        $page->getHeader()->removeExtension('finder');
  741. //        $page->getHeader()->addExtension('finder', $finderStruct);
  742.     }
  743.     
  744.     
  745.     /**
  746.      * Add device to customers personal Device List
  747.      * @Route("/top-finder/add-device/{deviceId}", name="frontend.top_finder.add-device", methods={"GET","POST"}, defaults={"XmlHttpRequest"=true})
  748.      */
  749.     public function addDevice(Request $requestRequestDataBag $dataSalesChannelContext $context): JsonResponse
  750.     {
  751.         $deviceId $request->get('deviceId');
  752.         $returnError = new JsonResponse([
  753.             'success' => false,
  754.             'info' => 'Something went wrong'
  755.         ]);
  756.         $returnSuccess = new JsonResponse([
  757.             'success' => true,
  758.             'deviceId' => $deviceId
  759.         ]);
  760.         
  761.         if(!EntitiesHelper::isValidUuid($deviceId)) {
  762.             return $returnError;
  763.         }
  764.         
  765.         if(!$context->getCustomer() || $context->getCustomer()->getGuest()) {
  766.             return $returnError;
  767.         }
  768.         
  769.         $criteria = new Criteria();
  770.         $criteria->addFilter(new EqualsFilter('id'$deviceId))
  771.             ->addFilter(new EqualsFilter('enabled'true))
  772.             ->setLimit(1);
  773.         /** @var DeviceEntity $device */
  774.         $device $this->deviceRepository->search($criteria$context->getContext())->getEntities()->first();
  775.         
  776.         if($device === null) {
  777.             return $returnError;
  778.         }
  779.         
  780.         $connection $this->container->get('Doctrine\DBAL\Connection');
  781.         if(Helper::deviceToCustomerId($deviceId$context->getCustomer()->getId(), $connection)) {
  782.             return $returnSuccess;
  783.         }
  784.         
  785.         $this->deviceCustomerRepository->create([
  786.             [
  787.                 'deviceId' => $deviceId,
  788.                 'customerId' => $context->getCustomer()->getId(),
  789.                 'extraInfo' => json_encode(DeviceCustomerEntity::defaultExtraInfo())
  790.             ]
  791.         ], $context->getContext());
  792.         
  793.         if(Helper::deviceToCustomerId($deviceId$context->getCustomer()->getId(), $connection)) {
  794.             return $returnSuccess;
  795.         }
  796.         else {
  797.             return $returnError;
  798.         }
  799.     }
  800.     
  801.     
  802.     /**
  803.      * Remove device from customers personal Device List
  804.      * @Route("/top-finder/remove-device/{deviceId}", name="frontend.top_finder.remove-device", methods={"GET","POST"}, defaults={"XmlHttpRequest"=true})
  805.      */
  806.     public function removeDevice(Request $requestRequestDataBag $dataSalesChannelContext $context): JsonResponse
  807.     {
  808.         /** @var \Doctrine\DBAL\Connection $connection */
  809.         $connection $this->container->get('Doctrine\DBAL\Connection');
  810.         
  811.         $deviceId $request->get('deviceId');
  812.         $returnError = new JsonResponse([
  813.             'success' => false,
  814.             'info' => 'Something went wrong'
  815.         ]);
  816.         $returnSuccess = new JsonResponse([
  817.             'success' => true,
  818.             'deviceId' => $deviceId
  819.         ]);
  820.         
  821.         if(!EntitiesHelper::isValidUuid($deviceId)) {
  822.             return $returnError;
  823.         }
  824.         
  825.         if(!$context->getCustomer() || $context->getCustomer()->getGuest()) {
  826.             return $returnError;
  827.         }
  828.         
  829.         $criteria = (new Criteria())
  830.             ->addFilter(new EqualsFilter('id'$deviceId))
  831.             ->setLimit(1);
  832.         /** @var DeviceEntity $device */
  833.         $device $this->deviceRepository->search($criteria$context->getContext())->getEntities()->first();
  834.         
  835.         if($device === null) {
  836.             return $returnError;
  837.         }
  838.         
  839.         $connection->createQueryBuilder()
  840.             ->delete('topdata_device_to_customer')
  841.             ->where('(device_id=0x'$deviceId .') AND (customer_id = 0x'$context->getCustomer()->getId() .')')
  842.             ->execute();
  843.         
  844.         return $returnSuccess;
  845.     }
  846.     
  847.     private function getDeviceList(SalesChannelContext $context) : array
  848.     {
  849.         if(null === $this->deviceList) {
  850.             $this->deviceList = [];
  851.             if($context->getCustomer() && !($context->getCustomer()->getGuest())) {
  852.                 $connection $this->container->get('Doctrine\DBAL\Connection');
  853.                 $rez $connection->createQueryBuilder()
  854.                     ->select(['device_id'])
  855.                     ->from('topdata_device_to_customer')
  856.                     ->where('customer_id = 0x' $context->getCustomer()->getId() )
  857.                     ->execute()
  858.                     ->fetchAll();
  859.                 foreach ($rez as $val) {
  860.                     $this->deviceList[] = bin2hex($val['device_id']);
  861.                 }
  862.             }
  863.         }
  864.         
  865.         return $this->deviceList;
  866.     }
  867.     
  868.     /**
  869.      * @Route("/account/devicelist", name="frontend.account.devicelist.page", methods={"GET"})
  870.      *
  871.      * @throws CustomerNotLoggedInException
  872.      */
  873.     public function deviceList(Request $requestSalesChannelContext $context): Response
  874.     {
  875.         if (!$context->getCustomer()
  876.             || $context->getCustomer()->getGuest()
  877.         ) {
  878.             throw new CustomerNotLoggedInException();
  879.         }
  880.         $page $this->deviceListPageLoader->load($request$context);
  881.         
  882.         $page->getMetaInformation()->setRobots('noindex,nofollow');
  883.         return $this->renderStorefront('@TopdataTopFinderProSW6/storefront/page/account/device-list.html.twig', [
  884.             'page' => $page
  885.         ]);
  886.     }
  887.     
  888.     /**
  889.      * @Route("/device-suggest", name="frontend.top_finder.device_suuggest", methods={"GET"}, defaults={"XmlHttpRequest"=true})
  890.      */
  891.     public function deviceSuggest(Request $requestSalesChannelContext $context): Response
  892.     {
  893.         $page $this->deviceSuggestPageLoader->load($request$context);
  894.         $response $this->renderStorefront('@TopdataTopFinderProSW6/storefront/widget/device-suggest/index.html.twig', ['page' => $page]);
  895.         $response->headers->set("X-Robots-Tag""noindex, nofollow");
  896.         return $response;
  897.     }
  898.     
  899.     /**
  900.      * @Route("/device-search", name="frontend.top_finder.device_search.page", methods={"GET"})
  901.      */
  902.     public function deviceSearch(Request $requestSalesChannelContext $context): Response
  903.     {
  904.         $page $this->deviceSearchPageLoader->load($request$context);
  905.         $response $this->renderStorefront('@TopdataTopFinderProSW6/storefront/page/topfinder/device-search.html.twig', ['page' => $page]);
  906.         $response->headers->set("X-Robots-Tag""noindex, nofollow");
  907.         return $response;
  908.     }
  909.     
  910.     /**
  911.      * @Route("/device-search-more", name="frontend.top_finder.device_search_more", methods={"GET"}, defaults={"XmlHttpRequest"=true})
  912.      */
  913.     public function deviceSearchMore(Request $requestSalesChannelContext $context): JsonResponse
  914.     {
  915.         $page $this->deviceSearchPageLoader->load($request$context);
  916.         $result = ['success' => true];
  917.         $result['html'] = $this->renderStorefront(
  918.             '@Storefront/storefront/page/topfinder/device-search-more.html.twig'
  919.             ['page' => $page]
  920.         )->getContent();
  921.         
  922.         if($result) {
  923.             return new JsonResponse($result);
  924.         }
  925.     }
  926.     
  927.     
  928.     /**
  929.      * @Route("/top-finder/brands", name="frontend.top_finder.brands", methods={"GET"})
  930.      */
  931.     public function listBrands(Request $requestSalesChannelContext $salesChanelContext): Response
  932.     {
  933.         $page $this->listPageLoader->load($request$salesChanelContextListPageLoader::TYPE_BRANDS);
  934.         return $this->renderStorefront('@TopdataTopFinderProSW6/storefront/page/topfinder/list.html.twig', ['page' => $page]);
  935.     }
  936.     
  937.     /**
  938.      * @Route("/top-finder/brand/{brandCode}", name="frontend.top_finder.brand", methods={"GET"})
  939.      */
  940.     public function listBrand(Request $requestSalesChannelContext $salesChanelContext): Response
  941.     {
  942.         $brandCode $request->get('brandCode');
  943.         if(!preg_match('/^[a-z0-9_-]+$/'$brandCode)) {
  944.             throw new MissingRequestParameterException('brandCode''/brandCode');
  945.         }
  946.         
  947.         $page $this->oneBrandLetterPageLoader->load(
  948.             $request
  949.             $salesChanelContext
  950.             $brandCode
  951.         );
  952.         
  953.         $finderStruct $page->getHeader()->getExtension('finder');
  954.         if($finderStruct !== null) {
  955.             $finderStruct->set('brandCode'$page->brand['code']);
  956.             
  957.             if($this->settings->getConfig('showSeries')) {
  958.                 $series $this->getEntityCollection(
  959.                     $this->seriesRepository
  960.                     [
  961.                         'enabled'=>true,
  962.                         'brandId'=>$page->brand['id']
  963.                     ],
  964.                     'label'
  965.                 );
  966.                 $finderStruct->set('series'$series);
  967.             }
  968.             if($this->settings->getConfig('showTypes')) {
  969.                 $types $this->getEntityCollection(
  970.                     $this->typeRepository
  971.                     [
  972.                         'enabled'=>true,
  973.                         'brandId'=>$page->brand['id']
  974.                     ],
  975.                     'label'
  976.                 );
  977.                 $finderStruct->set('types'$types);
  978.             }
  979.             
  980.             $devicesArray $this->getDevicesArray($page->brand['id'], 00false);
  981.             $finderStruct->set('devices'$devicesArray);
  982.         }
  983.         
  984.         
  985.         return $this->renderStorefront(
  986.             '@TopdataTopFinderProSW6/storefront/page/topfinder/one-brand-letter.html.twig'
  987.             ['page' => $page]
  988.         );
  989.     }
  990.     
  991.     /**
  992.      * @Route("/top-finder/brand-devices/{brandCode}", name="frontend.top_finder.brand_devices", methods={"GET", "POST"}, defaults={"productid"="", "XmlHttpRequest"=true})
  993.      */
  994.     public function listBrandDevices(Request $requestSalesChannelContext $salesChanelContext): JsonResponse
  995.     {
  996.         $brandCode $request->get('brandCode');
  997.         if(!preg_match('/^[a-z0-9_-]+$/'$brandCode)) {
  998.             throw new MissingRequestParameterException('brandCode''/brandCode');
  999.         }
  1000.         
  1001.         $mode $request->get('mode');
  1002.         if($mode === 'series') {
  1003.             $view '@Storefront/storefront/page/topfinder/one-brand-letter-series.html.twig';
  1004.         }
  1005.         elseif($mode === 'types') {
  1006.             $view '@Storefront/storefront/page/topfinder/one-brand-letter-types.html.twig';
  1007.         }
  1008.         else {
  1009.             $view '@Storefront/storefront/page/topfinder/one-brand-letter-devices.html.twig';
  1010.         }
  1011.         
  1012.         $page $this->oneBrandLetterPageLoader->load(
  1013.             $request
  1014.             $salesChanelContext
  1015.             $brandCode
  1016.         );
  1017.         
  1018.         $result = ['success' => true];
  1019.         $result['html'] = $this->renderStorefront($view, ['page' => $page])->getContent();
  1020.         
  1021.         if($result) {
  1022.             return new JsonResponse($result);
  1023.         }
  1024.     }
  1025.     
  1026.     
  1027.     /**
  1028.      * @Route("/top-finder/brandq/{code}", name="frontend.top_finder.brandq", methods={"GET"})
  1029.      */
  1030.     public function listBrandQ(Request $requestSalesChannelContext $salesChanelContext): Response
  1031.     {
  1032.         $brandCode $request->get('code');
  1033.         if(!preg_match('/^[a-z0-9_-]+$/'$brandCode)) {
  1034.             throw new MissingRequestParameterException('brandCode''/brandCode');
  1035.         }
  1036.         $page $this->listPageLoader->load($request$salesChanelContextListPageLoader::TYPE_BRAND);
  1037.         
  1038.         $finderStruct $page->getHeader()->getExtension('finder');
  1039.         if($finderStruct !== null) {
  1040.             $finderStruct->set('brandCode'$page->model->getCode());
  1041.             
  1042.             if($this->settings->getConfig('showSeries')) {
  1043.                 $series $this->getEntityCollection(
  1044.                     $this->seriesRepository
  1045.                     [
  1046.                         'enabled'=>true,
  1047.                         'brandId'=>$page->model->getId()
  1048.                     ],
  1049.                     'label'
  1050.                 );
  1051.                 $finderStruct->set('series'$series);
  1052.             }
  1053.             if($this->settings->getConfig('showTypes')) {
  1054.                 $types $this->getEntityCollection(
  1055.                     $this->typeRepository
  1056.                     [
  1057.                         'enabled'=>true,
  1058.                         'brandId'=>$page->model->getId()
  1059.                     ],
  1060.                     'label'
  1061.                 );
  1062.                 $finderStruct->set('types'$types);
  1063.             }
  1064.             
  1065.             $devicesArray $this->getDevicesArray($page->model->getId(), 00false);
  1066.             //$devicesArray = $this->getDevicesArray($page->model->getId(), -1, -1, false);
  1067.             $finderStruct->set('devices'$devicesArray);
  1068.         }
  1069.         
  1070.         return $this->renderStorefront('@TopdataTopFinderProSW6/storefront/page/topfinder/list.html.twig', ['page' => $page]);
  1071.     }
  1072.     
  1073.     /**
  1074.      * @Route("/top-finder/series/{code}", name="frontend.top_finder.series", methods={"GET"})
  1075.      */
  1076.     public function listSeries(Request $requestRequestDataBag $dataSalesChannelContext $context): Response
  1077.     {
  1078.         $page $this->listPageLoader->load($request$contextListPageLoader::TYPE_SERIES);
  1079.         
  1080.         $finderStruct $page->getHeader()->getExtension('finder');
  1081.         if($finderStruct !== null) {
  1082.             $finderStruct->set('brandCode'$page->model->getBrand()->getCode());
  1083.             $finderStruct->set('seriesCode'$page->model->getCode());
  1084. //            $finderStruct->set('typeId', $device->getTypeId());
  1085. //            $finderStruct->set('deviceCode', $device->getCode());
  1086.             
  1087.             if($this->settings->getConfig('showSeries')) {
  1088.                 $series $this->getEntityCollection(
  1089.                     $this->seriesRepository
  1090.                     [
  1091.                         'enabled'=>true,
  1092.                         'brandId'=>$page->model->getBrand()->getId()
  1093.                     ],
  1094.                     'label'
  1095.                 );
  1096.                 $finderStruct->set('series'$series);
  1097.             }
  1098.             if($this->settings->getConfig('showTypes')) {
  1099.                 $types $this->getEntityCollection(
  1100.                     $this->typeRepository
  1101.                     [
  1102.                         'enabled'=>true,
  1103.                         'brandId'=>$page->model->getBrand()->getId()
  1104.                     ],
  1105.                     'label'
  1106.                 );
  1107.                 $finderStruct->set('types'$types);
  1108.             }
  1109.             
  1110.             $devicesArray $this->getDevicesArray(
  1111.                 $page->model->getBrand()->getId(), 
  1112.                 $page->model->getId(), 
  1113.                 0
  1114.                 false);
  1115.             $finderStruct->set('devices'$devicesArray);
  1116.         }
  1117.         
  1118.         return $this->renderStorefront('@TopdataTopFinderProSW6/storefront/page/topfinder/list.html.twig', ['page' => $page]);
  1119.     }
  1120.     
  1121.     /**
  1122.      * @Route("/top-finder/type/{code}", name="frontend.top_finder.type", methods={"GET"})
  1123.      */
  1124.     public function listType(Request $requestRequestDataBag $dataSalesChannelContext $context): Response
  1125.     {
  1126.         $page $this->listPageLoader->load($request$contextListPageLoader::TYPE_TYPE);
  1127.         $finderStruct $page->getHeader()->getExtension('finder');
  1128.         if($finderStruct !== null) {
  1129.             $finderStruct->set('brandCode'$page->model->getBrand()->getCode());
  1130. //            $finderStruct->set('seriesId', $page->model->getId());
  1131.             $finderStruct->set('typeCode'$page->model->getCode());
  1132. //            $finderStruct->set('deviceCode', $device->getCode());
  1133.             
  1134.             if($this->settings->getConfig('showSeries')) {
  1135.                 $series $this->getEntityCollection(
  1136.                     $this->seriesRepository
  1137.                     [
  1138.                         'enabled'=>true,
  1139.                         'brandId'=>$page->model->getBrand()->getId()
  1140.                     ],
  1141.                     'label'
  1142.                 );
  1143.                 $finderStruct->set('series'$series);
  1144.             }
  1145.             if($this->settings->getConfig('showTypes')) {
  1146.                 $types $this->getEntityCollection(
  1147.                     $this->typeRepository
  1148.                     [
  1149.                         'enabled'=>true,
  1150.                         'brandId'=>$page->model->getBrand()->getId()
  1151.                     ],
  1152.                     'label'
  1153.                 );
  1154.                 $finderStruct->set('types'$types);
  1155.             }
  1156.             
  1157.             $devicesArray $this->getDevicesArray(
  1158.                 $page->model->getBrand()->getId(), 
  1159.                 0
  1160.                 $page->model->getId(), 
  1161.                 false);
  1162.             $finderStruct->set('devices'$devicesArray);
  1163.         }
  1164.         return $this->renderStorefront('@TopdataTopFinderProSW6/storefront/page/topfinder/list.html.twig', ['page' => $page]);
  1165.     }
  1166.     
  1167.     /**
  1168.      * @Route("/top-finder/compatible-devices/{productid}", name="frontend.top_finder.compatible_devices", methods={"GET", "POST"}, defaults={"productid"="", "XmlHttpRequest"=true})
  1169.      */
  1170.     public function compatibleDevices(string $productidRequest $requestSalesChannelContext $salesChannelContext): JsonResponse
  1171.     {
  1172.         if (!$productid) {
  1173.             return new JsonResponse(['success' => false'text' => 'Something went wrong']);
  1174.         }
  1175.         
  1176.         $result = ['success' => true];
  1177.         $page $this->compatibleDevicesWidgetLoader->load($request$salesChannelContext$productid);
  1178.         $result['html'] = $this->renderStorefront('@TopdataTopFinderProSW6/storefront/widget/compatible-devices/index.html.twig', [
  1179.                 'page' => $page
  1180.             ])->getContent();
  1181.         $result['title'] = $page->product->getName() . ' ' $this->trans('topdata-topfinder.productDevices');
  1182.         
  1183.         if($result) {
  1184.             return new JsonResponse($result);
  1185.         }
  1186.     }
  1187.     
  1188.     /**
  1189.      * @Route("/top-finder/popupForm", name="frontend.top_finder.popup_form", methods={"GET", "POST"}, defaults={"XmlHttpRequest"=true})
  1190.      */
  1191.     public function popupForm(Request $requestSalesChannelContext $salesChannelContext): Response
  1192.     {
  1193.         $page $this->popupFormWidgetLoader->load($request$salesChannelContext);
  1194.         $response =  $this->renderStorefront('@TopdataTopFinderProSW6/storefront/widget/popup-form/index.html.twig', ['page' => $page]);
  1195.         $response->headers->set("X-Robots-Tag""noindex, nofollow");
  1196.         return $response;
  1197.     }
  1198.     
  1199.     /**
  1200.      * @Route("/top-finder/get-popup-device", name="frontend.top_finder.popup_device", methods={"GET", "POST"}, defaults={"XmlHttpRequest"=true})
  1201.      */
  1202.     public function popupDevice(Request $requestSalesChannelContext $salesChannelContext): Response
  1203.     {
  1204.         $page $this->popupDeviceWidgetLoader->load($request$salesChannelContext);
  1205.         $response $this->renderStorefront('@TopdataTopFinderProSW6/storefront/widget/popup-device/index.html.twig', ['page' => $page]);
  1206.         $response->headers->set("X-Robots-Tag""noindex, nofollow");
  1207.         return $response;
  1208.     }
  1209.     
  1210.     /**
  1211.      * @Route("/top-finder/letter/{letter}", name="frontend.top_finder.letter", methods={"GET"})
  1212.      */
  1213.     public function listLetter(Request $requestSalesChannelContext $salesChanelContext): Response
  1214.     {
  1215.         $letter $request->get('letter');
  1216.         if(!preg_match('/^[a-z0]{1}$/'$letter)) {
  1217.             throw new MissingRequestParameterException('letter''/letter');
  1218.         }
  1219.         
  1220.         $page $this->brandLetterPageLoader->load($request$salesChanelContext$letter);
  1221.         return $this->renderStorefront('@TopdataTopFinderProSW6/storefront/page/topfinder/brand-letter.html.twig', ['page' => $page]);
  1222.     }
  1223.     
  1224.     /**
  1225.      * @Route("/top-finder/letter-brand/{brandCode}", name="frontend.top_finder.letter-brand", methods={"GET"})
  1226.      */
  1227.     public function listLetterBrand(Request $requestSalesChannelContext $salesChanelContext): Response
  1228.     {
  1229.         $brandCode $request->get('brandCode');
  1230.         if(!preg_match('/^[a-z0-9_-]+$/'$brandCode)) {
  1231.             throw new MissingRequestParameterException('brandCode''/brandCode');
  1232.         }
  1233.         
  1234.         $page $this->oneBrandLetterPageLoader->load($request$salesChanelContext$brandCode);
  1235.         return $this->renderStorefront('@TopdataTopFinderProSW6/storefront/page/topfinder/one-brand-letter.html.twig', ['page' => $page]);
  1236.     }
  1237.     
  1238.     /**
  1239.      * @Route("/top-finder/history-remove/{deviceId}", name="frontend.top_finder.history-remove", methods={"GET"})
  1240.      */
  1241.     public function historyRemove(Request $requestSalesChannelContext $salesChanelContext): Response
  1242.     {
  1243.         $deviceId $request->get('deviceId');
  1244.         if(!EntitiesHelper::isValidUuid($deviceId)) {
  1245.             throw new MissingRequestParameterException('deviceId');
  1246.         }
  1247.         
  1248.         $referer $request->headers->get('referer'); 
  1249.         
  1250.         $cokie $request->cookies->get(Helper::COOKIE_DEVICE_HISTORY);
  1251.         $devicesHistory = [];
  1252.         if($cokie) {
  1253.             $devicesHistory explode(','$cokie);
  1254.         }
  1255.         if(!is_array($devicesHistory)) {
  1256.             $devicesHistory = [];
  1257.         }
  1258.         $historyKey array_search($deviceId$devicesHistory);
  1259.         if($historyKey !== false) {
  1260.             unset($devicesHistory[$historyKey]);
  1261.         }
  1262.         
  1263.         if(!$referer) {
  1264.             $referer '/';
  1265.         }
  1266.         
  1267.         $response = new RedirectResponse($referer);
  1268.         
  1269.         $response->headers->setCookie(
  1270.             Cookie::create(
  1271.                 Helper::COOKIE_DEVICE_HISTORY,
  1272.                 implode(','$devicesHistory),
  1273.                 time() + 3600*24*30
  1274.             )
  1275.         );
  1276.         
  1277.         return $response;
  1278.     }
  1279.     
  1280.     /**
  1281.      * @Route("/top-finder/popup-device-info/{deviceId}", name="frontend.top_finder.popup_device_info", methods={"GET", "POST"}, defaults={"XmlHttpRequest"=true})
  1282.      */
  1283.     public function popupDeviceInfo(Request $requestSalesChannelContext $salesChannelContext): Response
  1284.     {
  1285.         $deviceId $request->get('deviceId');
  1286.         
  1287.         if(!EntitiesHelper::isValidUuid($deviceId)) {
  1288.             throw new MissingRequestParameterException('deviceId');
  1289.         }
  1290.         
  1291.         if(!$salesChannelContext->getCustomer() || $salesChannelContext->getCustomer()->getGuest()) {
  1292.             throw new MissingRequestParameterException('userId');
  1293.         }
  1294.         
  1295.         $userId $salesChannelContext->getCustomer()->getId();
  1296.         
  1297.         
  1298.         $page $this->popupDeviceInfoWidgetLoader->load($request$salesChannelContext$deviceId$userId);
  1299.         $response $this->renderStorefront('@TopdataTopFinderProSW6/storefront/widget/popup-device-info/index.html.twig', ['page' => $page]);
  1300.         $response->headers->set("X-Robots-Tag""noindex, nofollow");
  1301.         return $response;
  1302.     }
  1303.     
  1304.     /**
  1305.      * @Route("/top-finder/device-info-update", name="frontend.top_finder.device_info_update", methods={"GET", "POST"}, defaults={"XmlHttpRequest"=true})
  1306.      */
  1307.     public function popupDeviceInfoUpdate(Request $requestSalesChannelContext $salesChannelContext): JsonResponse
  1308.     {
  1309.         $deviceId $request->get('deviceId');
  1310.         
  1311.         if(!EntitiesHelper::isValidUuid($deviceId)) {
  1312.             return new JsonResponse(['success' => false$deviceId.' invalid']);
  1313.         }
  1314.         
  1315.         if(!$salesChannelContext->getCustomer() || $salesChannelContext->getCustomer()->getGuest()) {
  1316.             return new JsonResponse(['success' => false'no customer']);
  1317.         }
  1318.         
  1319.         $userId $salesChannelContext->getCustomer()->getId();
  1320.         $data $request->get('formData');
  1321.         
  1322.         $connection $this->container->get('Doctrine\DBAL\Connection');
  1323.         $deviceToCustomerId Helper::deviceToCustomerId(
  1324.                 $deviceId
  1325.                 $userId
  1326.                 $connection
  1327.             );
  1328.         
  1329.         if(!$deviceToCustomerId) {
  1330.             return new JsonResponse(['success' => false'no device to customer']);
  1331.         }
  1332.         
  1333.         $this->deviceCustomerRepository->update([
  1334.             [
  1335.                 'id' => $deviceToCustomerId,
  1336.                 'extraInfo' => json_encode($data)
  1337.             ]
  1338.         ], $salesChannelContext->getContext());
  1339.         
  1340.         return new JsonResponse([
  1341.             'success' => true
  1342.         ]);
  1343.     }
  1344.     
  1345.     /**
  1346.      * @Route("/top-finder/devicelist-find", name="frontend.top_finder.devicelist-find", methods={"GET"}, defaults={"XmlHttpRequest"=true})
  1347.      *
  1348.      * @throws CustomerNotLoggedInException
  1349.      */
  1350.     public function deviceListFind(Request $requestSalesChannelContext $context): Response
  1351.     {
  1352.         $page $this->deviceListPageLoader->load($request$context);
  1353.         
  1354.         $response $this->renderStorefront('@TopdataTopFinderProSW6/storefront/page/account/device-list-find.html.twig', ['page' => $page]);
  1355.         $response->headers->set("X-Robots-Tag""noindex, nofollow");
  1356.         return $response;
  1357.     }
  1358.     
  1359.     /**
  1360.      * @Route("/top-finder/list-products", name="frontend.top_finder.list-products", methods={"GET"})
  1361.      */
  1362.     public function listProducts(Request $requestSalesChannelContext $salesChanelContext): Response
  1363.     {
  1364.         $productIds explode('-'$request->get('ids'));
  1365.         
  1366.         foreach ($productIds as $key=>$id) {
  1367.             if(Uuid::isValid((string)$id) === false) {
  1368.                 unset($productIds[$key]);
  1369.             }
  1370.         }
  1371.         if(!count($productIds)) {
  1372.             throw new MissingRequestParameterException('ids');
  1373.         }
  1374.         
  1375.         $page $this->listProductsLoader->load($request$salesChanelContext$productIds);
  1376.         return $this->renderStorefront('@TopdataTopFinderProSW6/storefront/page/topfinder/list-products.html.twig', ['page' => $page]);
  1377.     }
  1378.     
  1379.     /**
  1380.      * @Route("/top-finder/get-popup-device-new", name="frontend.top_finder.popup_device_new", methods={"GET", "POST"}, defaults={"XmlHttpRequest"=true})
  1381.      */
  1382.     public function popupDeviceNew(Request $requestSalesChannelContext $salesChannelContext): JsonResponse
  1383.     {
  1384.         $page $this
  1385.             ->popupDeviceWidgetLoader
  1386.             ->loadNew($request$salesChannelContext);
  1387.         
  1388.         $result = ['success' => true];
  1389.         
  1390.         $result['deviceId'] = $page->device->getId();
  1391.         $result['deviceUrl'] = $page->deviceUrl;
  1392.         $result['inDeviceList'] = $page->device->getInDeviceList();
  1393.         $result['userLogged'] = $page->other['userLogged'];
  1394.         if($result['userLogged']) {
  1395.             $result['pathListAdd'] = $page->other['pathListAdd'];
  1396.             $result['pathListRemove'] = $page->other['pathListRemove'];
  1397.         }
  1398.         
  1399. //        $devices = $this->getDevicesArray(
  1400. //            $page->device->getBrand()->getId(),
  1401. //            $page->device->getSeries() ? $page->device->getSeries()->getId() : 0, 
  1402. //            0
  1403. //            //$page->device->getType() ? $page->device->getType()->getId() : false
  1404. //        );
  1405. //        
  1406. //        $series = $this->getSeriesArray($page->device->getBrand()->getId());
  1407. //        $types = $this->getTypesArray($page->device->getBrand()->getId());
  1408.         
  1409.         
  1410. //        $popupHome = [
  1411. //            'brandskey' => $page->device->getBrand()->getCode(),
  1412. //            'series' => $series,
  1413. //            'serieskey' => $page->device->getSeries() ? $page->device->getSeries()->getCode() : null,
  1414. //            'types' => $types,
  1415. //            'typeskey' => $page->device->getType() ? $page->device->getType()->getCode() : null,
  1416. //            'devices' => $devices,
  1417. //            'deviceskey' => $page->device->getCode()
  1418. //        ];
  1419. //        
  1420. //        $result['popupHome'] = $popupHome;
  1421.         
  1422.         $connection $this->container->get('Doctrine\DBAL\Connection');
  1423.         $devicelist Helper::getDeviceListInfo($salesChannelContext$connection);
  1424.         
  1425.         $result['html'] = $this
  1426.             ->renderStorefront(
  1427.                 '@TopdataTopFinderProSW6/storefront/widget/popup-form/box-device.html.twig'
  1428.                 [
  1429.                     'page' => $page,
  1430.                     'devicelist' => $devicelist
  1431.                 ]
  1432.             )
  1433.             ->getContent();
  1434.         
  1435.         $response = new JsonResponse($result);
  1436.         $response->headers->set("X-Robots-Tag""noindex, nofollow");
  1437.         return $response;
  1438.     }
  1439.     
  1440.     
  1441.     /**
  1442.      * @Route("/top-finder/popup-letter/{letter}", name="frontend.top_finder.popup_letter", methods={"GET"}, defaults={"XmlHttpRequest"=true})
  1443.      */
  1444.     public function listPopupLetter(Request $requestSalesChannelContext $salesChanelContext): JsonResponse
  1445.     {
  1446.         $letter $request->get('letter');
  1447.         if(!preg_match('/^[a-z0]{1}$/'$letter)) {
  1448.             throw new MissingRequestParameterException('letter''/letter');
  1449.         }
  1450.         
  1451.         $page $this->brandLetterPageLoader->loadJson($request$salesChanelContext$letter);
  1452.         $result = [];
  1453.         $result['success'] = true;
  1454.         $result['html'] = $this
  1455.             ->renderStorefront(
  1456.                 '@TopdataTopFinderProSW6/storefront/widget/popup-form/brand-letter.html.twig'
  1457.                 ['page' => $page]
  1458.             )
  1459.             ->getContent();
  1460.         
  1461.         $response = new JsonResponse($result);
  1462.         $response->headers->set("X-Robots-Tag""noindex, nofollow");
  1463.         return $response;
  1464.     }
  1465.     
  1466.     /**
  1467.      * @Route("/top-finder/popup-all-brands", name="frontend.top_finder.popup_all_brands", methods={"GET"}, defaults={"XmlHttpRequest"=true})
  1468.      */
  1469.     public function listPopupAllBrands(Request $requestSalesChannelContext $salesChanelContext): JsonResponse
  1470.     {
  1471.         $page $this->listPageLoader->loadJsonBrands($request$salesChanelContext);
  1472.         //return $this->renderStorefront('@TopdataTopFinderProSW6/storefront/page/topfinder/list.html.twig', ['page' => $page]);
  1473. //        $page = $this->brandLetterPageLoader->loadJson($request, $salesChanelContext, $letter);
  1474.         $result = [];
  1475.         $result['success'] = true;
  1476.         $result['html'] = $this
  1477.             ->renderStorefront(
  1478.                 '@TopdataTopFinderProSW6/storefront/widget/popup-form/all-brands.html.twig'
  1479.                 ['page' => $page]
  1480.             )
  1481.             ->getContent();
  1482.         
  1483.         $response = new JsonResponse($result);
  1484.         $response->headers->set("X-Robots-Tag""noindex, nofollow");
  1485.         return $response;
  1486.     }
  1487.     
  1488.     /**
  1489.      * @Route("/top-finder/popup-brand/{brandCode}", name="frontend.top_finder.popup_brand", methods={"GET"}, defaults={"XmlHttpRequest"=true})
  1490.      */
  1491.     public function listPopupBrand(Request $requestSalesChannelContext $salesChanelContext)
  1492.     {
  1493.         $brandCode $request->get('brandCode');
  1494.         if(!preg_match('/^[a-z0-9_-]+$/'$brandCode)) {
  1495.             throw new MissingRequestParameterException('brandCode''/brandCode');
  1496.         }
  1497.         
  1498.         $page $this->oneBrandLetterPageLoader->loadJson(
  1499.             $request
  1500.             $salesChanelContext
  1501.             $brandCode,
  1502.             'all'
  1503.         );
  1504.         
  1505.         $offset $request->get('offset');
  1506.         $defaultOffset self::POPUP_DEVICES_PRELOAD_LENGTH;
  1507.         if($offset) {
  1508.             $response $this
  1509.                 ->renderStorefront(
  1510.                     '@TopdataTopFinderProSW6/storefront/widget/popup-form/_listed-devices.html.twig'
  1511.                     ['page' => $page'offset' => $offset]
  1512.                 );
  1513.         }
  1514.         else {
  1515.             $listMode $request->cookies->get('topfinder-popup-devicelist-mode');
  1516.             $response $this
  1517.                 ->renderStorefront(
  1518.                     '@TopdataTopFinderProSW6/storefront/widget/popup-form/brand-devices.html.twig'
  1519.                     [
  1520.                         'page' => $page
  1521.                         'mode'=>'all',
  1522.                         'listMode' => $listMode,
  1523.                         'offset' => $defaultOffset
  1524.                     ]
  1525.                 );
  1526.             $response->headers->set("returnPath"$this->getReturnPath($request));
  1527.             $response->headers->set("loadOffset"$defaultOffset);
  1528.         }
  1529.         
  1530. //        $response = new JsonResponse($result);
  1531.         $response->headers->set("X-Robots-Tag""noindex, nofollow");
  1532.         return $response;
  1533.     }
  1534.     
  1535.     /**
  1536.      * @Route("/top-finder/popup-brand-series/{brandCode}", name="frontend.top_finder.popup_brand_series", methods={"GET"}, defaults={"XmlHttpRequest"=true})
  1537.      */
  1538.     public function listPopupBrandSeries(Request $requestSalesChannelContext $salesChanelContext)
  1539.     {
  1540.         $brandCode $request->get('brandCode');
  1541.         if(!preg_match('/^[a-z0-9_-]+$/'$brandCode)) {
  1542.             throw new MissingRequestParameterException('brandCode''/brandCode');
  1543.         }
  1544.         
  1545.         $page $this->oneBrandLetterPageLoader->loadJson(
  1546.             $request
  1547.             $salesChanelContext
  1548.             $brandCode,
  1549.             'series'
  1550.         );
  1551.         
  1552.         $listMode $request->cookies->get('topfinder-popup-devicelist-mode');        
  1553.         $offset $request->get('offset');
  1554.         $defaultOffset self::POPUP_DEVICES_PRELOAD_LENGTH;
  1555.         if($offset) {
  1556.             $response $this
  1557.                 ->renderStorefront(
  1558.                     '@TopdataTopFinderProSW6/storefront/widget/popup-form/_listed-series-devices.html.twig'
  1559.                     ['page' => $page'offset' => $offset'hideMenuSeries'=>true]
  1560.                 );
  1561.         }
  1562.         else {
  1563.             $response $this
  1564.                 ->renderStorefront(
  1565.                     '@TopdataTopFinderProSW6/storefront/widget/popup-form/brand-devices.html.twig'
  1566.                     [
  1567.                         'page' => $page
  1568.                         'mode'=>'series',
  1569.                         'listMode' => $listMode,
  1570.                         'offset' => $defaultOffset
  1571.                         'hideMenuSeries'=>true
  1572.                     ]
  1573.                 );
  1574.             $response->headers->set("returnPath"$this->getReturnPath($request));
  1575.             $response->headers->set("loadOffset"$defaultOffset);
  1576.         }
  1577.         
  1578.         $response->headers->set("X-Robots-Tag""noindex, nofollow");
  1579.         return $response;
  1580.     }
  1581.     
  1582.     /**
  1583.      * @Route("/top-finder/popup-brand-types/{brandCode}", name="frontend.top_finder.popup_brand_types", methods={"GET"}, defaults={"XmlHttpRequest"=true})
  1584.      */
  1585.     public function listPopupBrandTypes(Request $requestSalesChannelContext $salesChanelContext)
  1586.     {
  1587.         $brandCode $request->get('brandCode');
  1588.         if(!preg_match('/^[a-z0-9_-]+$/'$brandCode)) {
  1589.             throw new MissingRequestParameterException('brandCode''/brandCode');
  1590.         }
  1591.         
  1592.         $page $this->oneBrandLetterPageLoader->loadJson(
  1593.             $request
  1594.             $salesChanelContext
  1595.             $brandCode,
  1596.             'types'
  1597.         );
  1598.         
  1599.         $listMode $request->cookies->get('topfinder-popup-devicelist-mode');        
  1600.         $offset $request->get('offset');
  1601.         $defaultOffset self::POPUP_DEVICES_PRELOAD_LENGTH;
  1602.         if($offset) {
  1603.             $response $this
  1604.                 ->renderStorefront(
  1605.                     '@TopdataTopFinderProSW6/storefront/widget/popup-form/_listed-types-devices.html.twig'
  1606.                     ['page' => $page'offset' => $offset]
  1607.                 );
  1608.         }
  1609.         else {
  1610.             $response $this
  1611.                 ->renderStorefront(
  1612.                     '@TopdataTopFinderProSW6/storefront/widget/popup-form/brand-devices.html.twig'
  1613.                     [
  1614.                         'page' => $page
  1615.                         'mode'=>'types',
  1616.                         'listMode' => $listMode,
  1617.                         'offset' => $defaultOffset
  1618.                     ]
  1619.                 );
  1620.             
  1621.             $response->headers->set("returnPath"$this->getReturnPath($request));
  1622.             $response->headers->set("loadOffset"$defaultOffset);
  1623.         }
  1624.         
  1625.         $response->headers->set("X-Robots-Tag""noindex, nofollow");
  1626.         return $response;
  1627.     }
  1628.     
  1629.     
  1630.     /**
  1631.      * @Route("/top-finder/popup-brandq/{code}", name="frontend.top_finder.popup_brandq", methods={"GET"}, defaults={"XmlHttpRequest"=true})
  1632.      */
  1633.     public function listPopupBrandDevices(Request $requestSalesChannelContext $salesChanelContext): JsonResponse
  1634.     {
  1635.         $code $request->get('code');
  1636.         if(!preg_match('/^[a-z0-9_-]+$/'$code)) {
  1637.             throw new MissingRequestParameterException('code''/code');
  1638.         }
  1639.         
  1640. //        $page = $this->listPageLoader->loadBrandDevicesJson($request, $salesChanelContext);
  1641.         
  1642.         $page $this->oneBrandLetterPageLoader->loadJson(
  1643.             $request
  1644.             $salesChanelContext
  1645.             $code,
  1646.             'all'
  1647.         );
  1648.         
  1649.         $listMode $request->cookies->get('topfinder-popup-devicelist-mode');
  1650.         
  1651.         $result = [];
  1652.         $result['success'] = true;
  1653.         $result['returnPath'] = $this->getReturnPath($request);
  1654.         
  1655.         $result['html'] = $this
  1656.             ->renderStorefront(
  1657.                 '@TopdataTopFinderProSW6/storefront/widget/popup-form/brand-devices.html.twig'
  1658.                 ['page' => $page'mode'=>'all''listMode' => $listMode]
  1659.             )
  1660.             ->getContent();
  1661.         
  1662.         $response = new JsonResponse($result);
  1663.         $response->headers->set("X-Robots-Tag""noindex, nofollow");
  1664.         return $response;
  1665.     }
  1666.     
  1667.     /**
  1668.      * @Route("/top-finder/popup-series/{code}", name="frontend.top_finder.popup_series", methods={"GET"}, defaults={"XmlHttpRequest"=true})
  1669.      */
  1670.     public function listPopupSerieDevices(Request $requestSalesChannelContext $salesChanelContext): JsonResponse
  1671.     {
  1672.         $code $request->get('code');
  1673.         if(!preg_match('/^[a-z0-9_-]+$/'$code)) {
  1674.             throw new MissingRequestParameterException('code''/code');
  1675.         }
  1676.         $page $this->listPageLoader->loadSerieDevicesJson($request$salesChanelContext);
  1677.         
  1678.         $listMode $request->cookies->get('topfinder-popup-devicelist-mode');
  1679.         
  1680.         $result = [];
  1681.         $result['success'] = true;
  1682.         $result['returnPath'] = $this->getReturnPath($request);
  1683.         $result['html'] = $this
  1684.             ->renderStorefront(
  1685.                 '@TopdataTopFinderProSW6/storefront/widget/popup-form/devices.html.twig'
  1686.                 ['page' => $page'listMode' => $listMode'hideMenuSeries' => true]
  1687.             )
  1688.             ->getContent();
  1689.         
  1690.         $response = new JsonResponse($result);
  1691.         $response->headers->set("X-Robots-Tag""noindex, nofollow");
  1692.         return $response;
  1693.     }
  1694.     
  1695.     /**
  1696.      * @Route("/top-finder/popup-type/{code}", name="frontend.top_finder.popup_type", methods={"GET"}, defaults={"XmlHttpRequest"=true})
  1697.      */
  1698.     public function listPopupTypeDevices(Request $requestSalesChannelContext $salesChanelContext): JsonResponse
  1699.     {
  1700.         $code $request->get('code');
  1701.         if(!preg_match('/^[a-z0-9_-]+$/'$code)) {
  1702.             throw new MissingRequestParameterException('code''/code');
  1703.         }
  1704.         $page $this->listPageLoader->loadTypeDevicesJson($request$salesChanelContext);
  1705.         
  1706.         $listMode $request->cookies->get('topfinder-popup-devicelist-mode');
  1707.         
  1708.         $result = [];
  1709.         $result['success'] = true;
  1710.         $result['returnPath'] = $this->getReturnPath($request);
  1711.         $result['html'] = $this
  1712.             ->renderStorefront(
  1713.                 '@TopdataTopFinderProSW6/storefront/widget/popup-form/devices.html.twig'
  1714.                 ['page' => $page'listMode' => $listMode]
  1715.             )
  1716.             ->getContent();
  1717.         
  1718.         $response = new JsonResponse($result);
  1719.         $response->headers->set("X-Robots-Tag""noindex, nofollow");
  1720.         return $response;
  1721.     }
  1722.     
  1723.     /**
  1724.      * @Route("/top-finder/popup-devicelist", name="frontend.top_finder.popup_devicelist", methods={"GET"}, defaults={"XmlHttpRequest"=true})
  1725.      */
  1726.     public function popupDeviceList(Request $requestSalesChannelContext $context): JsonResponse
  1727.     {
  1728.         $page $this->deviceListPageLoader->loadJson($request$context);
  1729.         $listMode $request->cookies->get('topfinder-popup-devicelist-mode');
  1730.         $result = [];
  1731.         $result['success'] = true;
  1732.         $result['returnPath'] = $this->getReturnPath($request);
  1733.         $result['html'] = $this
  1734.             ->renderStorefront(
  1735.                 '@TopdataTopFinderProSW6/storefront/widget/popup-form/devicelist/index.html.twig'
  1736.                 ['page' => $page'listMode' => $listMode]
  1737.             )
  1738.             ->getContent();
  1739.         
  1740.         $response = new JsonResponse($result);
  1741.         $response->headers->set("X-Robots-Tag""noindex, nofollow");
  1742.         return $response;
  1743.     }
  1744.     
  1745.     /**
  1746.      * @Route("/top-finder/popup-devicelist-device", name="frontend.top_finder.popup_devicelist_device", methods={"GET"}, defaults={"XmlHttpRequest"=true})
  1747.      */
  1748.     public function popupDeviceListDevice(Request $requestSalesChannelContext $context): JsonResponse
  1749.     {
  1750.         $id $request->get('id');
  1751.         
  1752.         if(false === Uuid::isValid($id)) {
  1753.             return new JsonResponse(['success'=>false]);
  1754.         }
  1755.         
  1756.         $page $this->deviceListPageLoader->loadDeviceJson($request$context);
  1757.         
  1758.         if(is_null($page->device)) {
  1759.             return new JsonResponse(['success'=>false]);
  1760.         }
  1761.         
  1762.         $result = [];
  1763.         $result['success'] = true;
  1764.         $result['returnPath'] = $this->getReturnPath($request);
  1765.         $result['html'] = $this
  1766.             ->renderStorefront(
  1767.                 '@TopdataTopFinderProSW6/storefront/widget/popup-form/devicelist/device.html.twig'
  1768.                 ['page' => $page]
  1769.             )
  1770.             ->getContent();
  1771.         
  1772.         $response = new JsonResponse($result);
  1773.         $response->headers->set("X-Robots-Tag""noindex, nofollow");
  1774.         return $response;
  1775.     }
  1776.     
  1777.     /**
  1778.      * @Route("/top-finder/popup-devicelist-subdevice-add", name="frontend.top_finder.popup_devicelist_subdevice_add", methods={"GET"}, defaults={"XmlHttpRequest"=true})
  1779.      */
  1780.     public function popupDeviceListDeviceSubdeviceAdd(Request $requestSalesChannelContext $context): JsonResponse
  1781.     {
  1782.         $id $request->get('id');
  1783.         
  1784.         if(false === Uuid::isValid($id)) {
  1785.             return new JsonResponse(['success'=>false]);
  1786.         }
  1787.         
  1788.         $page $this->deviceListPageLoader->loadAddSubdeviceJson($request$context);
  1789.         
  1790.         if(is_null($page->device)) {
  1791.             return new JsonResponse(['success'=>false]);
  1792.         }
  1793.         
  1794.         $result = [];
  1795.         $result['success'] = true;
  1796.         $result['returnPath'] = $this->getReturnPath($request);
  1797.         $result['html'] = $this
  1798.             ->renderStorefront(
  1799.                 '@TopdataTopFinderProSW6/storefront/widget/popup-form/devicelist/subdevice-add.html.twig'
  1800.                 ['page' => $page]
  1801.             )
  1802.             ->getContent();
  1803.         
  1804.         $response = new JsonResponse($result);
  1805.         $response->headers->set("X-Robots-Tag""noindex, nofollow");
  1806.         return $response;
  1807.     }
  1808.     
  1809.     /**
  1810.      * @Route("/top-finder/popup-devicelist-subdevice-add-confirmed", name="frontend.top_finder.popup_devicelist_subdevice_add_confirmed", methods={"POST"}, defaults={"XmlHttpRequest"=true})
  1811.      */
  1812.     public function popupDeviceListDeviceSubdeviceAddConfirmed(Request $requestSalesChannelContext $context): JsonResponse
  1813.     {
  1814.         $id $request->get('id');
  1815.         
  1816.         if(false === Uuid::isValid($id)) {
  1817.             return new JsonResponse(['success'=>false]);
  1818.         }
  1819.         
  1820.         $page $this->deviceListPageLoader->addSubdeviceJson($request$context);
  1821.         
  1822.         if(is_null($page->device)) {
  1823.             return new JsonResponse(['success'=>false]);
  1824.         }
  1825.         
  1826.         $result = [];
  1827.         $result['success'] = true;
  1828.         $result['html'] = $this
  1829.             ->renderStorefront(
  1830.                 '@TopdataTopFinderProSW6/storefront/widget/popup-form/devicelist/device.html.twig'
  1831.                 ['page' => $page]
  1832.             )
  1833.             ->getContent();
  1834.         
  1835.         $response = new JsonResponse($result);
  1836.         $response->headers->set("X-Robots-Tag""noindex, nofollow");
  1837.         return $response;
  1838.     }
  1839.     
  1840.     
  1841.     /**
  1842.      * @Route("/top-finder/popup-devicelist-subdevice-edit", name="frontend.top_finder.popup_devicelist_subdevice_edit", methods={"GET"}, defaults={"XmlHttpRequest"=true})
  1843.      */
  1844.     public function popupDeviceListDeviceSubdeviceEdit(Request $requestSalesChannelContext $context): JsonResponse
  1845.     {
  1846.         $id $request->get('id');
  1847.         
  1848.         if(false === Uuid::isValid($id)) {
  1849.             return new JsonResponse(['success'=>false]);
  1850.         }
  1851.         
  1852.         $page $this->deviceListPageLoader->loadEditSubdeviceJson($request$context);
  1853.         
  1854.         if(is_null($page->device)) {
  1855.             return new JsonResponse(['success'=>false]);
  1856.         }
  1857.         
  1858.         $result = [];
  1859.         $result['success'] = true;
  1860.         $result['returnPath'] = $this->getReturnPath($request);
  1861.         $result['html'] = $this
  1862.             ->renderStorefront(
  1863.                 '@TopdataTopFinderProSW6/storefront/widget/popup-form/devicelist/subdevice-edit.html.twig'
  1864.                 ['page' => $page]
  1865.             )
  1866.             ->getContent();
  1867.         
  1868.         $response = new JsonResponse($result);
  1869.         $response->headers->set("X-Robots-Tag""noindex, nofollow");
  1870.         return $response;
  1871.     }
  1872.     
  1873.     /**
  1874.      * @Route("/top-finder/popup-devicelist-subdevice-edit-confirmed", name="frontend.top_finder.popup_devicelist_subdevice_edit_confirmed", methods={"POST"}, defaults={"XmlHttpRequest"=true})
  1875.      */
  1876.     public function popupDeviceListDeviceSubdeviceEditConfirmed(Request $requestSalesChannelContext $context): JsonResponse
  1877.     {
  1878.         $id $request->get('id');
  1879.         
  1880.         if(false === Uuid::isValid($id)) {
  1881.             return new JsonResponse(['success'=>false]);
  1882.         }
  1883.         
  1884.         $page $this->deviceListPageLoader->editSubdeviceJson($request$context);
  1885.         
  1886.         if(is_null($page->device)) {
  1887.             return new JsonResponse(['success'=>false]);
  1888.         }
  1889.         
  1890.         $result = [];
  1891.         $result['success'] = true;
  1892.         $result['html'] = $this
  1893.             ->renderStorefront(
  1894. //                '@TopdataTopFinderProSW6/storefront/widget/popup-form/devicelist/device.html.twig', 
  1895.                 '@TopdataTopFinderProSW6/storefront/widget/popup-form/devicelist/subdevice-edit.html.twig'
  1896.                 ['page' => $page]
  1897.             )
  1898.             ->getContent();
  1899.         
  1900.         $response = new JsonResponse($result);
  1901.         $response->headers->set("X-Robots-Tag""noindex, nofollow");
  1902.         return $response;
  1903.     }
  1904.     
  1905.     
  1906.     /**
  1907.      * @Route("/top-finder/popup-devicelist-subdevice-remove", name="frontend.top_finder.popup_devicelist_subdevice_remove", methods={"GET"}, defaults={"XmlHttpRequest"=true})
  1908.      */
  1909.     public function popupDeviceListDeviceSubdeviceRemove(Request $requestSalesChannelContext $context): JsonResponse
  1910.     {
  1911.         $id $request->get('id');
  1912.         
  1913.         if(false === Uuid::isValid($id)) {
  1914.             return new JsonResponse(['success'=>false]);
  1915.         }
  1916.         
  1917.         $page $this->deviceListPageLoader->removeSubdeviceJson($request$context);
  1918.         
  1919. //        if(is_null($page->device)) {
  1920. //            return new JsonResponse(['success'=>false]);
  1921. //        }
  1922.         
  1923.         $result = [];
  1924.         $result['success'] = true;
  1925.         if($page->fallBack) {
  1926.             $result['html'] = $this
  1927.                 ->renderStorefront(
  1928.                     '@TopdataTopFinderProSW6/storefront/widget/popup-form/devicelist/index.html.twig'
  1929.                     ['page' => $page]
  1930.                 )
  1931.                 ->getContent();
  1932.         }
  1933.         else {
  1934.             $result['html'] = $this
  1935.                 ->renderStorefront(
  1936.                     '@TopdataTopFinderProSW6/storefront/widget/popup-form/devicelist/device.html.twig'
  1937.                     ['page' => $page]
  1938.                 )
  1939.                 ->getContent();
  1940.         }
  1941.         
  1942.         $response = new JsonResponse($result);
  1943.         $response->headers->set("X-Robots-Tag""noindex, nofollow");
  1944.         return $response;
  1945.     }
  1946.     
  1947.     
  1948.     private function getReturnPath($request)
  1949.     {
  1950.         $return $request->getPathInfo();
  1951.         if($request->getQueryString()) {
  1952.             $return .= '?'.$request->getQueryString();
  1953.         }
  1954.         return $return;
  1955.     }
  1956.     
  1957.     
  1958.     /**
  1959.      * @Route("/top-finder/popup-history", name="frontend.top_finder.popup_history", methods={"GET"}, defaults={"XmlHttpRequest"=true})
  1960.      */
  1961.     public function listPopupHistory(Request $requestSalesChannelContext $salesChanelContext): JsonResponse
  1962.     {
  1963.         $page $this->listPageLoader->loadHistoryDevicesJson($request$salesChanelContext);
  1964.         
  1965.         $listMode $request->cookies->get('topfinder-popup-devicelist-mode');
  1966.         
  1967.         $result = [];
  1968.         $result['success'] = true;
  1969.         $result['returnPath'] = $this->getReturnPath($request);
  1970.         $result['html'] = $this
  1971.             ->renderStorefront(
  1972.                 '@TopdataTopFinderProSW6/storefront/widget/popup-form/devices.html.twig'
  1973.                 ['page' => $page'listMode' => $listMode]
  1974.             )
  1975.             ->getContent();
  1976.         
  1977.         $response = new JsonResponse($result);
  1978.         $response->headers->set("X-Robots-Tag""noindex, nofollow");
  1979.         return $response;
  1980.     }
  1981.     
  1982.     
  1983.     /**
  1984.      * @Route("/top-finder/popup-search", name="frontend.top_finder.popup_search", methods={"GET"}, defaults={"XmlHttpRequest"=true})
  1985.      */
  1986.     public function listPopupSearch(Request $requestSalesChannelContext $salesChanelContext)
  1987.     {
  1988.         $page $this->listPageLoader->loadSearchDevicesJson($request$salesChanelContext);
  1989.         $listMode $request->cookies->get('topfinder-popup-devicelist-mode');
  1990.         $offset $request->query->get('offset');
  1991.         $defaultOffset self::POPUP_DEVICES_PRELOAD_LENGTH;
  1992.         
  1993.         if($offset) {
  1994.             $response $this->renderStorefront(
  1995.                 '@TopdataTopFinderProSW6/storefront/widget/popup-form/_listed-devices.html.twig'
  1996.                 ['page' => $page]
  1997.             );
  1998.         }
  1999.         else {
  2000.             $response $this->renderStorefront(
  2001.                 '@TopdataTopFinderProSW6/storefront/widget/popup-form/devices.html.twig'
  2002.                 ['page' => $page'listMode' => $listMode]
  2003.             );
  2004.             $response->headers->set("loadOffset"$defaultOffset);
  2005.         }
  2006.         
  2007.         $response->headers->set("X-Robots-Tag""noindex, nofollow");
  2008.         $response->headers->set("returnPath"$this->getReturnPath($request));
  2009.         return $response;
  2010.     }
  2011.     
  2012.     /**
  2013.      * @Route("/top-finder/popup-search-suggest", name="frontend.top_finder.popup_search_suggest", methods={"GET"}, defaults={"XmlHttpRequest"=true})
  2014.      */
  2015.     public function suggestPopupSearch(Request $requestSalesChannelContext $salesChanelContext)
  2016.     {
  2017.         $page $this->listPageLoader->loadSearchDevicesJson($request$salesChanelContext);
  2018.        
  2019.         $response $this->renderStorefront(
  2020.             '@TopdataTopFinderProSW6/storefront/widget/popup-form/suggest-devices.html.twig'
  2021.             ['page' => $page]
  2022.         );
  2023.         
  2024.         $response->headers->set("X-Robots-Tag""noindex, nofollow");
  2025. //        $response->headers->set("returnPath", $this->getReturnPath($request));
  2026.         return $response;
  2027.     }
  2028. }