Drew Null
Feb 6, 2022
  733
(0 votes)

Product and category URLs without the catalog slug in Commerce 14 (.NET 5)

This one stumped me the other day, and I couldn't find anything by doing a web or World search.

Problem: How do we exclude the catalog route segment from the URLs of categories and products?

Say you have the following catalog structure:

Catalog Root
    My Catalog // CatalogContent
        My Category // NodeContent
            My Product // ProductContent
                My Variant // VariationContent

By default, the URL to My Variant will look like this:

/my-catalog/my-category/my-variant

But /my-catalog won't resolve to an actual page, so we want to remove it from the URL. Which would render like this:

/my-category/my-variant

Much better. But how do we do this in Commerce 14?

Prior to Commerce 14, this could be done using System.Web.Mvc's RouteTable. But that was killed off in ASP.NET Core, so we need another way.

PartialRouteHandler to the rescue.

This is pretty simple: Create an initialization module and use PartialRouteHandler to register a PageData-to-CatalogContentBase partial router. No custom implementation needed.

Note that how you, say, resolve a catalog to a site, could vary based on the needs of your project. In the example below, we resolve all catalogs to all sites.

using EPiServer;
using EPiServer.Commerce.Catalog.ContentTypes;
using EPiServer.Core;
using EPiServer.Core.Routing;
using EPiServer.Framework;
using EPiServer.Framework.Initialization;
using EPiServer.ServiceLocation;
using Mediachase.Commerce.Catalog;

[InitializableModule]
[ModuleDependency(typeof(EPiServer.Web.InitializationModule))]
[ModuleDependency(typeof(EPiServer.Commerce.Initialization.InitializationModule))]
public class CustomHierarchicalCatalogPartialRouterInitialization : IInitializableModule
{
    public void Initialize(InitializationEngine context)
    {
        /* MapDefaultHierarchialRouter [sic] is no longer needed... */
        ////CatalogRouteHelper.MapDefaultHierarchialRouter(false);
        var referenceConverter = ServiceLocator.Current.GetInstance<ReferenceConverter>();
        var contentLoader = ServiceLocator.Current.GetInstance<IContentLoader>();
        var partialRouteHandler = ServiceLocator.Current.GetInstance<PartialRouteHandler>();
        var catalogs = contentLoader.GetChildren<CatalogContentBase>(referenceConverter.GetRootLink());
        foreach (var catalog in catalogs)
        {
            // This implementation will register all catalogs for all sites; if you want it to work differently, do so here--
            partialRouteHandler.RegisterPartialRouter(
                new PartialRouter<PageData, CatalogContentBase>(
                    new HierarchicalCatalogPartialRouter(() => ContentReference.StartPage, catalog, false)));
        }
    }

    public void Uninitialize(InitializationEngine context)
    {
    }
}

And that's it.

Your category, product, and variant pages (and bundles/packages) should resolve without including the catalog slug in the URL. And UrlResolver should now give you the catalog-less URL on the frontend and in the CMS backoffice.

Feb 06, 2022

Comments

Please login to comment.
Latest blogs
The 1001st Piece in your 1000 Piece Puzzle: .NET Default Interface Functions

I was recently working with a client who wanted a reasonably large subsystem added to Optimizely that would add automated management to their...

Greg J | Nov 28, 2022 | Syndicated blog

Video Demonstration, creating a CMS12 Alloy Sample Site

Hey All Below you will find a quick video demonstration on how to install a local version of Alloy Sample based on CMS12 / .Net 6. As you will see ...

Minesh Shah (Netcel) | Nov 28, 2022

How to create an admin user I Optimizely CMS – with Episerver CLI

In this blog post I’ll show how to create an admin user for Optimizely CMS in a new environment where you don’t have access to the admin interface.

Ove Lartelius | Nov 28, 2022 | Syndicated blog

Optimizely shortcuts in CMS 12 will get a trailing slash appended!

Not all URLs will work when the trailing slash is added, and that could cause problems. Hopefully it will be fixed soon.

Tomas Hensrud Gulla | Nov 26, 2022 | Syndicated blog

One week left of the beta certification period

Today it's one week until the last beta certification day. Do you exam no later than Wednesday the 30th.  Here are the reference and exam guides:...

Karen McDougall | Nov 23, 2022

Unbelievable FREE Heatmapping With Optimizely Web

Within this guide, you will learn how to integrate a free heat mapping tool to Optimizely Web so you can turbocharge your A/B testing capabilities....

Jon Jones | Nov 22, 2022 | Syndicated blog