custom/plugins/SemesManufacturerPlus/src/Storefront/Controller/ManufacturerPlusController.php line 78

Open in your IDE?
  1. <?php declare(strict_types=1);
  2. namespace SemesManufacturerPlus\Storefront\Controller;
  3. use Shopware\Core\Framework\Routing\Annotation\RouteScope;
  4. use Shopware\Core\PlatformRequest;
  5. use Shopware\Storefront\Controller\StorefrontController;
  6. use Shopware\Storefront\Page\GenericPageLoader;
  7. use Shopware\Core\Content\Cms\DataResolver\ResolverContext\EntityResolverContext;
  8. use Shopware\Core\Content\Product\Aggregate\ProductManufacturer\ProductManufacturerDefinition;
  9. use Shopware\Core\Framework\Context;
  10. use Symfony\Component\HttpFoundation\Request;
  11. use Symfony\Component\HttpFoundation\Response;
  12. use Symfony\Component\Routing\Annotation\Route;
  13. use SemesManufacturerPlus\Service\ConfigService;
  14. use SemesManufacturerPlus\Service\UrlService;
  15. use SemesManufacturerPlus\Service\CmsPageService;
  16. use SemesManufacturerPlus\Service\ManufacturerService;
  17. use SemesManufacturerPlus\Storefront\ManufacturerPlusPage;
  18. use Shopware\Core\Content\Cms\SalesChannel\AbstractCmsRoute;
  19. use Shopware\Storefront\Page\Cms\CmsPageLoadedHook;
  20. use Shopware\Core\Content\Cms\Exception\PageNotFoundException;
  21. use Shopware\Core\Framework\DataAbstractionLayer\Search\Criteria;
  22. use Shopware\Core\Framework\Routing\Exception\MissingRequestParameterException;
  23. use Shopware\Core\System\SalesChannel\SalesChannelContext;
  24. use Symfony\Component\HttpFoundation\JsonResponse;
  25. use Symfony\Component\HttpKernel\EventListener\AbstractSessionListener;
  26. // old Annotation
  27. //  * @RouteScope(scopes={"storefront"})
  28. // new Annotation
  29. //  * @Route(defaults={"_routeScope"={"storefront"}})
  30. /**
  31.  * @RouteScope(scopes={"storefront"})
  32.  */
  33. class ManufacturerPlusController extends StorefrontController
  34. {
  35.     private $configService;
  36.     private $manufacturerService;
  37.     private $genericLoader;
  38.     private $urlService;
  39.     private $cmsPageService;
  40.     private $productManufacturerDefinition;
  41.     private $cmsRoute;
  42.     public function __construct(
  43.         ConfigService $configService,
  44.         ManufacturerService $manufacturerService,
  45.         GenericPageLoader $genericLoader,
  46.         UrlService $urlService,
  47.         CmsPageService $cmsPageService,
  48.         ProductManufacturerDefinition $productManufacturerDefinition,
  49.         AbstractCmsRoute $cmsRoute
  50.     ) {
  51.         $this->configService $configService;
  52.         $this->manufacturerService $manufacturerService;
  53.         $this->genericLoader $genericLoader;
  54.         $this->urlService $urlService;
  55.         $this->cmsPageService $cmsPageService;
  56.         $this->productManufacturerDefinition $productManufacturerDefinition;
  57.         $this->cmsRoute $cmsRoute;
  58.     }
  59.    /**
  60.      * @Route("/{manufacturer?}", name="frontend.semes.manufacturer.plus.detail", methods={"GET"}, priority=-255, requirements={"manufacturer"=".+"}, defaults={"XmlHttpRequest"=true, "_routeScope"={"storefront"}})
  61.      */
  62.     public function showManufacturer(Request $requestContext $context): Response
  63.     {
  64.         $manufacturer $this->manufacturerService->getManufacturerFromUrl($request$context);
  65.         if(!$manufacturer) return $this->forwardToRoute('frontend.home.page');
  66.         $request->attributes->set('semesManufacturerId'$manufacturer->getId());
  67.         $request->attributes->set('semesManufacturer'$manufacturer);
  68.         $cmsPageId =  $this->manufacturerService->getManufacturerCmsPageId($manufacturer);
  69.         $salesChannelContext $request->attributes->get(PlatformRequest::ATTRIBUTE_SALES_CHANNEL_CONTEXT_OBJECT);
  70.         $salesChannelId     $salesChannelContext->getSalesChannel()->getId();
  71.         if ($this->configService->getDeactivated() || (!isset($cmsPageId) && !empty($cmsPageId))) {
  72.             return $this->forwardToRoute('frontend.home.page');
  73.         }
  74.         $page $this->genericLoader->load($request$salesChannelContext);
  75.         $page ManufacturerPlusPage::createFrom($page);
  76.         $cmsPage $this->cmsPageService->getCmsPage($cmsPageId$context);
  77.         // resolve slot data
  78.         $resolverContext = new EntityResolverContext($salesChannelContext$request$this->productManufacturerDefinition$manufacturer);
  79.         $this->cmsPageService->resolveSlotData($cmsPage$resolverContext);
  80.         $page->setCmsPage($cmsPage);
  81.         $breadcrumbs $this->urlService->getBreadcrumbs($manufacturer$request$context);
  82.         
  83.         $manufacturer->getExtension('manufacturerPlus')->setCanonical($this->urlService->getCanonical($manufacturer$request$context));
  84.         return $this->renderStorefront('@Storefront/storefront/page/content/index.html.twig', [
  85.             'semesManufacturer' => $manufacturer,
  86.             'page' => $page,
  87.             'cmsPage' => $cmsPage,
  88.             'breadcrumbs' => $breadcrumbs
  89.         ]);
  90.     }
  91.     /**
  92.      * Route to load the listing filters
  93.      *
  94.      * @Route("/widgets/manufacturer/{manufacturerId}/filter", name="frontend.semes.manufacturer.plus.filter", methods={"GET", "POST"}, defaults={"XmlHttpRequest"=true, "_routeScope"={"storefront"}})
  95.      */
  96.     public function filter(string $manufacturerIdRequest $requestSalesChannelContext $context): Response
  97.     {
  98.         if (!$manufacturerId) {
  99.             throw new MissingRequestParameterException('Parameter navigationId missing');
  100.         }
  101.         
  102.         $request->attributes->set('semesManufacturerId'$manufacturerId);
  103.         // Allows to fetch only aggregations over the gateway.
  104.         $request->request->set('only-aggregations'true);
  105.         // 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.
  106.         $request->request->set('reduce-aggregations'true);
  107.         $listing =  $this->manufacturerService->getManufacturerProductsListing($manufacturerId0$request$context);
  108.         $mapped = [];
  109.         foreach ($listing->getAggregations() as $aggregation) {
  110.             $mapped[$aggregation->getName()] = $aggregation;
  111.         }
  112.         $response = new JsonResponse($mapped);
  113.         $response->headers->set(AbstractSessionListener::NO_AUTO_CACHE_CONTROL_HEADER'1');
  114.         $response->headers->set('x-robots-tag''noindex');
  115.         return $response;
  116.     }
  117.     /**
  118.      * Route to load a manufacturer page which assigned to the provided navigation id.
  119.      *
  120.      * @Route("/widgets/manufacturer/{manufacturerId}/{navigationId}", name="frontend.semes.manufacturer.plus.page", methods={"GET", "POST"}, defaults={"manufacturerId"=null,"navigationId"=null, "XmlHttpRequest"=true})
  121.      */
  122.     public function manufacturer(?string $manufacturerId, ?string $navigationIdRequest $requestSalesChannelContext $salesChannelContext): Response
  123.     {
  124.         if (!$manufacturerId) {
  125.             throw new MissingRequestParameterException('Parameter manufacturerId missing');
  126.         }
  127.         $request->attributes->set('semesManufacturerId'$manufacturerId);
  128.         $manufacturer $this->manufacturerService->getManufacturerById($manufacturerId,$salesChannelContext->getContext());
  129.         
  130.         
  131.         if($navigationId) {
  132.             $cmsPageId =  $navigationId;
  133.         } else {
  134.             $cmsPageId =  $this->manufacturerService->getManufacturerCmsPageId($manufacturer);
  135.         }
  136.         
  137.         $page $this->cmsRoute->load($cmsPageId$request$salesChannelContext)->getCmsPage();
  138.         
  139.         // resolve slot data
  140.         $resolverContext = new EntityResolverContext($salesChannelContext$request$this->productManufacturerDefinition$manufacturer);
  141.         $this->cmsPageService->resolveSlotData($page$resolverContext);
  142.         
  143.         if (!$page) {
  144.             throw new PageNotFoundException('');
  145.         }
  146.         // $this->hook(new CmsPageLoadedHook($page, $salesChannelContext));
  147.         
  148.     
  149.         $response $this->renderStorefront('@Storefront/storefront/page/content/detail.html.twig', ['cmsPage' => $page]);
  150.         $response->headers->set('x-robots-tag''noindex');
  151.         return $response;
  152.     }
  153. }