Skip to main content

Sitecore commerce sxa OOTB ProductList component always have variants property as NULL in ProductEntity class

Hello People,

It has been little time till my last blog post, project priorities and lot to learn, It has been now 6 months I am working on core Sitecore  and I am loving the challenges and digging into nitty gritty of it.

Recently, we started working on Sitecore commerce project which had lot of customization needed to achieve what we want to achieve from what commerce and sxa provides OOTB (Out of the box).

OOTB commerce and sxa provides lot of components for storefront where authors can see product list, can have promoted products and much more

I would suggest to make the "dotPick" friend of your lifetime, as you will need to look into some important DLLs to troubleshoot or to extend the functionalities depending on your need.

Today, I would like to share one instance where we need to show some information from variant (not from a product), sounds simple right? but issue soon started as we started configuring OOTB "Product List" component.

Scenario (The 'ASK')

We wanted to have some information from variant like we wanted to show the lowest price and highest price from the variant on that each product.

Very first thing we did was to find out if anything like this exists OOTB, and as we guessed as it is our specific implementation, It was not possible OOTB, so next was to find out what needs to be done to achieve this.

So, we took help of our friend dotPick and started looking into classes and repositories which deals with getting the product list component and renders it, following is the list of it

  • ProductListRepository (In Sitecore.Commerce.XA.Feature.Catalog DLL)
  • ProductListJsonResult (In Sitecore.Commerce.XA.Feature.Catalog DLL)
  • ProductList.cshtml view (Resides in View->Commerce->Catalog folder)
What you need to override depends on what you need to change, here in our case we wanted to show variant prices on the view so we had to override the cshtml view, Click Here to know how to override OOTB view and its html and customize it.

Now because we want to show lowest and highest price for each variant we need to write custom code so that we can loop through all products and find variant underneath it and get the price and update the model with it and read them in a view so we can show them on the site.
so we needed to override ProductListRepository and create "override" function GetProductListJsonResult so we can write our code in it

Now further dotPicking showed that "ProductListJsonResult" has a property called "ChildProducts" which has all products inside it and it is of type "ProductSummaryViewModel" which has the property "Variants" and we were interested in getting that property so we can loop through all the variant and find its list price

but as soon we override it and debug it the Variants property was always NULL

see the last line where we are doing model.ChildProducts in that "PopulateProductsData()" we were always getting variants as NULL in ProductSummaryViewModel


ChildProducts is of type ICollection<ProductSummaryViewModel>

We expected that property generally gets filled out automatically, further investigation showed following

1) ProductEntity class has Variants property
2) In above code when this.AdjustProductPriceAndStockStatus is called, in that function the Variants are always passed as NULL (see below AdjustProductPriceAndStockStatus method screen shot)
3) Because Variants are passed as NULL in initialize method of ProductEntity, it will set Variants to NULL.
3) Because variants are always passed as null, model.Intitialize in above code is called the ProductEntity values are copied to ProductSummaryViewModel
3) But because ProductEntity class always initialize variants as NULL in its constructor, hence ProductSummaryViewModel will always have Variants as NULL

ProductEntity.cs




Above class has variant list properties and this should be set, if this is set correctly in initialize method, the ProductSummaryViewModel.cs will automatically get the Variants property.

but if you see below the code shown from dotPick

AdjustProductPriceAndStockStatus()



As you can see, because of this ProductEntity will always have Variants as NULL and hence ProductSummaryViewModel will always have NULL in variants

Solution

Now we knew that if we pass right List<Variants> instead of NULL in AdjustProductPriceAndStatus function, we will get the variants property filled out, so we change the code like following


As expected, Everything was filled out, ProductSummaryViewModel now had the Variants property filled out with correct variants and now we were able to get variant details and manipulate view as per our wish

Hope this will help, If you get yourself into something like this :) 


Comments

Post a Comment

Popular posts from this blog

Why SitecoreAI - Getting into the shoes of the customer how to select right CMS

Hi Team, Lately, I have been talking to lot of our customers / potential customers and having pre-sales demos where one question always comes is "Why Sitecore" ?  Now this question can be for any product which is out for sell. And as a technician I always get into product technical features, but at the same time as a pre-sales guy, it also makes me think, surely all competitive products have same features, so definitely answer to this is not in the technicalities.  If you step back and think, we are also a customer in our daily life and buy lot of things, what is that process we go through? When we buy, how can your customer decide if this is a right fit for you or not, why we select A over B? Is it price? is it service? Is it a brand? Is it about features? Is it about brand loyalty?  When it is a technical product, I am sure it cannot start with the technicalities of the product or selecting product itself, 100% not, I feel decision is always business strategy first and ...

Hell of sitecore aliases pipeline breaking the site with 500 error

Hello Friends, I belive this blog post is very important for everyone because, It has some very serious effect on working of your headless website, i will share my experience what we faced and how we resolved it Issue we started facing Our site started giving "Key cannot be null or empty" with YSOD like following  Side affect Because of this 500 error, Our site pages were showing 500 custom error page intermittently and our MAU (Monthly Active User) drop rate increased. Sitecore KB There is already Sitecore KB article talking about this error but the patch which is provided on this link is confusing as well as very huge and it could bring other issues along with it as that upgrade patch also has lot of other things too which i did not want to introduce in our stable CMS. Known Issues - Retrieving the child items of resource items is not thread-safe Observation Though the surfaced exception was looking similar and giving same error and behavior given on this article, We looked...

Zero to Hero - A real life RCA of exact issue in Sitecore Managed Cloud environment

Hello All, The purpose of today's post is to share a real life burning and escalated scenario which was new to me and how did I approach it and how big the escalations were and what was the outcome Sitecore's goodwill was at stack not because Sitecore is not capable of handling it but just because our environment was Sitecore Managed Cloud, and any issue that comes if its infra, back end code, front end code will be first pointed as Sitecore issue and that is where our consultancy and experience will play a role to prove that it is not Sitecore issue.  Issue we faced Out of the blue our site started giving "504 Gateway Time-out", and it was reported that almost everyone is getting this error, but when we used to browse the site, everything looked good and never 504. 504 Gateway Time-out error tells that, That the request went to Content Delivery servers of Sitecore from gateway, but gateway did not get response in time from those CDs and hence it gave time out error. ...