我需要在 shopware6 中构建一个“频道切换器”。如何访问该商店中所有或某些其他渠道的当前(产品)URL 等效项?它应该像语言切换器一样工作,保留当前查看的产品或类别并重定向到其他频道。
我知道如何获取产品的当前 seoUrl:
{{ seoUrl('frontend.detail.page', { productId: page.product.id }) }}
但是有没有办法为具有相同product.id的所有其他销售渠道获取所有其他seoUrls?类别也一样?
看着
\Shopware\Core\Framework\Adapter\Twig\Extension\SeoUrlFunctionExtension
它正在处理seoUrl()
in twig 它看起来像这样:
public function seoUrl(string $name, array $parameters = []): string
{
return $this->seoUrlReplacer->generate($name, $parameters);
}
这解决了
\Shopware\Core\Content\Seo\SeoUrlPlaceholderHandler::generate
它总是使用当前请求:
public function generate($name, array $parameters = []): string
{
$path = $this->router->generate($name, $parameters, RouterInterface::ABSOLUTE_PATH);
$request = $this->requestStack->getMainRequest();
$basePath = $request ? $request->getBasePath() : '';
$path = $this->removePrefix($path, $basePath);
return self::DOMAIN_PLACEHOLDER . $path . '#';
}
归结为\Shopware\Storefront\Framework\Routing\Router::generate
作为一种方法,我建议深入研究这些功能。他们直接访问当前请求和上下文。由于依赖注入,您可以使用目标上下文和包含来自目标通道的正确基本 URL 的人工请求自己创建这些实例。
上面的方法可能相当复杂,所以看看语言切换器的作用:
\Shopware\Storefront\Controller\ContextController::switchLanguage
请求的示例负载:
languageId: 2fbb5fe2e29a4d70aa5854ce7ce3ff0b
redirectTo: frontend.navigation.page
redirectParameters[navigationId]: a11f6b46948c47a7b2c2ac874704fff6
我认为您可以为您的频道切换器扩展该脚本并将销售渠道 ID 添加到请求中,
然后您可以重复使用/复制甚至装饰switchLanguage
控制器。您只需要传递目标销售渠道的正确上下文,它就应该重定向到正确的 URL。