/// <summary> /// Gets the view model for rendering widget preview. /// </summary> /// <param name="contentId">The content id.</param> /// <param name="user">The user.</param> /// <returns> /// View model for rendering widget preview /// </returns> public RenderPageViewModel GetContentPreviewViewModel(Guid contentId, IPrincipal user, bool allowJavaScript) { // Creating fake region. var regionGuid = new Guid(regionId); var region = new Region { Id = regionGuid, RegionIdentifier = regionIdentifier }; var regionViewModel = new PageRegionViewModel { RegionId = regionGuid, RegionIdentifier = regionIdentifier }; // Creating fake page content and loading it's children. var pageContent = new PageContent { Options = new List<PageContentOption>(), Region = region }; pageContent.Content = repository .AsQueryable<ContentEntity>(c => c.Id == contentId) .FetchMany(f => f.ContentOptions) .FetchMany(f => f.ChildContents) .ThenFetch(f => f.Child) .FetchMany(f => f.ChildContents) .ThenFetchMany(f => f.Options) .ToList() .FirstOrDefault(); if (pageContent.Content != null) { if (pageContent.Content is Models.HtmlContentWidget || pageContent.Content is Models.ServerControlWidget) { DemandAccess(user, RootModuleConstants.UserRoles.EditContent, RootModuleConstants.UserRoles.PublishContent, RootModuleConstants.UserRoles.Administration); } else { DemandAccess(user, RootModuleConstants.UserRoles.EditContent, RootModuleConstants.UserRoles.PublishContent); } } childContentService.RetrieveChildrenContentsRecursively(true, new[] { pageContent.Content }); var contentProjection = contentProjectionService.CreatePageContentProjection(true, pageContent, new List<PageContent> { pageContent }, retrieveCorrectVersion: false); var pageViewModel = new RenderPageViewModel { Contents = new List<PageContentProjection> { contentProjection }, Stylesheets = new List<IStylesheetAccessor> { contentProjection }, Regions = new List<PageRegionViewModel> { regionViewModel }, AreRegionsEditable = true, IsPreviewing = true }; if (allowJavaScript) { pageViewModel.JavaScripts = new List<IJavaScriptAccessor> { contentProjection }; } return pageViewModel; }
/// <summary> /// Initializes a new instance of the <see cref="LayoutRegionWrapper" /> class. /// </summary> /// <param name="sb">The string builder.</param> /// <param name="region">The region.</param> /// <param name="allowContentManagement">if set to <c>true</c> allows content management.</param> public LayoutRegionWrapper(StringBuilder sb, PageRegionViewModel region, bool allowContentManagement) { this.sb = sb; this.region = region; this.allowContentManagement = allowContentManagement; if (allowContentManagement) { RenderOpeningTags(); } }
/// <summary> /// Gets the view model for rendering widget preview. /// </summary> /// <param name="contentId">The content id.</param> /// <param name="user">The user.</param> /// <returns> /// View model for rendering widget preview /// </returns> public RenderPageViewModel GetContentPreviewViewModel(Guid contentId, IPrincipal user, bool allowJavaScript) { // Creating fake region. var regionGuid = new Guid(regionId); var region = new Region { Id = regionGuid, RegionIdentifier = regionIdentifier }; var regionViewModel = new PageRegionViewModel { RegionId = regionGuid, RegionIdentifier = regionIdentifier }; // Creating fake page content and loading it's children. var pageContent = new PageContent { Options = new List<PageContentOption>(), Region = region }; pageContent.Content = repository .AsQueryable<ContentEntity>(c => c.Id == contentId) .FetchMany(f => f.ContentOptions) .ToList() .FirstOrDefault(); if (pageContent.Content != null) { DemandAccess(user, RootModuleConstants.UserRoles.EditContent, RootModuleConstants.UserRoles.PublishContent); } var options = optionService.GetMergedOptionValues(pageContent.Content.ContentOptions, pageContent.Options); var contentProjection = pageContentProjectionFactory.Create(pageContent, pageContent.Content, options); var pageViewModel = new RenderPageViewModel { Contents = new List<PageContentProjection> { contentProjection }, Stylesheets = new List<IStylesheetAccessor> { contentProjection }, Regions = new List<PageRegionViewModel> { regionViewModel }, AreRegionsEditable = true }; if (allowJavaScript) { pageViewModel.JavaScripts = new List<IJavaScriptAccessor> { contentProjection }; } return pageViewModel; }
private StringBuilder RenderInvisibleRegionsRecursively(StringBuilder contentsBuilder, IEnumerable<InvisibleContentProjection> invisibleContentProjections, InvisibleContentProjection parent = null) { foreach (var group in invisibleContentProjections.Where(i => i.Parent == parent).GroupBy(i => i.ContentProjection.RegionId)) { var regionModel = new PageRegionViewModel { RegionId = group.Key, RegionIdentifier = group.First().ContentProjection.RegionIdentifier }; using (new LayoutRegionWrapper(contentsBuilder, regionModel, true, true)) { foreach (var projection in group) { using (new RegionContentWrapper(contentsBuilder, projection.ContentProjection, true, true)) { RenderInvisibleRegionsRecursively(contentsBuilder, invisibleContentProjections, projection); } } } } return contentsBuilder; }
private string AppendHtmlWithChildRegionContens(string html, PageContentProjection projection, RenderPageViewModel pageModel) { // Render contents from children regions var childRegionContents = projection.GetChildRegionContentProjections() ?? new List<PageContentProjection>(); if (projection.Content is IChildRegionContainer && projection.Content.ContentRegions != null && projection.Content.ContentRegions.Any()) { var stringBuilder = new StringBuilder(html); var pageHtmlHelper = new PageHtmlRenderer(stringBuilder, pageModel); foreach (var region in projection.Content.ContentRegions.Distinct()) { var contentsBuilder = new StringBuilder(); var regionModel = new PageRegionViewModel { RegionId = region.Region.Id, RegionIdentifier = region.Region.RegionIdentifier }; var childRegionContentProjections = childRegionContents.Where(c => c.RegionId == regionModel.RegionId).OrderBy(c => c.Order).ToList(); var canEditRegion = projection.PageId == pageModel.Id && pageModel.AreRegionsEditable; using (new LayoutRegionWrapper(contentsBuilder, regionModel, canEditRegion)) { foreach (var childRegionContentProjection in childRegionContentProjections) { // Add Html using (new RegionContentWrapper(contentsBuilder, childRegionContentProjection, pageModel.CanManageContent && canEditRegion)) { // Pass current model as view data model var modelBefore = htmlHelper.ViewData.Model; htmlHelper.ViewData.Model = pageModel; contentsBuilder = AppendHtml(contentsBuilder, childRegionContentProjection, pageModel); // Restore model, which was before changes htmlHelper.ViewData.Model = modelBefore; } } } // Insert region to master page var regionHtml = contentsBuilder.ToString(); pageHtmlHelper.ReplaceRegionHtml(regionModel.RegionIdentifier, regionHtml); } return pageHtmlHelper.GetReplacedHtml().ToString(); } return html; }