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

September 17, 2019 ·

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 :) 


Create a new environment in business tool of sitecore commerce

June 30, 2019 ·

Create a new environment in business tool of sitecore commerce

Hello Friends,

Recently, We have been working with the project which has sitecore commerce functionalities, One of the object in sitecore commerce is it's environment, It comes up with some default environments like

"AdventureWorksAuthoring","AdventureWorksShops,"HabitatAuthoring","HabitatShops"


Now it is obvious need of a project to have its own environment, So that all e-Commerce entities can be defined for that project in its own environment, Consider you are creating e-commerce site for electronic items for one of your client, you will need your own environment here so you can have catalogs, inventory, customers separately.

By default sitecore commerce does not provide a way to create the new environment or nor have a post man API call via which we can create these new environments.

How
Let's quickly see the steps how can you have your own environment set up, These are  manual steps but can be automated using proxy APIs but lets see the manual steps below

1)  Go to wwwroot folder where commerce is installed you will see four folder for their roles like following


2)      Now go to CommerceAuthering_Sc9 folder on following path (names will be different as per your environment)
C:\inetpub\wwwroot\CommerceAuthoring_Sc9\wwwroot\data\Environments

3)      Copy
  1. "PlugIn.Habitat.CommerceAuthoring-1.0.0.json"
  2. "PlugIn.Habitat.CommerceMinions-1.0.0"
  3. "PlugIn.Habitat.CommerceShops-1.0.0.json"
And paste it in the same folder so you will have copy of these files now rename this file to the desire name for example
  1. "PlugIn.MyEnv.CommerceAuthoring-1.0.0.json"
  2. "PlugIn.MyEnv.CommerceMinions-1.0.0”
  3. "PlugIn.MyEnv.CommerceShops-1.0.0.json"

4)      Open PlugIn.MyEnv.CommerceAuthoring-1.0.0.json and change following properties
  1. ArtifactStoreId - to a new GUID - this would be the same for a given set of environments (authoring, shops and minions)
  2. Id - to a new ID (the efe49ff743d34b649fffcof293615cd9MyEnv)
  3. Id - to a new name (the Entity-CommerceEnvironment-MyEnv)
  4. Name - a new environment name like "MyEnv"
InitialArtifactSets - as follows


 NOTE: if you observe and compare our files with default habitat files, we have removed some artifact so that we can have completely blank environment.

5)  Make sure to change the GUID and id for other two files too, those two files should also have the same GUID and id but names should be different.
6)  Once the files are changed, you can copy those three files over to other three folders on wwwroot , On step-1 we showed four folders and one of them we did all above changes, so remaining three folders should also have those files which we created.
7)  Edit the global.json file situated on

C:\inetpub\wwwroot\CommerceAuthoring_Sc9\wwwroot\bootstrap\global.json
C:\inetpub\wwwroot\CommerceMinions_Sc9\wwwroot\bootstrap\global.json
C:\inetpub\wwwroot\CommerceOps_Sc9\wwwroot\bootstrap\global.json
C:\inetpub\wwwroot\CommerceShops_Sc9\wwwroot\bootstrap\global.json

Add the new environment to the list of existing environments like following




 Make the changes in all above global.json file

Making an API calls
Aafter above steps there is a need to make some calls to commerce API so that we can bootstrap, and initialize the environment, those steps are following
1)      In postman where you already configured the habitat environment, duplicate the environment and call it something else of your choice and change the global variable to match it with our new environment like following



Above values should match against what you configured in the .json file

2)      Now select this environment in postman and make following calls
  1. GetToken - under authentication
  2. Bootstrap Sitecore Commerce - under SitecoreCommerce_DevOps
  3. Initialize Environment - under SitecoreCommerce_DevOps

3)      All the calls should succeeded and should return 200 OK result, else you will need to troubleshoot the errors by looking into the logs on following folders.

You might get 500 internal errors for the calls if you are making it via postman, in that case you will need to turn “AntiForgeryEnabled=false” in “config.json” file inside wwwroot folder.

C:\inetpub\wwwroot\CommerceShops_Sc9\wwwroot\logs
C:\inetpub\wwwroot\CommerceOps_Sc9\wwwroot\logs
C:\inetpub\wwwroot\CommerceMinions_Sc9\wwwroot\logs
C:\inetpub\wwwroot\CommerceAuthoring_Sc9\wwwroot\logs

4)      If all calls are fine, you should see the new clean environment like following



You can start creating catalogs and customers specific to your environment now

Hope it help.