In most of the case we might need to consider or facet based on parent element of a category.
- Products
- Sports
- Football
- Cricket
- Tennis
- Electronics
- Mobile
- Laptop
- Television
- Apparels
- Men’s wear
- Women’s wear
- Sports
Now lets say you’re using a Tree List field in a template to assign all types of Products and you’ve to filter based on 1st level of categories i.e, Sports – Electronics and Apparels and store in index.
Lets see how it is done,
-
- Create Computed Categories class to store all category details with its parent name
public class Products : ComputedField { public override ID TagsSelector { get { return new ID("{DC222D36-302A-492C-BFCA-71064B3D8B37}"); } } } public class SportsCategory : ComputedField { public override ID TagsSelector { get { return new ID("{DC222D36-302A-492C-BFCA-71064B3D8B37}"); } } public override string ParentName { get { return "Sports"; } } } public class ElectronicsCategory : ComputedField { public override ID TagsSelector { get { return new ID("{DC222D36-302A-492C-BFCA-71064B3D8B37}"); } } public override string ParentName { get { return "Electronics"; } } } public class ApparelsCategory : ComputedField { public override ID TagsSelector { get { return new ID("{DC222D36-302A-492C-BFCA-71064B3D8B37}"); } } public override string ParentName { get { return "Apparels"; } } }
- Resolve in computed field based on its parent name
- Create Computed Categories class to store all category details with its parent name
public abstract class ComputedField : IComputedIndexField { public virtual ID TagsSelector { get; set; } //Keeping it simple - Category Name public virtual string ParentName { get; set; } public virtual object ComputeFieldValue(IIndexable indexable) { var indexableItem = indexable as SitecoreIndexableItem; if (string.IsNullOrEmpty(ParentName)) return indexableItem == null || TagsSelector.IsNull ? null : string.Join("|", indexableItem.Item.GetMultiListValues(TagsSelector).Select(tag => (tag.Fields["Name"] != null ? tag.Fields["Name"].Value : tag.Name))); else return indexableItem == null || TagsSelector.IsNull ? null : indexableItem.Item.GetMultiListValues(TagsSelector).Where(x => x.Parent.Name == ParentName).Select(tag => tag.Name).ToList(); } public string FieldName { get; set; } public string ReturnType { get; set; } }
Finally add in config
Namespace.ProductsCategory, Namespace Namespace.SportsCategory, Namespace Namespace.ApparelsCategory, Namespace Namespace.ElectronicsCategory, Namespace
Now data will get indexed based on parents.