0 Comments

 

Recently, I’ve been working on Sitecore commerce project. In the post below, I’m going to share the experience about how I troubleshoot the issue and get it solved eventually.

Issue

The issue I encountered in creating a commerce user.  customerServiceProvider “createUser” throws an exception

An element with the specified key already exists., however the commerce user and sitecore user were successfully created. So WHY?

 

Troubleshooting

The initial suspicion was there are some duplications in the database. so I double checked UserObject table, the Addresses table (because I also add billing address and shipping address for the user), as well as the aspnet_Users table in Core database.   Unfortunately they all looks clean and right, no duplications.

Then I thought that maybe there are some other tables gets updated while creating a new user, so I opened the “SQL Server Profiler” tool trying to track all the database queries.  NO luck.

 

an-idea

Ultimately, I found the issue. it was because when delete a user in Sitecore, it does delete both commerce user and Sitecore user, BUT not contacts in xDB.  Just for the proof of concept, I removed the contact and identifier from xDB. Bingo! It fixed the issue.

0 Comments

Today while doing self-testing, I found that OTB facet filter component doesn't work as expected. After digging into the code, it is surely a Sitecore SXA bug.  Therefore,  I decided to share this and hope this can help you to understand the issue and quickly solve it.   

What’s the issue?

The screenshot below, it has 3 properties, and I assigned different property type for each of them (for testing purpose).  The expected result would be Apartment(1), House and Land(1) and Townhouse (1). However, it is indicating (2) items per type?  Why?!

image

My first question was that is this because of multi-languages? After looking into the code, I found the answer, it’s because the facet component ONLY takes the search scope as its search criteria, which means the results contains multiple items with different language.

image

Here is the screenshot for the index,  As you can see It has two items with the lottype equals to “House and Land”, one is Chinese version and the other is English version.  That’s why the facet indicates (2) items per type in the example above. This bug could cause the discrepancy between search results and facet filtering, if you are implementing multi-language website.

image

Fortunately, This bug has been fixed in SXA 1.6, for all previous version please create a ticket in support portal for  requesting the patch for your SXA version.

0 Comments

Creating a static 500 error page is not something new. SXA provides this feature out of the box.  However, when the first time seeing the settings in SXA, I was thinking why SXA 500 page is configured in CMS. 500 error could be caused by an server error, or database error which means CMS may not be accessible.  Why?  Today,  one of the colleagues asked me the same question, and

Unfortunately, Rare information can be found on the Sitecore documentation site.  After spending an hour looking into the code, we totally understand how it was designed. 

image

Here are the steps to make 500 error page working in SXA:

  1. Configure the Server Error Page – Linking to error page item
  2. Select the “Site Definition” item
    image
  3. Once you click on the Site definition item, the “Error handling” menu will appear in the ribbon
    image
  4. Click on “Generate static error page” button (as shown above)
  5. It will popup an confirmation dialog
    image
  6. Click “Ok” then going to the root of your website in which you can find “ErrorPages”, and the static error page is automatically generated in this folder.
    image

 

When an error occurs, user will be redirected to this static error page. This magic can be found the ErrorHandling pipelines.

image

Overall, I will say it is well designed, although there is a bit of flaw in the above code -  it doesn’t handle the response status.  The Server.TransferRequests does not change the status code, it passes control of the request on to another page without telling the client.  However you can always manually set the status code to 500 by overriding the flaw Process method.

0 Comments

SXA provides the ability for optimizing CSS styles and JavaScript via SXA Asset Optimizer. If you want to know more about what the Asset Optimizer is you can check out here.

However,  we found a bug in the Asset Optimizer, which stripes out the key/reserved words i.e. (switch, for, imports etc..) in CSS styles during minifying in all the versions of SXA, apart from SXA 1.6.

Given the complexity for fixing this issue, Stiecore support suggested to either disable the optimizer or upgrade to SXA 1.6, if you are facing the same issue.

0 Comments

variant

In this post,  I'm going to explain some advanced features of SXA – Rendering Variant as well as how to apply custom rules for a variant field.

What is rendering variant?

Out-of-box Sitecore SXA provides a set of variants that come with renderings that support them. In the past, if a component, e.g. carousel, are rendering differently in design, most likely you will create a different rendering controller in back-end.  Fortunately, SXA solved this issue perfectly with rendering variants.  Rendering variants allows you to create one controller with many variants.  For example, the list rendering can have different variants for: detailed lists, thumbnails list, and a carousel.  For more details you can find here.

 

How to create rendering variant?

Out-of-box rendering variants are located under “/sitecore/content/Mirvac/RetailLeasing/HelloSydney/Presentation/Rendering Variants”

image

Each of the variant components has its own associated variants. The variant is associated with component by name convention. i.e. component “Search Results” is associating with “Search Results” variants.

Out-of-box Stiecore allows you add 9 types of variant fields which includes Date, Field, Query, Placeholder, Reference, Section, template Text, and Token. To keep it simple, I’m going to use “Field” variant field. Once you are familiar with rendering variant, I will explain the more advanced fields i.e. template, reference, token, in my future post =).

image

There are two important fields for adding a “Field” variant field, which are “Tag” and “Field name”. Tag is the html tag for the specific field. Field name is the field name of the data you want to rendering on the page. For instance, you want to render  title in a div on the page, the Tag will be “Div”, and Field name will be “Title”.

image

 

How to Apply rendering variant to component?

Once you finished creating your variant, the next step is to associate with the component on the page. In the dropdown list, select the one you would like to apply to the current page.

image

 

That’s all you need, simple right? In some cases, you might want to show/hide the field based on a certain condition. For instance, only showing a filed on Chinese site.  What you can do is to apply a rule for the rendering field. In the rest of the post, I will explain how to apply a custom rule to a variant field.

How to apply custom rule for a variant field?

Of course, for applying a rule, you will need a rule first. If there is no existing rules fits your requirement, you can create your own rules. It’s same as the way you used to create rules for personalization.

Here is the steps for creating a custom rule:

  1. Create a “Rules context folder” under /sitecore/system/Settings/Rules.
  2. Create a “Element Folder” under /sitecore/system/Settings/Rules/Definitions/Elements.
  3. Create a condition under the “Element Folder”  created above.
  4. Find “Default” tags definition under the “Element Folder” and select the tags you want to associated with i.e. Fields, GeoIP etc..
  5. Find “Default” tags definition under “Rules context folder”, and select the tags selected above.

Once you’ve done the steps, you will need to find the variant field that  you want to apply the rule as an example shown in below screenshot. After that, the field will be rendering based on the rule condition.

image