Пример #1
0
        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);
        }
Пример #4
0
        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;
        }
Пример #5
0
        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);
        }
Пример #6
0
        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);
        }
Пример #7
0
        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;      
        }
Пример #8
0
        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;
        }
Пример #9
0
        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);
        }
Пример #11
0
        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;
        }
Пример #12
0
        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);
        }
Пример #14
0
        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);
        }
Пример #15
0
        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>());
        }
Пример #17
0
 public virtual ActionResult Navigation(ISitemapItem model, string view)
 {
     return(View(view ?? "TopNavigation", model));
 }
Пример #18
0
        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);
        }
Пример #19
0
        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)));
        }