public virtual ActionResult GetNavigationSubtree(string sitemapItemId) { using (new Tracer(sitemapItemId)) { NavigationFilter navFilter = new NavigationFilter { IncludeAncestors = GetRequestParameter <bool>("includeAncestors") }; int descendantLevels; if (TryGetRequestParameter("descendantLevels", out descendantLevels)) { navFilter.DescendantLevels = descendantLevels; } IOnDemandNavigationProvider onDemandNavigationProvider = SiteConfiguration.NavigationProvider as IOnDemandNavigationProvider; if (onDemandNavigationProvider == null) { Log.Warn("Request for Navigation subtree received, but current Navigation Provider ({0}) does not implement interface {1}", SiteConfiguration.NavigationProvider.GetType().Name, typeof(IOnDemandNavigationProvider).Name); return(new EmptyResult()); } IEnumerable <SitemapItem> model = onDemandNavigationProvider.GetNavigationSubtree(sitemapItemId, navFilter, WebRequestContext.Localization); return(Json(model, JsonRequestBehavior.AllowGet)); } }
public SitemapItem SiteMap(Common.Configuration.Localization localization) { return(SiteConfiguration.CacheProvider.GetOrAdd( $"sitemap-{localization.Id ?? "full"}", CacheRegion.Sitemap, () => { // Workaround: Currently the content service is not returning a sitemap for Docs only content // so the workaround is for each publication get the entire subtree and merge the results. // This will cause several requests to be issued and results in quite a slow performance. IOnDemandNavigationProvider provider = SiteConfiguration.NavigationProvider as IOnDemandNavigationProvider; if (provider == null) { return null; } NavigationFilter navigationFilter = new NavigationFilter { DescendantLevels = -1, IncludeAncestors = false }; List <SitemapItem> sitemapItems = new List <SitemapItem>(); if (!string.IsNullOrEmpty(localization?.Id)) { sitemapItems.AddRange(provider.GetNavigationSubtree(null, navigationFilter, localization)); } else { var pubs = new PublicationProvider().PublicationList; foreach (var pub in pubs) { var items = provider.GetNavigationSubtree(null, navigationFilter, new DocsLocalization(int.Parse(pub.Id))); foreach (var item in items) { sitemapItems.AddRange(item.Items); } } } return new SitemapItem { Items = FixupSitemap(sitemapItems, false, false) }; })); }
public IEnumerable <SitemapItem> GetToc(int publicationId, string sitemapItemId, bool includeAncestors, int descendantLevels) { bool caching = ServiceCacheProvider.Instance.DisableCaching; ServiceCacheProvider.Instance.DisableCaching = true; IOnDemandNavigationProvider onDemandNavigationProvider = SiteConfiguration.NavigationProvider as IOnDemandNavigationProvider; NavigationFilter navigationFilter = new NavigationFilter { DescendantLevels = descendantLevels, IncludeAncestors = includeAncestors }; ILocalization localization = WebRequestContext.Localization; localization.Id = publicationId.ToString(); var result = onDemandNavigationProvider.GetNavigationSubtree(sitemapItemId, navigationFilter, localization); ServiceCacheProvider.Instance.DisableCaching = caching; return(result); }
public IEnumerable <SitemapItem> GetToc(Common.Configuration.Localization localization, string sitemapItemId, bool includeAncestors, int descendantLevels) { return(SiteConfiguration.CacheProvider.GetOrAdd( $"toc-{localization.Id}-{sitemapItemId}-{includeAncestors}-{WebRequestContext.CacheKeySalt}", CacheRegion.Toc, () => { new PublicationProvider().CheckPublicationOnline(int.Parse(localization.Id)); IOnDemandNavigationProvider provider = SiteConfiguration.NavigationProvider as IOnDemandNavigationProvider; NavigationFilter navigationFilter = new NavigationFilter { DescendantLevels = descendantLevels, IncludeAncestors = includeAncestors }; var sitemapItems = provider.GetNavigationSubtree(sitemapItemId, navigationFilter, localization).ToList(); if (sitemapItems.Count == 0) { throw new DxaItemNotFoundException("No sitemap items found."); } if (includeAncestors) { // if we are including ancestors we also need to get all the direct siblings for each // level in the hirarchy. SitemapItem node = FindNode(sitemapItems, sitemapItemId); // for each parent node get sibling nodes while (node.Parent != null) { var siblings = provider.GetNavigationSubtree(node.Parent.Id, new NavigationFilter { DescendantLevels = 1, IncludeAncestors = false }, localization); HashSet <string> children = new HashSet <string>(); foreach (var item in node.Parent.Items) { children.Add(item.Id); } // filter out duplicates and Page types since we don't wish to include them in TOC foreach ( var sibling in siblings.Where( sibling => sibling.Id != node.Id && sibling.Type != "Page" && !children.Contains(sibling.Id))) { node.Parent.Items.Add(sibling); } node = node.Parent; } } return FixupSitemap(sitemapItems, true, true); })); }