Example #1
0
        public SyndicationFeedContext(SyndicationFeedPageType feedPageType, List <Category> categoriesFilter)
        {
            FeedPageType     = feedPageType;
            CategoriesFilter = feedPageType.CategoryFilter ?? new CategoryList();

            AddContextCategories(categoriesFilter);
        }
        /// <summary>
        /// Gets a list of populated syndication items created from the dependent content references on the gived SyndicationFeedPage.
        /// </summary>
        /// <returns></returns>
        public IEnumerable<SyndicationItem> GetSyndicationItems(SyndicationFeedPageType feedPage)
        {
            FeedPage = feedPage;

            var contentReferences = FeedContentResolver.GetContentReferences(FeedPage);
            var contentItems = ContentLoader.GetItems(contentReferences, new LoaderOptions {LanguageLoaderOption.Fallback()});
            var filteredItems = FeedFilterer.FilterSyndicationContent(contentItems, FeedPage);
            var syndicationItems = filteredItems.Select(CreateSyndicationItem).ToList();

            return syndicationItems.OrderByDescending(c => c.LastUpdatedTime).Take(FeedPage.MaximumItems);
        }
        public virtual IEnumerable<IContent> FilterSyndicationContent(IEnumerable<IContent> syndicationContentItems, SyndicationFeedPageType feedPage)
        {
            //filter editor set excluded types
            var excludedAllTypes = ParseExcludedIds(feedPage.ExcludedContentTypes);
            var filteredItems = syndicationContentItems.Where(c => !excludedAllTypes.Contains(c.ContentTypeID)).ToList();

            //filter by category
            if (feedPage.CategoryFilter != null)
            {
                if (!feedPage.CategoryFilter.IsEmpty)
                {
                    filteredItems = filteredItems
                        .Where(c => c is ICategorizable)
                        .Where(c => ((ICategorizable) c).Category.MemberOfAny(feedPage.CategoryFilter)).ToList();
                }
            }

            //block types are alkways removed by filter for visitor. We want to see them and respect access rights
            var currentlyFiltered = new IContent[filteredItems.Count];
            filteredItems.CopyTo(currentlyFiltered);
            
            //filter by published, access and template
            var published = ServiceLocator.Current.GetInstance<IPublishedStateAssessor>();
            var access = (IContentFilter) new FilterAccess();
            var template = (IContentFilter) new FilterTemplate();

            foreach (var filteredItem in currentlyFiltered)
            {
                var shouldFilter = false;

                shouldFilter = access.ShouldFilter(filteredItem);
                shouldFilter = shouldFilter || !published.IsPublished(filteredItem);

                if (!(filteredItem is BlockData))
                    shouldFilter = shouldFilter || template.ShouldFilter(filteredItem);
                
            
                if (shouldFilter)
                    filteredItems.Remove(filteredItem);
            }
           
            return filteredItems;
        }
Example #4
0
 public SyndicationFeedContext(SyndicationFeedPageType feedPageType)
 {
     FeedPageType     = feedPageType;
     CategoriesFilter = feedPageType.CategoryFilter ?? new CategoryList();
 }
 public SyndicationItemFactory(IContentLoader contentLoader, IFeedContentResolver feedContentResolver, SyndicationFeedPageType feedPage)
 {
     ContentLoader = contentLoader;
     FeedContentResolver = feedContentResolver;
     FeedPage = feedPage;
 }