custom/plugins/DanMuehldorferPlugin/src/Service/EventSubscriber.php line 45

Open in your IDE?
  1. <?php declare(strict_types=1);
  2. namespace DanMuehldorferPlugin\Service;
  3. use Shopware\Core\Content\Seo\SeoUrlPlaceholderHandlerInterface;
  4. use Shopware\Core\System\Language\LanguageEntity;
  5. use Shopware\Core\System\SalesChannel\Context\SalesChannelContextService;
  6. use Shopware\Storefront\Pagelet\Footer\FooterPageletLoadedEvent;
  7. use Shopware\Storefront\Pagelet\Header\HeaderPageletLoadedEvent;
  8. use Shopware\Storefront\Pagelet\PageletLoadedEvent;
  9. use Symfony\Component\EventDispatcher\EventSubscriberInterface;
  10. use Shopware\Core\System\Language\LanguageCollection;
  11. use Shopware\Core\System\SalesChannel\Context\AbstractSalesChannelContextFactory;
  12. class EventSubscriber implements EventSubscriberInterface
  13. {
  14.     /**
  15.      * @var SeoUrlPlaceholderHandlerInterface
  16.      */
  17.     private $seoUrlReplacer;
  18.     /**
  19.      * @var AbstractSalesChannelContextFactory
  20.      */
  21.     private $salesChannelContextFactory;
  22.     public function __construct(
  23.                                 SeoUrlPlaceholderHandlerInterface $seoUrlReplacer,
  24.                                 AbstractSalesChannelContextFactory $salesChannelContextFactory
  25.     )
  26.     {
  27.         $this->seoUrlReplacer $seoUrlReplacer;
  28.         $this->salesChannelContextFactory $salesChannelContextFactory;
  29.     }
  30.     public static function getSubscribedEvents(): array
  31.     {
  32.         return [
  33.             HeaderPageletLoadedEvent::class => 'addLanguageUrls',
  34.         ];
  35.     }
  36.     public function addLanguageUrls(PageletLoadedEvent $event): void
  37.     {
  38.         $languages_urls = [];
  39.         try {
  40.             $paglet_vars $event->getPagelet()->getVars();
  41.             foreach ($paglet_vars as $k => $v) {
  42.                 if ($k == "languages") {
  43.                     /** @var LanguageEntity $lang */
  44.                     foreach ($v->getVars()["elements"] as $lang) {
  45.                             $host "";
  46.                             foreach ($event->getSalesChannelContext()->getSalesChannel()->getDomains() as $domain) {
  47.                                 if ($domain->getLanguageId() == $lang->getId()) {
  48.                                     $host $domain->getUrl();
  49.                                 }
  50.                             }
  51.                             $language_sale_context $this->salesChannelContextFactory->create(''$event->getSalesChannelContext()->getSalesChannelId(), [SalesChannelContextService::LANGUAGE_ID => $lang->getId()]);
  52.                             $languages_urls[$lang->getId()] = [
  53.                                 "language_id" => $lang->getId(),
  54.                                 "language_code" => $lang->getTranslationCode()->getCode(),
  55.                                 "url" => $this->getSeoUrl($event->getRequest()->get("_route"), $host$language_sale_context$event->getRequest())
  56.                             ];
  57.                     }
  58.                 }
  59.             }
  60.         } catch (\Throwable $e) {
  61.         }
  62.         $event->getPagelet()->addArrayExtension('dan_languages'$languages_urls);
  63.     }
  64.     public function getSeoUrl($pathname$host$salesChannelContext$request) {
  65.         $parameter = [];
  66.         switch($pathname) {
  67.             case 'frontend.detail.page':
  68.                 $parameter = ['productId' => $request->get("productId")];
  69.                 break;
  70.             case 'frontend.navigation.page':
  71.                 $parameter = ['navigationId' => $request->get("navigationId")];
  72.                 break;
  73.             default:
  74.                 break;
  75.         }
  76.         $raw $this->seoUrlReplacer->generate($pathname$parameter);
  77.         return $this->seoUrlReplacer->replace($raw$host$salesChannelContext);
  78.     }
  79. }