示例#1
0
        /// <summary>
        /// Analyses a single page layout from a provided file
        /// </summary>
        /// <param name="pageLayoutItem">Page layout list item</param>
        public PageLayout AnalysePageLayout(ListItem pageLayoutItem)
        {
            try
            {
                // Get the associated page layout content type
                string assocContentType      = pageLayoutItem[Constants.PublishingAssociatedContentTypeField].ToString();
                var    assocContentTypeParts = assocContentType.Split(new string[] { ";#" }, StringSplitOptions.RemoveEmptyEntries);

                // Load content type fields in memory once
                var contentTypeFields = LoadContentTypeFields(assocContentTypeParts[1]);

                // Extact page header
                var extractedHeader = ExtractPageHeaderFromPageLayoutAssociatedContentType(contentTypeFields);

                // Analyze the pagelayout file content
                var extractedHtmlBlocks = ExtractControlsFromPageLayoutHtml(pageLayoutItem);
                extractedHtmlBlocks.WebPartFields = CleanExtractedWebPartFields(extractedHtmlBlocks.WebPartFields, contentTypeFields);

                // Detect the fields that will become metadata in the target site
                var extractedMetaDataFields = ExtractMetaDataFromPageLayoutAssociatedContentType(contentTypeFields, extractedHtmlBlocks.WebPartFields, extractedHeader);

                var metaData = new MetaData
                {
                    Field = extractedMetaDataFields
                };

                // Combine all data to a single PageLayout mapping
                var layoutMapping = new PageLayout()
                {
                    // Display name of the page layout
                    Name = Path.GetFileNameWithoutExtension(pageLayoutItem[Constants.FileLeafRefField].ToString()),
                    // Default to no page header for now
                    PageHeader = extractedHeader != null ? PageLayoutPageHeader.Custom : PageLayoutPageHeader.None,
                    // Default to autodetect layout model
                    PageLayoutTemplate = PageLayoutPageLayoutTemplate.AutoDetect,
                    // The content type to be used on the target modern page
                    AssociatedContentType = "",
                    // Set the header details (if any)
                    Header = extractedHeader,
                    // Fields that will become metadata fields for the target page
                    MetaData = metaData,
                    // Fields that will become web parts on the target page
                    WebParts = extractedHtmlBlocks.WebPartFields.Count > 0 ? extractedHtmlBlocks.WebPartFields.ToArray() : null,
                    // Web part zones that can hold zero or more web parts
                    WebPartZones = extractedHtmlBlocks.WebPartZones.Count > 0 ? extractedHtmlBlocks.WebPartZones.ToArray() : null,
                    // Fixed web parts, this are web parts which are 'hardcoded' in the pagelayout aspx file
                    FixedWebParts = extractedHtmlBlocks.FixedWebParts.Count > 0 ? extractedHtmlBlocks.FixedWebParts?.ToArray() : null,
                };

                // Add to mappings list
                if (_mapping.PageLayouts != null)
                {
                    var expandMappings = _mapping.PageLayouts.ToList();

                    // Prevent duplicate references to the same page layout
                    if (!expandMappings.Any(o => o.Name == layoutMapping.Name))
                    {
                        expandMappings.Add(layoutMapping);
                    }

                    _mapping.PageLayouts = expandMappings.ToArray();
                }
                else
                {
                    _mapping.PageLayouts = new[] { layoutMapping };
                }

                LogInfo(string.Format(LogStrings.AnalyserMappingLayout, layoutMapping.Name), LogStrings.Heading_PageLayoutAnalyser);

                return(layoutMapping);
            }
            catch (Exception ex)
            {
                LogError(LogStrings.Error_CannotProcessPageLayoutAnalyse, LogStrings.Heading_PageLayoutAnalyser, ex);
            }

            return(null);
        }
 private static HeaderField GetHeaderField(PageLayout publishingPageTransformationModel, HeaderFieldHeaderProperty fieldName)
 {
     return(publishingPageTransformationModel.Header.Field.Where(p => p.HeaderProperty == fieldName).FirstOrDefault());
 }