custom/plugins/OttMerchantShops/src/Subscriber/PageSubscriber.php line 116

Open in your IDE?
  1. <?php declare(strict_types=1);
  2. namespace Ott\MerchantShops\Subscriber;
  3. use Ott\MerchantShops\Gateway\MerchantGateway;
  4. use Shopware\Core\Checkout\Order\SalesChannel\OrderService;
  5. use Shopware\Core\Content\Seo\SeoUrlPlaceholderHandlerInterface;
  6. use Shopware\Core\Framework\DataAbstractionLayer\EntityRepositoryInterface;
  7. use Shopware\Core\Framework\DataAbstractionLayer\Search\Criteria;
  8. use Shopware\Core\Framework\Struct\ArrayEntity;
  9. use Shopware\Core\Framework\Struct\ArrayStruct;
  10. use Shopware\Core\System\SalesChannel\SalesChannelContext;
  11. use Shopware\Storefront\Framework\Routing\RequestTransformer;
  12. use Shopware\Storefront\Page\GenericPageLoadedEvent;
  13. use Shopware\Storefront\Page\Navigation\NavigationPageLoadedEvent;
  14. use Symfony\Component\EventDispatcher\EventSubscriberInterface;
  15. use Symfony\Component\HttpFoundation\RedirectResponse;
  16. use Symfony\Component\HttpKernel\Event\ResponseEvent;
  17. use Symfony\Component\HttpKernel\KernelEvents;
  18. class PageSubscriber implements EventSubscriberInterface
  19. {
  20.     private MerchantGateway $merchantGateway;
  21.     private SeoUrlPlaceholderHandlerInterface $seoUrlPlaceholderHandler;
  22.     private EntityRepositoryInterface $mediaRepository;
  23.     public function __construct(
  24.         MerchantGateway $merchantGateway,
  25.         SeoUrlPlaceholderHandlerInterface $seoUrlPlaceholderHandler,
  26.         EntityRepositoryInterface $mediaRepository
  27.     )
  28.     {
  29.         $this->merchantGateway $merchantGateway;
  30.         $this->seoUrlPlaceholderHandler $seoUrlPlaceholderHandler;
  31.         $this->mediaRepository $mediaRepository;
  32.     }
  33.     public static function getSubscribedEvents(): array
  34.     {
  35.         return [
  36.             KernelEvents::RESPONSE           => 'onResponse',
  37.             NavigationPageLoadedEvent::class => 'onNavigationPageLoadedEvent',
  38.             GenericPageLoadedEvent::class    => 'onGenericPageLoadedEvent',
  39.         ];
  40.     }
  41.     public function onResponse(ResponseEvent $event): void
  42.     {
  43.         $allowedAncestors = [
  44.             'staging.taschen24.de',
  45.             'stackoverflow.com',
  46.         ];
  47.         $event->getResponse()->headers->set('x-frame-options''ALLOW-FROM *');
  48.         $event->getResponse()->headers->set(
  49.             'Content-Security-Policy',
  50.             'frame-ancestors *'
  51.         );
  52.     }
  53.     public function onNavigationPageLoadedEvent(NavigationPageLoadedEvent $event): void
  54.     {
  55.         $affiliateCode $event->getRequest()->get('affiliateCode'null);
  56.         if (!empty($affiliateCode)) {
  57.             return;
  58.         }
  59.         $navigationId $event->getPage()->getNavigationId();
  60.         $merchantId $this->merchantGateway->getCategoryMerchantId(
  61.             $navigationId,
  62.             $event->getSalesChannelContext()->getLanguageId()
  63.         );
  64.         if (empty($merchantId)) {
  65.             return;
  66.         }
  67.         $merchantNumber $this->merchantGateway->getMerchantNumber($merchantId);
  68.         if (empty($merchantNumber)) {
  69.             return;
  70.         }
  71.         $navigationUrl $this->getNavigationUrlById(
  72.             $navigationId,
  73.             $event->getSalesChannelContext(),
  74.             $event->getRequest()->attributes->get(RequestTransformer::STOREFRONT_URL)
  75.         );
  76.         $navigationUrl .= '?affiliateCode=' $merchantNumber;
  77.         $isIframe $event->getRequest()->get('isIframe'null);
  78.         if (!empty($isIframe)) {
  79.             $navigationUrl .= '&isIframe=1';
  80.         }
  81.         $response = new RedirectResponse($navigationUrl);
  82.         $response->send();
  83.     }
  84.     public function onGenericPageLoadedEvent(GenericPageLoadedEvent $event): void
  85.     {
  86.         $route $event->getRequest()->attributes->get('_route');
  87.         $merchantId $event->getRequest()->getSession()->get(OrderService::AFFILIATE_CODE_KEY);
  88.         if (
  89.             'frontend.home.page' === $route
  90.             || 'frontend.landing.page' === $route
  91.             || 'frontend.navigation.page' === $route
  92.             || 'frontend.detail.page' === $route
  93.         ) {
  94.             $merchantId $event->getRequest()->get('affiliateCode');
  95.         }
  96.         if (empty($merchantId)) {
  97.             $event->getRequest()->getSession()->remove(OrderService::AFFILIATE_CODE_KEY);
  98.             return;
  99.         }
  100.         $merchant $this->merchantGateway->getMerchantByNumber($merchantId);
  101.         if (empty($merchant)) {
  102.             $event->getRequest()->getSession()->remove(OrderService::AFFILIATE_CODE_KEY);
  103.             return;
  104.         }
  105.         $merchantCategory $this->merchantGateway->getMerchantCategory($merchant['id']);
  106.         if (!empty($merchantCategory)) {
  107.             $merchant['categoryId'] = $merchantCategory;
  108.         }
  109.         $mediaIds = [];
  110.         if (null !== $merchant['logo']) {
  111.             $mediaIds[] = $merchant['logo'];
  112.         }
  113.         if (null !== $merchant['contactImage']) {
  114.             $mediaIds[] = $merchant['contactImage'];
  115.         }
  116.         if (!empty($mediaIds)) {
  117.             $criteria = new Criteria($mediaIds);
  118.             $mediaCollection $this->mediaRepository
  119.                 ->search($criteria$event->getContext())
  120.                 ->getEntities()
  121.             ;
  122.             foreach ($mediaCollection as $mediaId => $media) {
  123.                 if ($mediaId === $merchant['logo']) {
  124.                     $merchant['logo'] = $media->getUrl();
  125.                 } elseif ($mediaId === $merchant['contactImage']) {
  126.                     $merchant['contactImage'] = $media->getUrl();
  127.                 }
  128.             }
  129.         }
  130.         $event->getPage()->addExtension('ottMerchantShopsData', new ArrayStruct([
  131.             'merchant'  => new ArrayEntity($merchant),
  132.         ]));
  133.     }
  134.     private function getNavigationUrlById(
  135.         string $navigationId,
  136.         SalesChannelContext $salesChannelContext,
  137.         string $host
  138.     ): string
  139.     {
  140.         return $this->seoUrlPlaceholderHandler->replace(
  141.             $this->seoUrlPlaceholderHandler->generate('frontend.navigation.page', ['navigationId' => $navigationId]),
  142.             $host,
  143.             $salesChannelContext
  144.         );
  145.     }
  146. }