public ActionResult Item(SyndicationFeedPageType currentPage, int?contentId) { if (!contentId.HasValue) { return(HttpNotFound("No content Id specified")); } var contentReference = ContentReference.Parse(contentId.Value.ToString()); var feedContext = new SyndicationFeedContext(currentPage); var referencedContent = FeedContentResolver.GetContentReferences(feedContext); if (!referencedContent.Contains(contentReference)) { return(HttpNotFound("Content Id not exposed in this feed")); } var contentArea = new ContentArea(); var item = new ContentAreaItem { ContentLink = contentReference }; contentArea.Items.Add(item); var contentItem = ContentLoader.Get <IContent>(contentReference); var model = new ContentHolderModel { Tag = currentPage.BlockRenderingTag, ContentArea = contentArea, Content = contentItem }; return(View("~/modules/Chief2moro.SyndicationFeeds/Views/Item.cshtml", model)); }
/// <summary> /// Gets the content items that are referenced in the passed SyndicationFeedPage. /// </summary> /// <param name="currentPage">The current page.</param> /// <returns></returns> public IEnumerable <ContentReference> GetContentReferences(SyndicationFeedContext feedContext) { var feedPage = feedContext.FeedPageType; var dependentContentItems = new List <ContentReference>(); if (!ContentReference.IsNullOrEmpty(feedPage.PageFolder)) { dependentContentItems.AddRange(GetDescendentsOfType <PageData>(feedPage.PageFolder)); } if (!ContentReference.IsNullOrEmpty(feedPage.BlockFolder)) { dependentContentItems.AddRange(GetDescendentsOfType <BlockData>(feedPage.BlockFolder)); } if (!ContentReference.IsNullOrEmpty(feedPage.MediaFolder)) { dependentContentItems.AddRange(GetDescendentsOfType <MediaData>(feedPage.MediaFolder)); } if (feedPage.ContentItems == null) { return(dependentContentItems); } var itemsInContentArea = feedPage.ContentItems.Items.Select(contentItem => contentItem.ContentLink); dependentContentItems.AddRange(itemsInContentArea); return(dependentContentItems.Distinct()); }
public SyndicationItemFactory(IContentLoader contentLoader, IFeedContentResolver feedContentResolver, IFeedContentFilterer feedFilterer, IItemDescriptionProvider itemDescriptionProvider, IItemModifier itemModifier, SyndicationFeedContext feedContext) { ContentLoader = contentLoader; FeedContentResolver = feedContentResolver ?? new FeedContentResolver(ContentLoader); FeedFilterer = feedFilterer ?? new FeedContentFilterer(); ItemDescriptionProvider = itemDescriptionProvider ?? new ItemDescriptionProvider(); ItemModifier = itemModifier ?? new ItemNullModifier(); FeedContext = feedContext; }
public ActionResult Index(SyndicationFeedPageType currentPage, string categories) { var parsedCategories = ParseCategories(categories); var feedContext = new SyndicationFeedContext(currentPage, parsedCategories.ToList()); var siteUrl = SiteDefinition.Current.SiteUrl.ToString().TrimEnd('/'); var currentUri = new Uri(siteUrl + UrlResolver.Current.GetUrl(currentPage.ContentLink)); var syndicationFactory = new SyndicationItemFactory(ContentLoader, FeedContentResolver, FeedFilterer, ItemDescriptionProvider, ItemModifier, feedContext); var items = GetFromCacheOrFactory(syndicationFactory, currentPage, parsedCategories); var feed = new SyndicationFeed { Items = items, Id = siteUrl + UrlResolver.Current.GetUrl(ContentReference.StartPage), Title = new TextSyndicationContent(currentPage.PageName), Description = new TextSyndicationContent(currentPage.Description), Language = currentPage.LanguageBranch, Generator = "http://nuget.episerver.com/en/OtherPages/Package/?packageId=Chief2moro.SyndicationFeeds" }; feed.Links.Add(new SyndicationLink() { Uri = currentUri, RelationshipType = "self" }); if (currentPage.Category != null) { var categoryRepository = ServiceLocator.Current.GetInstance <CategoryRepository>(); foreach (var category in currentPage.Category) { feed.Categories.Add(new SyndicationCategory(categoryRepository.Get(category).Description)); } } if (feed.Items.Any()) { feed.LastUpdatedTime = feed.Items.Max(m => m.LastUpdatedTime); } if (currentPage.FeedFormat == FeedFormat.Atom) { return(new AtomActionResult(feed)); } return(new RssActionResult(feed)); }
public virtual IEnumerable <IContent> FilterSyndicationContent(IEnumerable <IContent> syndicationContentItems, SyndicationFeedContext feedContext) { //filter editor set excluded types var feedPage = feedContext.FeedPageType; var excludedAllTypes = ParseExcludedIds(feedPage.ExcludedContentTypes); var filteredItems = syndicationContentItems.Where(c => !excludedAllTypes.Contains(c.ContentTypeID)).ToList(); //filter by category if (feedContext.CategoriesFilter != null) { if (!feedContext.CategoriesFilter.IsEmpty) { filteredItems = filteredItems .Where(c => c is ICategorizable) .Where(c => ((ICategorizable)c).Category.MemberOfAll(feedContext.CategoriesFilter)).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); }