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

问题描述

要求:

该公司以(“:category /:name”)格式提供URL,并且针对该格式,系统将定义一个SKU,需要为其打开PDP而无需更改URL。 例如定义的网址-https://example.com/categoryName/baseProductName和SKU(SKU123)将在后端配置。 当客户打开上述URL时,应该在URL保持不变的位置加载SKU123的PDP。

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

我正在寻找一种解决方法,以允许将路由配置设置为(“:category /:name”)和(“:category /:name /:productCode”),这两者似乎都是Spartacus的限制。我们可以输入productCode,但URL必须保持原样。

当前的PDP功能不应中断。

斯巴达克斯:1.4.4 SAP Commerce:1905

解决方法

这是一个有趣的问题,实际上并不能直接解决。我会给您一些解决方法的提示。

首先,Spartacus在产品的所有层中将产品代码用作唯一的 key 。该代码用于路由逻辑,存储中,并从后端加载产品。

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

要解决这些功能,您需要配置和覆盖许多内容:

  1. 将产品名称添加到路由配置中 您可以通过路由配置轻松地做到这一点,或者只需提供从paramsMappingproduct.code的{​​{1}}。有关更多信息,请参见docs。此外,您可以美化产品名称(避免使用空格和其他字符,以免编码不准确)

  2. 将类别名称放入路由配置中 在为类别名称配置路由器(请参阅1)之前,您需要从后端获取类别。您可以通过product.name产品模型中的(第一个)类别来执行此操作。但是,默认情况下,产品不包含类别,这就是为什么您需要配置OCC字段配置的原因。这些都在https://sap.github.io/spartacus-docs/connecting-to-other-systems/中进行了描述。 SOLR结果需要特别注意,因为它们也需要公开类别。 此外,您可以美化产品名称(避免使用空格和其他字符,以免编码不准确)

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

  4. 按类别和产品名称加载产品数据 您可以引入一个自定义适配器来通过其类别和产品名称来解析产品代码,但是我不建议这样做。这将涉及一个额外的API调用,这很昂贵。相反,我将实现一个自定义的后端终结点,该终结点采用类别和产品名称。您仍然可以在Spartacus中提供一个自定义适配器,以便从第3步中解构连接的类别和产品名称,因为这样可以使代码库更简洁。

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

希望给您一个想法或2。

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

  • 使用标题中的产品类别和产品名称进行SEO(完全按照您的要求)
  • 仅依赖产品代码作为唯一属性
  • 更改后端的产品代码结构; OccCmsPageAdapter有多种实现方法,其想法是可以将实际产品代码存储在替代字段中,并将生成的(基于名称)product.code存储在本机代码字段中。
  • 所有应用程序逻辑(UI,API,SOLR,Spartacus)将透明地使用产品名称作为唯一键。