A while ago I wrote about how you should be aware of IContentLoader.GetChildren<T>(contentLink)
here. However, that is only half of story.
IContentLoader.Get<T>(contentLink)
is also considered harmful. Not in terms of it causes damage to your site (we would never, ever let that happen), nor it is slow (not unless you abuse it), but because it can behave very unexpectedly.
As you might already know, catalog content fully supports language versions, which means a catalog might have multiple languages enabled, and each and every catalog item in that catalog (node/category, and entry) will be available in those languages. However, those languages are not equal, (only) one is master language. What’s the difference then?
One of very important characteristics of that is how it affects the properties. Properties with [CultureSpecific]
attribute decorated will be different in each language, and therefore, can be edited in each language. Properties without [CultureSpecific]
attribute decorated will be the same in all languages, and can only be edited in master language. In Catalog UI, if you switch to non master languages, those properties will be grayed out, indicating they can’t be edited.
Now, why IContentLoader.Get<T>(contentLink)
is considered harmful? Because you don’t supply a CultureInfo
to let it know which version you want, it relies on the current preferred language to load the content. And if you have a catalog which has master language that is different from the current preferred language, you are loading a non-master language version. And then if you try to edit a non [CultureSpecific]
property, then save it, the changes will not be saved, without error or warning.
It then will be very confusing because it sometimes works (someone changes the current preferred language that matches the catalog master language, and sometimes it doesn’t.
Which can cost you hours, if not days, to figure out what is wrong with your code.
Same thing applies to IContentLoader.TryGet<T>(contentLink)
Solution? Always use the overload that takes a CultureInfo
or a LoaderOptions
parameter, even if you just want to read the content. That creates a “good” habit and you can quickly spot code that might be problematic.
Use this to load master language version, if you wish to update some non CultureSpecific
property.
new LoaderOptions() { LanguageLoaderOption.MasterLanguage() }
Later versions of Commerce will log a warning if you are trying to save a non master language version with one or more changed non
[CultureSpecific]
properties.