K Khan
May 15, 2015
  3704
(0 votes)

Hook into commerce catalog events

"The possibilities for integrating EPiServer with other systems are virtually unlimited". A customer requires all the changes of EPiServer Commerce Products done by CMS Editors in Online Centre’s catalog UI, back into their fulfilment system. EPiServer provides a number of features to facilitate Integration with outer systems.  I will use .NET API’s catalog events to react changes to catalog items. This can be achieved by adding handlers for IContentEvents, CatalogEventHandler, CatalogEventBroadcaster or can create own implementation of CatalogEventListenerBase and hook the events such as EntryUpdating or EntryUpdated. 


IContentEvents: Events will not be raised when a catalog item is updated through Commerce Manager or in Integration Application using ICatalogSystem.
CatalogEventHandler: Events will not be raised when changes done directly through ICatalogSystem only.
CatalogEventBroadcaster: Events will be raised when changes are done through ICatalogSystem, including changes made through the Content API's.
(IContentEvents are in my scope)

We can register events in our Commerce Initialization module, e.g.

[InitializableModule, ModuleDependency(typeof(EPiServer.Commerce.Initialization.InitializationModule))]
    public class CommerceInitialization : IConfigurableModule
    {
///
        public void Initialize(InitializationEngine context)
        {
              var contenEventHandler = EPiServer.ServiceLocation.ServiceLocator.Current.GetInstance<EPiServer.Core.IContentEvents>();
            contenEventHandler.PublishedContent += this.ContenEventPublishedContent;
        }

///
    }

I am using ValueInjector (convention based mapper) to map Product meta class with OdooProduct.

private void ContenEventPublishedContent(object sender, ContentEventArgs e)
        {
            var product = e.Content as XYZ.BusinessModel.Models.MetaData.FashionProduct;
            if (product != null)
            {
                log4net.LogManager.GetLogger("EntryUpdate").Error(product.AgeFromInYears);
                //used value injector
                var odooProduct = 
                Mapper.AddMap<XYZ.BusinessModel.Models.MetaData.FashionProduct, OdooProduct>(src =>
                {
                    var res = new OdooProduct();
                    res.InjectFrom(src); // maps properties with same name and type
                    res.Name = src.DisplayName;
                    res.AgeFrom = src.AgeFromInYears;
                    return res;
                });
                // Update product details on fulfillment center
                fulfilmentService.UpdateProduct(odooProduct);
            }            
        }

and That's It.

May 15, 2015

Comments

valdis
valdis May 16, 2015 10:21 AM

I'm considering to expose Commerce events down to client-side through SignalR. Is that something useful? Would client be interested in catalog changes happening on the server?

May 17, 2015 07:10 PM

Bundle of thanks Champ for pointing out this extension point, I confess, I haven’t consider SignalR while writing this Blog. Anyway it isn’t in scope of work as they are not exposing their catalog/events to any client and these weren’t high frequency changes. We need to inform changes of few fields to an already working web service on a third party system only.

K Khan
K Khan May 17, 2015 07:13 PM

I have just noticed comments can be added as guest also :) , I own above comments.

Please login to comment.
Latest blogs
Graph access with only JS and Fetch

Postman is a popular tool for testing APIs. However, when testing an API like Optimizely Graph that I will be consuming in the front-end I prefer t...

Daniel Halse | Feb 4, 2026

Best Practices for Implementing Optimizely SaaS CMS: A Collective Wisdom Guide

This guide compiles collective insights and recommendations from Optimizely experts for implementing Optimizely SaaS CMS, focusing on achieving...

David Knipe | Feb 4, 2026 |

A day in the life of an Optimizely OMVP: Learning Optimizely Just Got Easier: Introducing the Optimizely Learning Centre

On the back of my last post about the Opti Graph Learning Centre, I am now happy to announce a revamped interactive learning platform that makes...

Graham Carr | Jan 31, 2026

Scheduled job for deleting content types and all related content

In my previous blog post which was about getting an overview of your sites content https://world.optimizely.com/blogs/Per-Nergard/Dates/2026/1/sche...

Per Nergård (MVP) | Jan 30, 2026

Working With Applications in Optimizely CMS 13

💡 Note:  The following content has been written based on Optimizely CMS 13 Preview 2 and may not accurately reflect the final release version. As...

Mark Stott | Jan 30, 2026

Experimentation at Speed Using Optimizely Opal and Web Experimentation

If you are working in experimentation, you will know that speed matters. The quicker you can go from idea to implementation, the faster you can...

Minesh Shah (Netcel) | Jan 30, 2026