internal static ISitemapItem GetEntireTree(Sdl.Tridion.Api.Client.ApiClient client, ContentNamespace ns, int pubId, int requestLevels) { ISitemapItem root = client.GetSitemap(ns, pubId, requestLevels, null); if (root == null) { return(null); } List <ISitemapItem> leafNodes = GetLeafNodes(root); while (leafNodes.Count > 0) { TaxonomySitemapItem node = leafNodes[0] as TaxonomySitemapItem; leafNodes.RemoveAt(0); if (!node.HasChildNodes.HasValue || !node.HasChildNodes.Value) { continue; } var subtree = client.GetSitemapSubtree(ns, pubId, node.Id, requestLevels, Ancestor.NONE, null); if (node.Items == null) { node.Items = new List <ISitemapItem>(); } node.Items.AddRange(subtree[0].Items ?? new List <ISitemapItem>()); leafNodes.AddRange(GetLeafNodes(node)); } return(root); }
/// <summary> /// Prida element do sitemap /// </summary> /// <param name="item">Kolekcia poloziek</param> /// <returns>XML element do sitemap</returns> private XElement InternalCreateItemElement(ISitemapItem item) { var itemElement = new XElement(xmlns + "url", new XElement(xmlns + "loc", item.Url.ToLowerInvariant())); // all other elements are optional if (item.LastModified.HasValue) itemElement.Add(new XElement(xmlns + "lastmod", item.LastModified.Value.ToString("yyyy-MM-dd"))); if (item.ChangeFrequency.HasValue) itemElement.Add(new XElement(xmlns + "changefreq", item.ChangeFrequency.Value.ToString().ToLower())); if (item.Priority.HasValue) itemElement.Add(new XElement(xmlns + "priority", item.Priority.Value.ToString("F1", CultureInfo.InvariantCulture))); if (item.Images != null && item.Images.Count > 0) { foreach (var image in item.Images) { var element = new XElement(nsImage + "image", new XElement(nsImage + "loc", image.Url)); if (!String.IsNullOrWhiteSpace(image.Title)) { element.Add(new XElement(nsImage + "title", image.Title)); } if (!String.IsNullOrWhiteSpace(image.Caption)) { element.Add(new XElement(nsImage + "caption", image.Caption)); } itemElement.Add(element); } } return itemElement; }
private XElement CreateItemElement(ISitemapItem item) { XElement itemElement = new XElement(ns + "url", new XElement(ns + "loc", item.Url.ToLower())); if (item.LastModified.HasValue) { itemElement.Add(new XElement(ns + "lastmod", item.LastModified.Value.ToString("yyyy-MM-dd"))); } if (item.ChangeFrequency.HasValue) { itemElement.Add(new XElement(ns + "changefreq", item.ChangeFrequency.Value.ToString().ToLower())); } if (item.Priority.HasValue) { itemElement.Add(new XElement(ns + "priority", item.Priority.Value.ToString(CultureInfo.InvariantCulture))); } if (item.siteMapImg != null) { XElement imgEle = new XElement(nsImage + "image"); imgEle.Add(new XElement(nsImage + "loc", item.siteMapImg.img)); imgEle.Add(new XElement(nsImage + "caption", @"<![CDATA[" + WebUtility.HtmlDecode(item.siteMapImg.caption + "]]"))); itemElement.Add(imgEle); } return(itemElement); }
private XElement CreateItemElement(ISitemapItem item) { var itemElement = new XElement(xmlns + "url", new XElement(xmlns + "loc", item.Url.ToLowerInvariant())); // all other elements are optional if (item.LastModified.HasValue) { itemElement.Add(new XElement(xmlns + "lastmod", item.LastModified.Value.ToString("yyyy-MM-dd"))); } if (item.ChangeFrequency.HasValue) { itemElement.Add(new XElement(xmlns + "changefreq", item.ChangeFrequency.Value.ToString(). ToLower())); } if (item.Priority.HasValue) { itemElement.Add(new XElement(xmlns + "priority", item.Priority.Value.ToString("F1", CultureInfo.InvariantCulture))); } return itemElement; }
private XElement CreateItemElement(ISitemapItem item) { var itemElement = new XElement(xmlns + "url", new XElement(xmlns + "loc", item.Url.ToLowerInvariant())); // all other elements are optional if (item.LastModified.HasValue) { itemElement.Add(new XElement(xmlns + "lastmod", item.LastModified.Value.ToString("yyyy-MM-dd"))); } if (item.ChangeFrequency.HasValue) { itemElement.Add(new XElement(xmlns + "changefreq", item.ChangeFrequency.Value.ToString(). ToLower())); } if (item.Priority.HasValue) { itemElement.Add(new XElement(xmlns + "priority", item.Priority.Value.ToString("F1", CultureInfo.InvariantCulture))); } return(itemElement); }
internal static SitemapItem Convert(ISitemapItem item) { if (item == null) { return(null); } SitemapItem result = null; if (item is TaxonomySitemapItem) { result = new TaxonomyNode(); } else if (item is PageSitemapItem) { result = new SitemapItem(); } result.Type = item.Type; result.Title = item.Title; result.Id = item.Id; result.OriginalTitle = item.OriginalTitle; if (item.Visible.HasValue) { result.Visible = item.Visible.Value; } if (item.PublishedDate != null) { result.PublishedDate = DateTime.ParseExact(item.PublishedDate, "MM/dd/yyyy HH:mm:ss", null); } result.Url = item.Url; if (!(item is TaxonomySitemapItem)) { return(result); } TaxonomySitemapItem tsi = (TaxonomySitemapItem)item; TaxonomyNode node = (TaxonomyNode)result; node.Key = tsi.Key; node.ClassifiedItemsCount = tsi.ClassifiedItemsCount ?? 0; node.Description = tsi.Description; node.HasChildNodes = tsi.HasChildNodes.HasValue && tsi.HasChildNodes.Value; node.IsAbstract = tsi.Abstract.HasValue && tsi.Abstract.Value; if (tsi.Items == null || tsi.Items.Count <= 0) { return(result); } foreach (var x in tsi.Items) { result.Items.Add(Convert(x)); } return(result); }
private XElement CreateItemElement( ISitemapItem item ) { XElement itemElement = new XElement( xmlns + "url", new XElement( xmlns + "loc", item.Url.ToLower() ) ); if ( item.LastModified.HasValue ) itemElement.Add( new XElement( xmlns + "lastmod", item.LastModified.Value.ToString( "yyyy-MM-dd" ) ) ); if ( item.ChangeFrequency.HasValue ) itemElement.Add( new XElement( xmlns + "changefreq", item.ChangeFrequency.Value.ToString().ToLower() ) ); if ( item.Priority.HasValue ) itemElement.Add( new XElement( xmlns + "priority", item.Priority.Value.ToString( CultureInfo.InvariantCulture ) ) ); return itemElement; }
private XElement CreateItemElement(ISitemapItem item) { string url = item.Url.Substring(item.Url.Length - 1, 1).Contains("/") ? item.Url.ToLower() : item.Url.ToLower() + "/"; XElement itemElement = new XElement("url", new XElement("loc", url)); if (item.LastModified.HasValue) itemElement.Add(new XElement("lastmod", item.LastModified.Value.ToString("yyyy-MM-dd"))); if (item.ChangeFrequency.HasValue) itemElement.Add(new XElement("changefreq", item.ChangeFrequency.Value.ToString().ToLower())); if (item.Priority.HasValue) itemElement.Add(new XElement("priority", item.Priority.Value.ToString(CultureInfo.InvariantCulture))); return itemElement; }
internal static List <ISitemapItem> GetLeafNodes(ISitemapItem rootNode) { List <ISitemapItem> leafNodes = new List <ISitemapItem>(); if (!(rootNode is TaxonomySitemapItem)) { return(leafNodes); } TaxonomySitemapItem root = (TaxonomySitemapItem)rootNode; if (root?.HasChildNodes == null || !root.HasChildNodes.Value) { return(leafNodes); } if (root.HasChildNodes.Value && root.Items == null) { return new List <ISitemapItem> { root } } ; foreach (var item in root.Items) { TaxonomySitemapItem node = null; if (item is TaxonomySitemapItem) { node = item as TaxonomySitemapItem; } if (node?.HasChildNodes == null || !node.HasChildNodes.Value) { continue; } if (node.Items == null) { leafNodes.Add(node); } else { leafNodes.AddRange(GetLeafNodes(node)); } } return(leafNodes); }
/// <summary> /// Prida element do sitemap /// </summary> /// <param name="item">Kolekcia poloziek</param> /// <returns>XML element do sitemap</returns> private XElement InternalCreateItemElement(ISitemapItem item) { var itemElement = new XElement(xmlns + "url", new XElement(xmlns + "loc", item.Url.ToLowerInvariant())); // all other elements are optional if (item.LastModified.HasValue) { itemElement.Add(new XElement(xmlns + "lastmod", item.LastModified.Value.ToString("yyyy-MM-dd"))); } if (item.ChangeFrequency.HasValue) { itemElement.Add(new XElement(xmlns + "changefreq", item.ChangeFrequency.Value.ToString().ToLower())); } if (item.Priority.HasValue) { itemElement.Add(new XElement(xmlns + "priority", item.Priority.Value.ToString("F1", CultureInfo.InvariantCulture))); } if (item.Images != null && item.Images.Count > 0) { foreach (var image in item.Images) { var element = new XElement(nsImage + "image", new XElement(nsImage + "loc", image.Url)); if (!String.IsNullOrWhiteSpace(image.Title)) { element.Add(new XElement(nsImage + "title", image.Title)); } if (!String.IsNullOrWhiteSpace(image.Caption)) { element.Add(new XElement(nsImage + "caption", image.Caption)); } itemElement.Add(element); } } return(itemElement); }
private XElement CreateItemElement(ISitemapItem item) { var itemElement = new XElement(Utility.xmlns + "url", new XElement(Utility.xmlns + "loc", item.Url.ToLower())); if (item.LastModified.HasValue) { itemElement.Add(new XElement(Utility.xmlns + "lastmod", Utility.CreateXmlDate(item.LastModified))); } if (item.ChangeFrequency.HasValue) { itemElement.Add(new XElement(Utility.xmlns + "changefreq", item.ChangeFrequency.Value.ToString().ToLower())); } if (item.Priority.HasValue) { itemElement.Add(new XElement(Utility.xmlns + "priority", item.Priority.Value.ToString(CultureInfo.InvariantCulture))); } return itemElement; }
internal static void Prune(ISitemapItem root, int currentLevel, int descendantLevels) { var item = root as TaxonomySitemapItem; TaxonomySitemapItem tNode = item; if (tNode?.Items == null || tNode.Items.Count <= 0) { return; } if (currentLevel < descendantLevels) { foreach (var n in tNode.Items) { Prune(n, currentLevel + 1, descendantLevels); } } else { tNode.Items.Clear(); } }
private XElement CreateItemElement(ISitemapItem item) { XElement itemElement = new XElement("url", new XElement("loc", item.Url.ToLower())); if (item.LastModified.HasValue) { itemElement.Add(new XElement("lastmod", item.LastModified.Value.ToString("yyyy-MM-dd"))); } if (item.ChangeFrequency.HasValue) { itemElement.Add(new XElement("changefreq", item.ChangeFrequency.Value.ToString().ToLower())); } if (item.Priority.HasValue) { itemElement.Add(new XElement("priority", item.Priority.Value.ToString(CultureInfo.InvariantCulture))); } return(itemElement); }
private XElement CreateItemElement(ISitemapItem item) { string url = item.Url.Substring(item.Url.Length - 1, 1).Contains("/") ? item.Url.ToLower() : item.Url.ToLower() + "/"; XElement itemElement = new XElement("url", new XElement("loc", url)); if (item.LastModified.HasValue) { itemElement.Add(new XElement("lastmod", item.LastModified.Value.ToString("yyyy-MM-dd"))); } if (item.ChangeFrequency.HasValue) { itemElement.Add(new XElement("changefreq", item.ChangeFrequency.Value.ToString().ToLower())); } if (item.Priority.HasValue) { itemElement.Add(new XElement("priority", item.Priority.Value.ToString(CultureInfo.InvariantCulture))); } return(itemElement); }
internal static List <ISitemapItem> GetEntireTree(Sdl.Tridion.Api.Client.ApiClient client, ContentNamespace ns, int pubId, string parentSitemapId, bool includeAncestors, int requestLevels) { var rootsItems = client.GetSitemapSubtree(ns, pubId, parentSitemapId, requestLevels, includeAncestors ? Ancestor.INCLUDE : Ancestor.NONE, null); List <ISitemapItem> roots = rootsItems.Cast <ISitemapItem>().ToList(); if (roots.Count == 0) { return(new List <ISitemapItem>()); } List <ISitemapItem> tempRoots = new List <ISitemapItem>(roots); int index = 0; while (index < tempRoots.Count) { ISitemapItem root = tempRoots[index]; List <ISitemapItem> leafNodes = GetLeafNodes(root); foreach (var item in leafNodes) { TaxonomySitemapItem n = item as TaxonomySitemapItem; var children = client.GetSitemapSubtree(ns, pubId, n.Id, requestLevels, Ancestor.NONE, null); if (children == null) { continue; } n.Items = children[0].Items; List <ISitemapItem> leaves = GetLeafNodes(n); if (leaves == null || leaves.Count <= 0) { continue; } tempRoots.AddRange(leaves.OfType <TaxonomySitemapItem>().Select(x => x)); } index++; } return(roots); }
/// <summary> /// Replicate the behavior of the CIL implementation when it comes to requesting items rooted at /// a point with a specific depth level + include ancestors /// </summary> protected List <ISitemapItem> GetChildSitemapItemsInternal(string parentSitemapItemId, ILocalization localization, bool includeAncestors, int descendantLevels) { try { int pubId = localization.PublicationId(); ContentNamespace ns = localization.Namespace(); // Check if we are requesting the entire tree if (descendantLevels == -1) { var tree0 = SitemapHelpers.GetEntireTree(Client, ns, pubId, parentSitemapItemId, includeAncestors, _descendantDepth); // If parent node not specified we return entire tree if (parentSitemapItemId == null) { return(tree0); } // root node specified so return the direct children of this node List <ISitemapItem> items0 = new List <ISitemapItem>(); foreach (TaxonomySitemapItem x in tree0.OfType <TaxonomySitemapItem>()) { items0.AddRange(x.Items); } items0 = items0.OrderBy(i => i.OriginalTitle).ToList(); return(items0); } if (parentSitemapItemId == null && descendantLevels > 0) { descendantLevels--; } if (parentSitemapItemId == null) { // Requesting from root so just return descendants from root var tree0 = Client.GetSitemapSubtree(ns, pubId, null, descendantLevels, includeAncestors ? Ancestor.INCLUDE : Ancestor.NONE, null); return(tree0.Cast <ISitemapItem>().ToList()); } if (includeAncestors) { // We are looking for a particular item, we need to request the entire // subtree first var subtree0 = SitemapHelpers.GetEntireTree(Client, ns, pubId, parentSitemapItemId, true, _descendantDepth); // Prune descendants from our deseried node ISitemapItem node = SitemapHelpers.FindNode(subtree0, parentSitemapItemId); SitemapHelpers.Prune(node, 0, descendantLevels); return(subtree0); } var tree = Client.GetSitemapSubtree(ns, pubId, parentSitemapItemId, descendantLevels, Ancestor.NONE, null); List <ISitemapItem> items = new List <ISitemapItem>(); foreach (TaxonomySitemapItem x in tree.Where(x => x.Items != null)) { items.AddRange(x.Items); } items = items.OrderBy(i => i.OriginalTitle).ToList(); return(items); } catch (GraphQLClientException e) { const string msg = "PCA client returned an unexpected response when retrieving child sitemap items for sitemap id {0}."; Log.Error(msg, parentSitemapItemId, e.Message); throw new DxaException(string.Format(msg, parentSitemapItemId), e); } catch (ApiException) { } return(new List <ISitemapItem>()); }
public virtual ActionResult Navigation(ISitemapItem model, string view) { return(View(view ?? "TopNavigation", model)); }
private XElement CreateNewsItemElement(ISitemapItem item) { var newsItem = (NewsSitemapItem)item; var itemElement = new XElement(xmlns + "url", new XElement(xmlns + "loc", item.Url.ToLowerInvariant())); // all other elements are optional if (item.LastModified.HasValue) { itemElement.Add(new XElement(xmlns + "lastmod", item.LastModified.Value.ToString("yyyy-MM-dd"))); } if (item.ChangeFrequency.HasValue) { itemElement.Add(new XElement(xmlns + "changefreq", item.ChangeFrequency.Value.ToString().ToLower())); } if (item.Priority.HasValue) { itemElement.Add(new XElement(xmlns + "priority", item.Priority.Value.ToString("F1", CultureInfo.InvariantCulture))); } var elem = new XElement(newsXsi + "news"); var newsPublication = new XElement(newsXsi + "publication"); elem.Add(newsPublication); if (!String.IsNullOrEmpty(newsItem.PublicationName)) { newsPublication.Add(new XElement(newsXsi + "name", newsItem.PublicationName)); } if (!String.IsNullOrEmpty(newsItem.PublicationLanguage)) { newsPublication.Add(new XElement(newsXsi + "language", newsItem.PublicationLanguage)); } if (!String.IsNullOrEmpty(newsItem.Title)) { elem.Add(new XElement(newsXsi + "title", newsItem.Title)); } if (!String.IsNullOrEmpty(newsItem.Access)) { elem.Add(new XElement(newsXsi + "access", newsItem.Access)); } if (!String.IsNullOrEmpty(newsItem.Keywords)) { elem.Add(new XElement(newsXsi + "keywords", newsItem.Keywords)); } if (!String.IsNullOrEmpty(newsItem.StockTickers)) { elem.Add(new XElement(newsXsi + "stock_tickers", newsItem.StockTickers)); } if (newsItem.PublicationDate.HasValue) { elem.Add(new XElement(newsXsi + "publication_date", newsItem.PublicationDate.Value.ToString("yyyy-MM-dd"))); } itemElement.Add(elem); return(itemElement); }
public Task BindModelAsync(ModelBindingContext bindingContext) { bindingContext.ThrowIfNull(nameof(bindingContext)); ISitemapItem model = null; //navType & navLevels are set on the 'RouteData' Metadata field on the component template. //and passed as routeparameters to the action. string navType = null; int navLevels = 0; int navStartLevel = -1; ValueProviderResult value = bindingContext.ValueProvider.GetValue("navType"); ValueProviderResult navLevelsResult = bindingContext.ValueProvider.GetValue("navLevels"); ValueProviderResult navStartLevelResult = bindingContext.ValueProvider.GetValue("navStartLevel"); if (value.Any()) { navType = value.FirstValue; } string requestUrlPath = bindingContext.HttpContext.Request.Path.Value; ////Filename should be removed. the data published from Tridion doesnt include the filename into the url's ////i.e. for url '/product/index.html' published content from Tridion contains: '/products/' //var fileName = Path.GetFileName(requestUrlPath); //if (!fileName.IsNullOrEmpty()) // requestUrlPath = requestUrlPath.Replace(fileName, string.Empty); if (navLevelsResult.Any()) { int.TryParse(navLevelsResult.FirstValue, out navLevels); } if (navStartLevelResult.Any()) { int.TryParse(navStartLevelResult.FirstValue, out navStartLevel); } //generate a Cache key for the current model. //try to get model out of HttpContext.Items[], incase the same model is request multiple times during //a single request. string key = MODEL_KEY_FORMAT.FormatString(navType, requestUrlPath, navLevels, navStartLevel); model = bindingContext.HttpContext.Items[key] as ISitemapItem; if (model == null) { switch (navType?.ToLower()) { case "children": model = _navigationProvider.GetChildren(requestUrlPath, navLevels, navStartLevel); break; case "path": model = _navigationProvider.GetPath(requestUrlPath); break; default: model = _navigationProvider.GetAll(navLevels); break; } bindingContext.HttpContext.Items[key] = model; } //Todo: WTF... this doesn't make sense; Bug in Microsoft.AspNetCore.Mvc??? bindingContext.Result = ModelBindingResult.Success(model); //Todo: implemenet async return(Task.FromResult(ModelBindingResult.Success(model))); }