Recently I happened to help one of our clients to create a custom Multilist field that gives you selecting options only if item has at least one translated version in a current content language. From content author’s point of view it makes a lot of sense. Why to give them an option that is not useful?
It’s being a while since I created a custom field that has to take into account content language selection. The main challenge for me was to retrieve that content language. I did remember that there is a property that the Content Editor (CE) sets at run-time for every field but could not recall its name. So after several minutes of browsing my code storage of all samples for all Sitecore versions, I finally found it. So, here are the properties that you need to define in your custom field if you are planning to use them afterwards:
- ItemLanauage – represents a content language selected in the CE.
- ItemID – contains the item ID the field belongs to.
- ItemVersion – contains selected item version.
- ReadOnly – indicates if field is a readonly. If it is, then it will be grayed out and not editable.
- Source – represents the source value from field definition on a data template.
- FieldID – contains the field ID.
In my example I needed only ItemLanguage property. When I put things together the code looked like this:
public class LanguageFilteredMultilist : Sitecore.Shell.Applications.ContentEditor.MultilistEx
protected override Item GetItems(Item current)
Item items = base.GetItems(current);
var filteredItems = items.Where(item =>
string lang = ItemLanguage;
var versions = Sitecore.Data.Managers.ItemManager.GetVersions(item, Sitecore.Data.Managers.LanguageManager.GetLanguage(lang, item.Database));
return versions.Count > 0;
// Content Editor sets this property. It has a content language from the Content Editor.
public string ItemLanguage
Simple enough isn’t it. Don’t forget to add your custom field to /App_Config/FieldTypes.config file if it’s supposed to contain references to other items. In my case it should be added since it’s a multilist. If you forget to do it, the LinkDatabase won’t update references for your field.
That’s all for now.