Sunil
Feb 28, 2021
  1229
(4 votes)

Delete Multiple Variants From Product & Catalog

In EpiServer sometimes you need to Delete Multiple Variants from a Catalog and Product.

We can do that by using CatalogSystem.

Here I am going to show you how we can remove the Variants from Product & Catalog.

We may have two things:

  • Delete Variants by Product
  • Delete all Variants under Catalog

To perform this we will pull all the catalog items first then we will look product nodes under it then variants and remove those.

Delete Variants by Products:

public void DeleteVariantsByProduct(ContentReference productContentReference)
        {
            var children = _contentRepository.GetChildren<CatalogContentBase>(productContentReference);

            foreach (var child in children)
            {
                if (child.GetType().BaseType == typeof(VariationContent))
                {
                    try
                    {
                        // Delete 
                        _catalogSystem.DeleteCatalogEntry(child.ContentLink.ID, true);
                    }
                    catch (Exception exception)
                    {
                        // Log Exception
                    }
                }
            }
        }

I created a Variant Service Class where you can find the two Methods for Delete Variants by Product and Delete all Variants under Catalog.

using EPiServer;
using EPiServer.Commerce.Catalog.ContentTypes;
using EPiServer.Core;
using Mediachase.Commerce.Catalog;
using System;

namespace DemoCommerce
{
    public class VariantService
    {
        private readonly ICatalogSystem _catalogSystem;
        private readonly IContentRepository _contentRepository;
        private readonly ReferenceConverter _referenceConverter;

        public VariantService(
            ICatalogSystem catalogSystem,
            IContentRepository contentRepository,
            ReferenceConverter referenceConverter)
        {
            _catalogSystem = catalogSystem ?? throw new ArgumentNullException(nameof(catalogSystem));
            _contentRepository = contentRepository ?? throw new ArgumentNullException(nameof(contentRepository));
            _referenceConverter = referenceConverter ?? throw new ArgumentNullException(nameof(referenceConverter));
        }

        public void DeleteVariantsByProduct(ContentReference productContentReference)
        {
            var children = _contentRepository.GetChildren<CatalogContentBase>(productContentReference);

            foreach (var child in children)
            {
                if (child.GetType().BaseType == typeof(VariationContent))
                {
                    try
                    {
                        // Delete 
                        _catalogSystem.DeleteCatalogEntry(child.ContentLink.ID, true);
                    }
                    catch (Exception exception)
                    {
                        // Log Exception
                    }
                }
            }
        }

        public void DeleteAllVariants()
        {
            // Get Catalog Node Items
            var catalogItems = _contentRepository.GetChildren<CatalogContent>(_referenceConverter.GetRootLink());

            foreach (var catalogItem in catalogItems)
            {
                //Loop through all catalog items
                var nodes = _contentRepository.GetChildren<CatalogContentBase>(catalogItem.ContentLink);

                foreach (var node in nodes)
                {
                    DeleteCatalogEntries(node);
                }
            }
        }

        private void DeleteCatalogEntries(CatalogContentBase node)
        {
            var children = _contentRepository.GetChildren<CatalogContentBase>(node.ContentLink);

            foreach (var child in children)
            {
                switch (child.ContentType)
                {
                    case CatalogContentType.CatalogNode:
                        DeleteCatalogEntries(child);
                        break;
                    case CatalogContentType.CatalogEntry:
                        if (child.GetType().BaseType == typeof(VariationContent))
                        {
                            try
                            {
                                // Delete 
                                _catalogSystem.DeleteCatalogEntry(child.ContentLink.ID, true);
                            }
                            catch (Exception exception)
                            {
                                // Log Exception
                            }
                        }

                        break;
                }
            }
        }
    }
}

Thanks & Regards

Sunil

Feb 28, 2021

Comments

Praful Jangid
Praful Jangid Mar 1, 2021 07:19 AM

Good start Sunil, Keep it up. Will read it and provide you my feedback on this.

Sunil
Sunil Mar 1, 2021 07:21 AM

Thank you Praful :)

Quan Mai
Quan Mai Mar 1, 2021 08:55 AM

You can use the content API all the way, which is the recommended way to do so. Mixing between content API and DTO Api is not recommended.

Also I don't think this will work

public void DeleteVariantsByProduct(ContentReference productContentReference)

{ var children = _contentRepository.GetChildren<CatalogContentBase>(productContentReference);

Sunil
Sunil Mar 25, 2021 02:45 PM

Thank you Quan for your time to view my post & sorry for the delay in reply.

I agree that DTO API's is not recommended over Content API's now I have updated the code.

Please let me know if any issue.

Please login to comment.
Latest blogs
Customizing Property Lists in Optimizely CMS

Generic property lists is a cool editorial feature that has gained a lot of popularity - in spite of still being unsupported (officially). But if y...

Allan Thraen | Oct 2, 2022 | Syndicated blog

Content Delivery API – The Case of the Duplicate API Refresh Token

Creating a custom refresh provider to resolve the issues with duplicate tokens in the DXC The post Content Delivery API – The Case of the Duplicate...

David Lewis | Sep 29, 2022 | Syndicated blog

New Optimizely certifications - register for beta testing before November 1st

In January 2023, Optimizely is making updates to the current versions of our certification exams to make sure that each exam covers the necessary...

Jamilia Buzurukova | Sep 28, 2022

Optimizely community meetup - Sept 29 (virtual + Melbourne)

Super excited to be presenting this Thursday the 29th of September at the Optimizely community meetup. For the full details and RSVP's see the...

Ynze | Sep 27, 2022 | Syndicated blog

Preview multiple Visitor Groups directly while browsing your Optimizely site

Visitor groups are great - it's an easy way to add personalization towards market segments to your site. But it does come with it's own set of...

Allan Thraen | Sep 26, 2022 | Syndicated blog

The Report Center is finally back in Optimizely CMS 12

With Episerver.CMS.UI 12.12.0 the Report Center is finally re-introduced in the core product.

Tomas Hensrud Gulla | Sep 26, 2022 | Syndicated blog