如何在 Spartacus 中为 PDP 页面创建没有 ProductCode 的 Pretty URL?

How to create Pretty URL without ProductCode for PDP page in Spartacus?

要求:

商家提供 URL 格式为 (":category/:name") 并且针对此格式,系统将定义一个 SKU,需要为其打开 PDP 而不更改 URL。 例如对于已定义的 URL -- https://example.com/categoryName/baseProductName 和 SKU (SKU123) 将在后端进行配置。 当客户打开上述 URL 时,SKU123 的 PDP 应加载 URL 保持不变的位置。

Spartacus 代码有一个限制,即如果不向其提供产品代码(SKU 编号)就无法打开 PDP。我们试图覆盖路由配置,但在内部 spartacus 正在重定向到 404 页面。 在 Spartacus Docs(https://sap.github.io/spartacus-docs/route-configuration/) 中提到不允许这样做,否则功能会中断。

我正在寻找相同的解决方法以允许路由配置为 (":category/:name") 和 (":category/:name/:productCode") 两者似乎都是 Spartacus 的约束结尾。我们可以输入产品代码,但 URL 需要保持原样。

当前的 PDP 功能应该不会中断。

斯巴达克斯:1.4.4 SAP 商务:1905

这是一个有趣的问题,实际上并不容易解决。我会给你一些解决方法。

首先,Spartacus 在应用程序的所有层中使用产品代码作为唯一 key。该代码用于路由逻辑、商店以及从后端加载产品。

此外,代码被传递到 CMS,因为 CMS 能够解析每个产品的 自定义 页面结构;您可以为特定的产品代码或产品类别配置特定的 CMS 页面结构;因此,产品代码在加载时作为 id 传递给 CMS。

要解决这些功能,您需要配置和覆盖一些东西:

  1. 将产品名称带入路由配置 您可以使用路由配置轻松完成此操作,或者只需提供从 product.codeproduct.nameparamsMapping。有关更多信息,请访问 docs。此外,您可以美化产品名称(避免使用空格和其他字符以避免难看的编码)

  2. 将类别名称带入路由配置 在为类别名称配置路由器(参见 1)之前,您需要从后端获取类别。您可以通过 normalising 产品模型中的(第一个)类别来做到这一点。但是,默认情况下产品不包含类别,这就是您需要配置 OCC 字段配置的原因。 https://sap.github.io/spartacus-docs/connecting-to-other-systems/ 中均有描述。需要特别注意 SOLR 结果,因为它们还需要公开类别。 此外,您可以美化产品名称(避免使用空格和其他字符以避免难看的编码)

  3. 在内部更改产品密钥 要确保使用类别名称和产品名称而不是产品代码来存储(ngrx)和加载(OCC)产品,您需要欺骗系统。您可以提供 CurrentProductService 的自定义实现,您可以在其中评估路由器状态是否包含类别名称和产品名称参数。如果这些参数可用,您可以将它们连接起来,以便以后可以重建它们。

  4. 按类别和产品名称加载产品数据 您可以引入一个自定义适配器来按类别和产品名称解析产品代码,但我不建议这样做。这将涉及额外的 API 调用,而且成本很高。相反,我会实现一个自定义后端端点,它采用类别和产品名称。您仍然可以在 Spartacus 中提供自定义适配器,用于从步骤 3 中解构串联的类别和产品名称,因为这会产生更清晰的代码库。

  5. 按类别和产品名称加载 CMS 产品页面 CMS 也使用产品代码 (id) 来加载正确的 cms 结构。你可以在这里做两件事: 一种。使用与步骤 4 相同的模式;创建自定义 OCC 端点以解析产品代码,然后加载正确的 CMS 产品页面结构 b.在客户 OccCmsPageAdapter 中使用静态(但存在)产品代码来为所有产品页面加载相同的 CMS 结构。这显然会阻止现有的 CMS 功能,但它可能没问题。或者至少对于您的第一个实施,您可以使用此解决方法。

希望能给你一个想法或 2。

综上所述,我相信这是一个非常不常见的要求。并不是说您需要漂亮的 URL 并希望将产品名称用作唯一的“代码”。但是同时使用类别名称和产品名称作为唯一键。如果可能的话,我会尝试进入这种模式:

  • 在标题中使用产品类别和产品名称用于 SEO 目的(完全按照您的要求)
  • 只看产品代码是唯一的属性
  • 修改后台产品代码结构; product.code 有多种方法可以做到这一点,想法是实际的产品代码可以存储在替代字段中,而生成的(基于名称)product.code 在本机代码字段中。
  • 所有应用程序逻辑(UI、APIs、SOLR、Spartacus)将透明地使用产品名称作为唯一键。