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

Sitecore Technical Workshops - Top FAQs customers asked on XM Cloud

Hi Readers, I want to talk to you about interesting things which we have been doing which is "Technical Workshops" for our customers, so here goes the scenarios. So, we have been doing multiple types of technical workshops.  1) Training customer and their Sitecore technical team on latest and the greatest technologies like XM Cloud & Another composable stack and try enabling them for new Sitecore tech stack. 2) Customers / Potential Customers have their agenda of existing pain points, and we take a workshop on topics around them with best practices etc. little on new technologies, so they also know the future. Basically, we prepare custom targeted presentations & demos for individual workshops, and make sure it helps them answer their questions and they get insights of where Sitecore eco systems has to offer from their versatile toolset and try to keep them up to date with it. So, Purpose of this blog is, because in all these customer & their technical team's

An error occurred while receiving the HTTP response to This could be due to the service endpoint binding not using the HTTP protocol. This could also be due to an HTTP request context being aborted by the server (possibly due to the service shutting down). See server logs for more details.

You have noticed many times that everything was working fine and suddenly the below error starts coming and you find no way to work it out An error occurred while receiving the HTTP response to This could be due to the service endpoint binding not using the HTTP protocol. This could also be due to an HTTP request context being aborted by the server (possibly due to the service shutting down). See server logs for more details. The reason for this is the receiving size of WCF service is smaller then the data which is coming from service It was working before because it was small,So you will have to try to increase the receiving setting in your end point,Possible settings can be following maxStringContentLength="2147483647" maxReceivedMessageSize="2147483647" maxBufferSize="2147483647" maxArrayLength="2147483647" That would definately help you!!!

Set up leprechaun code generation with Sitecore XM Cloud Starterkit

Hi Sitecorians, It has been amazing learning year so far and with the change in technology and shift of the focus on frontend frameworks and composable products, it has been market demand to keep learning and exploring new things. Reasons behind this blog Today's topic is something that was in my draft from April-May, and I always thought that there is already a good documentation out there for  Leprechaun  and a blog post is not needed, Until I realized that there was so many of us facing same kind of issues and same kind of problems and spending same amount of time, That is where I thought, if I could write something which can reduce that repetitive troubleshooting time, That would really help the community. 1)  In a project environment, if we get into some configuration issues, we resolve them, we make sure we are not blocked and continue, but if you think same issue, same step and same scenario will come to other people, so if we can draft it online, it will help other people 2