/// <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;
        }
Ejemplo n.º 2
0
        /// <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;
        }