Filtering ContentLocationInfo items in custom widget
Hi all,
We developed a custom accordion widget, that can display multiple accordion items (using bootstrap accordion) using Sitefinity Feather.
To manage the accordions and their items, we created a custom module, with a parent-child relationship (Accordion -> AccordionContent). In the backend view of the custom module, we now would like to show, on which pages the accordion/accordion content is used. For this, we implemented IContentLocatableView in our AccordionController:
public class AccordionController : Controller, IContentLocatableView public Guid AccordionId get; set; public ActionResult Index() //get accordion by AccordionId with DynamicModuleManager and return view... public bool? DisableCanonicalUrlMetaTag get; set; [NonAction] public IEnumerable<IContentLocationInfo> GetLocations() var locations = new List<ContentLocationInfo>(); var manager = DynamicModuleManager.GetManager(); var accordionType = TypeResolutionService.ResolveType("Telerik.Sitefinity.DynamicTypes.Model.Teasers.Accordion"); var accordion = manager.GetItem(accordionType, this.AccordionId) as DynamicContent; //THIS fails, as this.AccordionId is not set. var accordionLocationInfo = new ContentLocationInfo() ContentType = accordionType, ProviderName = manager.Provider.Name ; //create a filter expression that only includes the accordion with the correct Id var filterExpression = string.Format("(Id = 0 OR OriginalContentId = 0)", accordion.OriginalContentId.ToString("D")); accordionLocationInfo.Filters.Add(new BasicContentLocationFilter(filterExpression)); locations.Add(accordionLocationInfo); //also add all child items of accordion (= AccordionContent) var accordionContentType = TypeResolutionService.ResolveType("Telerik.Sitefinity.DynamicTypes.Model.Teasers.AccordionContent"); var accordionContentLocationInfo = new ContentLocationInfo() ContentType = accordionContentType, ProviderName = manager.Provider.Name ; //create a filter expression to filter the AccordionContent by parent Id var contentFilterExpression = string.Format("(Parent.Id = 0 OR Parent.OriginalContentId = 0)", accordion.OriginalContentId.ToString("D")); accordionContentLocationInfo.Filters.Add(new BasicContentLocationFilter(contentFilterExpression)); locations.Add(accordionContentLocationInfo); return locations; Hello Matthias, Thank you for contacting Sitefinity support. In order the properties to be populated when the IContentLocatableView methods are executed, the properties should be part of the Model. Sample code Controller: using SitefinityWebApp.Mvc.Models; using System.Collections.Generic; using System.ComponentModel; using System.Web.Mvc; using Telerik.Sitefinity.ContentLocations; using Telerik.Sitefinity.Modules.News; using Telerik.Sitefinity.Mvc; using Telerik.Sitefinity.News.Model; namespace SitefinityWebApp.Mvc.Controllers [ControllerToolboxItem(Name = "NewsWidget", Title = "NewsWidget", SectionName = "MvcWidgets")] public class NewsWidgetController : Controller, IContentLocatableView [TypeConverter(typeof(ExpandableObjectConverter))] public NewsWidgetModel Model get if (this.model == null) this.model = new NewsWidgetModel(); return this.model; public bool? DisableCanonicalUrlMetaTag get; set; /// /// This is the default Action. /// public ActionResult Index() return View("Default"); public IEnumerable GetLocations() string itemTitle = this.Model.Title; if (string.IsNullOrEmpty(itemTitle)) return null; var locations = new List(); var providerName = NewsManager.GetManager().Provider.Name; var listItemsLocation = new ContentLocationInfo() ContentType = typeof(NewsItem), ProviderName = providerName ; string filter = string.Empty; filter = @"Title = """ + itemTitle + @""""; listItemsLocation.Filters.Add(new BasicContentLocationFilter(filter)); locations.Add(listItemsLocation); return locations; private NewsWidgetModel model; Model: using System; namespace SitefinityWebApp.Mvc.Models public class NewsWidgetModel public string Title get; set; For Ids use the OriginalContentId property. I have updated the forum thread as well. Regards, Nikola Zagorchev Telerik by Progress