Hi Quan,
Thank you for the response. You mean how to define these properties? I just want to set IsDeleted= true everytime.
Thanks,
Shinoj
My bad, I thought IsDeleted and Deleted are custom properties. They are, however, system properties - Today I learned.
Now the tricky part. Unlike CMS content when you can delete a page and restore it later, the deleting part is actually moving a content to wastebasket, Catalog content has no waste basket concept. When you delete a content, it's gone for good and can't be restored.
For that reason, Catalog content implements IsDeleted and Deleted are required by the interfaces they implement, but those properties are not persisted anywhere.
So for your purpose, you can add two custom properties, IsSoftDeleted and DeletedTime to your product content, they would be saved correctly.
Hi Quan,
Thank you for the quick response.
If we add new properies IsSoftDeleted and DeletedTime, we need to make corresponding changes in front end site to exclude the deleted products from listing., right?
Could you please suggest if there any way for soft delete, so that it will not be available for listing/purchase but can reintroduce very quickly, if needed.
Thanks,
Shinoj k
You can make IsSoftDeleted a boolean property and filter for that. Isn't that very quick and easy to do?
Hi Quan,
Yes. As you suggested, let us try to add the new boolean property. I was just thinking about the areas where I have to incorporte this field, as the system fetch the active products from different jobs and tools.
Thanks,
Shinoj K
Hi Quan,
We tried the same to add the new property 'IsSoftDeleted' and set it true. But still it seems like not updating to DB.
var allProductsList =contentRepository.GetDescendents(catalog.ContentLink).(....)
var selectedProduct = allProductsList.Where(x => x.ContentLink.ID == "someid").FirstOrDefault();
var writableProduct = selectedProduct.CreateWritableClone<GenericProduct>();
product.SetValue("IsSoftDeleted", true);
contentRepository.Save(product, SaveAction.SkipValidation, AccessLevel.Edit);
We tried with different parameters like SaveAction.ForceCurrentVersion, AccessLevel.Administer in Save method.
I am not getting any error. But when we fetch the same item again, the property is false only.
var updatedProduct = contentRepository.Get<GenericItem>(variantLink)
updatedProduct.IsSoftDeleted is false every time.
Did I missed any step which is required to reflect the change? Could you please give your suggetion?
Thanks,
Shinoj k
I'm not sure what you are trying to do.
var writableProduct = selectedProduct.CreateWritableClone<GenericProduct>();
but then you update another content
product.SetValue("IsSoftDeleted", true);
contentRepository.Save(product, SaveAction.SkipValidation, AccessLevel.Edit);
And then you load another content
var updatedProduct = contentRepository.Get<GenericItem>(variantLink)
Also you have to use SaveAction.Publish or SaveAction.Save
Hi Quan,
Apologize for causing confusion. Actually I copied the codes from different libraries of my project. Thats why variable mismatch occured.
Could you please review the following code.
//Get all products which is to be soft deleted.
var allProductsList = contentRepository.GetDescendents(catalog.ContentLink);
var selectedProduct = allProductsList.Where(x => x.ContentLink.ID == 51898).FirstOrDefault();
//Clone writable product
var writableProduct = selectedProduct.CreateWritableClone<GenericProduct>();
writableProduct.SetValue("IsSoftDeleted", true);
//Saving with IsSoftDeleted = true.
contentRepository.Save(writableProduct, SaveAction.Publish, AccessLevel.Edit);
//If we take all products again, the status of IsSoftDeleted is false only. (Even if restart the application)
var allUpdatedProducts = contentRepository.GetDescendents(catalog.ContentLink);
var updatedProduct = allUpdatedProducts.Where(x => x.ContentLink.ID == 51898).FirstOrDefault();
bool isSoftDeleted = updatedProduct.IsSoftDeleted;
I really appreaciate your kind response.
Thanks in advance.
Hi,
We have a shopping cart application build in MVC-EpiServer version 11.
We would like to delete some existing products from my Epi commerse system as part of syncing with our ERP system.
We need to soft delete (make not available in front end site) it first and then hard deleted in a later point of time.
In order to do the soft delete, we have set the property IsDeleted=true and Deteted=GetDate.
But even if we set the IsDeleted=true, and saved using contentRepository.Save method, the property is not updating to DB. Because if we fetch the same product again through CatalogManager GET, its status is showing as IsDeleted=false.
Could you please suggest if I missed anything?
Code Block
public static void UpdateDeletedProductStatus(this GenericProduct product, string entityCode)
{
product.IsDeleted = true;
product.Deleted = DateTime.Now;
//update segment url
product.UpdateUrl(entityCode);
var catalogManager = ServiceLocator.Current.GetInstance();
catalogManager.UpdateDeletedProduct(product);
var contentRepo = ServiceLocator.Current.GetInstance();
var variant = product.GetVariants().Select(x => contentRepo.Get(x)).FirstOrDefault();
if (variant != null)
{
catalogManager.UpdateVariantStatus(variant.CreateWritableClone());
}
}
public void UpdateDeletedProduct(GenericProduct product)
{
contentRepository.Save(product, SaveAction.SkipValidation, AccessLevel.Edit); (Tried with Validation SaveAction.Publish as well)
}