<?php declare(strict_types=1);
namespace DanMuehldorferPlugin\Service;
use Shopware\Core\Content\Seo\SeoUrlPlaceholderHandlerInterface;
use Shopware\Core\System\Language\LanguageEntity;
use Shopware\Core\System\SalesChannel\Context\SalesChannelContextService;
use Shopware\Storefront\Pagelet\Footer\FooterPageletLoadedEvent;
use Shopware\Storefront\Pagelet\Header\HeaderPageletLoadedEvent;
use Shopware\Storefront\Pagelet\PageletLoadedEvent;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
use Shopware\Core\System\Language\LanguageCollection;
use Shopware\Core\System\SalesChannel\Context\AbstractSalesChannelContextFactory;
class EventSubscriber implements EventSubscriberInterface
{
/**
* @var SeoUrlPlaceholderHandlerInterface
*/
private $seoUrlReplacer;
/**
* @var AbstractSalesChannelContextFactory
*/
private $salesChannelContextFactory;
public function __construct(
SeoUrlPlaceholderHandlerInterface $seoUrlReplacer,
AbstractSalesChannelContextFactory $salesChannelContextFactory
)
{
$this->seoUrlReplacer = $seoUrlReplacer;
$this->salesChannelContextFactory = $salesChannelContextFactory;
}
public static function getSubscribedEvents(): array
{
return [
HeaderPageletLoadedEvent::class => 'addLanguageUrls',
];
}
public function addLanguageUrls(PageletLoadedEvent $event): void
{
$languages_urls = [];
try {
$paglet_vars = $event->getPagelet()->getVars();
foreach ($paglet_vars as $k => $v) {
if ($k == "languages") {
/** @var LanguageEntity $lang */
foreach ($v->getVars()["elements"] as $lang) {
$host = "";
foreach ($event->getSalesChannelContext()->getSalesChannel()->getDomains() as $domain) {
if ($domain->getLanguageId() == $lang->getId()) {
$host = $domain->getUrl();
}
}
$language_sale_context = $this->salesChannelContextFactory->create('', $event->getSalesChannelContext()->getSalesChannelId(), [SalesChannelContextService::LANGUAGE_ID => $lang->getId()]);
$languages_urls[$lang->getId()] = [
"language_id" => $lang->getId(),
"language_code" => $lang->getTranslationCode()->getCode(),
"url" => $this->getSeoUrl($event->getRequest()->get("_route"), $host, $language_sale_context, $event->getRequest())
];
}
}
}
} catch (\Throwable $e) {
}
$event->getPagelet()->addArrayExtension('dan_languages', $languages_urls);
}
public function getSeoUrl($pathname, $host, $salesChannelContext, $request) {
$parameter = [];
switch($pathname) {
case 'frontend.detail.page':
$parameter = ['productId' => $request->get("productId")];
break;
case 'frontend.navigation.page':
$parameter = ['navigationId' => $request->get("navigationId")];
break;
default:
break;
}
$raw = $this->seoUrlReplacer->generate($pathname, $parameter);
return $this->seoUrlReplacer->replace($raw, $host, $salesChannelContext);
}
}