2

我需要在 shopware6 中构建一个“频道切换器”。如何访问该商店中所有或某些其他渠道的当前(产品)URL 等效项?它应该像语言切换器一样工作,保留当前查看的产品或类别并重定向到其他频道。

我知道如何获取产品的当前 seoUrl: {{ seoUrl('frontend.detail.page', { productId: page.product.id }) }}

但是有没有办法为具有相同product.id的所有其他销售渠道获取所有其他seoUrls?类别也一样?

4

1 回答 1

1

获取所有语言链接的粗略方法

看着

\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 的人工请求自己创建这些实例。

类似于语言切换器的方法(POST后重定向)

上面的方法可能相当复杂,所以看看语言切换器的作用:

  • 它只包含语言 ID
  • 关于选择帖子\Shopware\Storefront\Controller\ContextController::switchLanguage
  • 哪个重定向

请求的示例负载:

languageId: 2fbb5fe2e29a4d70aa5854ce7ce3ff0b
redirectTo: frontend.navigation.page
redirectParameters[navigationId]: a11f6b46948c47a7b2c2ac874704fff6

我认为您可以为您的频道切换器扩展该脚本并将销售渠道 ID 添加到请求中,

然后您可以重复使用/复制甚至装饰switchLanguage控制器。您只需要传递目标销售渠道的正确上下文,它就应该重定向到正确的 URL。

于 2022-01-21T06:49:36.287 回答