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
Good start Sunil, Keep it up. Will read it and provide you my feedback on this.
Thank you Praful :)
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);
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.