public override ProvisioningTemplate ExtractObjects(Web web, ProvisioningTemplate template, ProvisioningTemplateCreationInformation creationInfo) { using (var scope = new PnPMonitoredScope(this.Name)) { web.EnsureProperties(w => w.FooterEnabled, w => w.ServerRelativeUrl); var footer = new SiteFooter(); footer.Enabled = web.FooterEnabled; var structureString = web.ExecuteGet($"/_api/navigation/MenuState?menuNodeKey='{Constants.SITEFOOTER_NODEKEY}'").GetAwaiter().GetResult(); var menuState = JsonConvert.DeserializeObject <MenuState>(structureString); if (menuState.Nodes.Count > 1) { // Find the title node var titleNode = menuState.Nodes.FirstOrDefault(n => n.Title == Constants.SITEFOOTER_TITLENODEKEY); if (titleNode != null) { var titleNodeNodes = titleNode.Nodes; if (titleNodeNodes.Count > 0) { if (!string.IsNullOrEmpty(titleNodeNodes[0].SimpleUrl)) { footer.Logo = Tokenize(titleNodeNodes[0].SimpleUrl, web.ServerRelativeUrl); } if (!string.IsNullOrEmpty(titleNodeNodes[0].Title)) { footer.Name = titleNodeNodes[0].Title; } } } // find the logo node if (string.IsNullOrEmpty(footer.Logo)) { var logoNode = menuState.Nodes.FirstOrDefault(n => n.Title == Constants.SITEFOOTER_LOGONODEKEY); if (logoNode != null) { footer.Logo = Tokenize(logoNode.SimpleUrl, web.ServerRelativeUrl); } } } // find the menu Nodes var menuNodesNode = menuState.Nodes.FirstOrDefault(n => n.Title == Constants.SITEFOOTER_MENUNODEKEY); if (menuNodesNode != null) { foreach (var innerMenuNode in menuNodesNode.Nodes) { footer.FooterLinks.Add(ParseNodes(innerMenuNode, template, web.ServerRelativeUrl)); } } template.Footer = footer; } return(template); }
public override ProvisioningTemplate ExtractObjects(Web web, ProvisioningTemplate template, ProvisioningTemplateCreationInformation creationInfo) { using (var scope = new PnPMonitoredScope(this.Name)) { web.EnsureProperties(w => w.FooterEnabled, w => w.ServerRelativeUrl, w => w.Url); var footer = new SiteFooter(); footer.Enabled = web.FooterEnabled; var structureString = web.ExecuteGet($"/_api/navigation/MenuState?menuNodeKey='{Constants.SITEFOOTER_NODEKEY}'").GetAwaiter().GetResult(); var menuState = JsonConvert.DeserializeObject <MenuState>(structureString); if (menuState.Nodes.Count > 0) { // Find the title node var titleNode = menuState.Nodes.FirstOrDefault(n => n.Title == Constants.SITEFOOTER_TITLENODEKEY); if (titleNode != null) { var titleNodeNodes = titleNode.Nodes; if (titleNodeNodes.Count > 0) { if (!string.IsNullOrEmpty(titleNodeNodes[0].SimpleUrl)) { footer.Logo = Tokenize(titleNodeNodes[0].SimpleUrl, web.ServerRelativeUrl); } if (!string.IsNullOrEmpty(titleNodeNodes[0].Title)) { footer.Name = titleNodeNodes[0].Title; } } } // find the logo node if (string.IsNullOrEmpty(footer.Logo)) { var logoNode = menuState.Nodes.FirstOrDefault(n => n.Title == Constants.SITEFOOTER_LOGONODEKEY); if (logoNode != null) { footer.Logo = Tokenize(logoNode.SimpleUrl, web.ServerRelativeUrl); } } } // find the menu Nodes var menuNodesNode = menuState.Nodes.FirstOrDefault(n => n.Title == Constants.SITEFOOTER_MENUNODEKEY); if (menuNodesNode != null) { foreach (var innerMenuNode in menuNodesNode.Nodes) { footer.FooterLinks.Add(ParseNodes(innerMenuNode, template, web.ServerRelativeUrl)); } } if (creationInfo.ExtractConfiguration != null && creationInfo.ExtractConfiguration.SiteFooter != null && creationInfo.ExtractConfiguration.SiteFooter.RemoveExistingNodes) { footer.RemoveExistingNodes = true; } template.Footer = footer; if (creationInfo.PersistBrandingFiles) { // Extract site logo if property has been set and it's not dynamic image from _api URL if (!string.IsNullOrEmpty(template.Footer.Logo) && (!template.Footer.Logo.ToLowerInvariant().Contains("_api/"))) { // Convert to server relative URL if needed (can be set to FQDN URL of a file hosted in the site (e.g. for communication sites)) Uri webUri = new Uri(web.Url); string webUrl = $"{webUri.Scheme}://{webUri.DnsSafeHost}"; string footerLogoServerRelativeUrl = template.Footer.Logo.Replace(webUrl, ""); if (PersistFile(web, creationInfo, scope, footerLogoServerRelativeUrl)) { template.Files.Add(GetTemplateFile(web, footerLogoServerRelativeUrl)); } } template.Footer.Logo = Tokenize(template.Footer.Logo, web.Url, web); var files = template.Files.Distinct().ToList(); template.Files.Clear(); template.Files.AddRange(files); } } return(template); }
public override ProvisioningTemplate ExtractObjects(Web web, ProvisioningTemplate template, ProvisioningTemplateCreationInformation creationInfo) { using (var scope = new PnPMonitoredScope(this.Name)) { web.EnsureProperties(w => w.FooterEnabled, w => w.ServerRelativeUrl, w => w.Url, w => w.Language); var defaultCulture = new CultureInfo((int)web.Language); var footer = new SiteFooter { Enabled = web.FooterEnabled }; //get them in the default language of the Site var structureString = web.ExecuteGetAsync($"/_api/navigation/MenuState?menuNodeKey='{Constants.SITEFOOTER_NODEKEY}'", defaultCulture.Name).GetAwaiter().GetResult(); var menuState = JsonConvert.DeserializeObject <MenuState>(structureString); if (menuState.Nodes.Count > 0) { // Find the title node var titleNode = menuState.Nodes.FirstOrDefault(n => n.Title == Constants.SITEFOOTER_TITLENODEKEY); if (titleNode != null) { var titleNodeNodes = titleNode.Nodes; if (titleNodeNodes.Count > 0) { if (!string.IsNullOrEmpty(titleNodeNodes[0].SimpleUrl)) { footer.Logo = Tokenize(titleNodeNodes[0].SimpleUrl, web.ServerRelativeUrl); } if (!string.IsNullOrEmpty(titleNodeNodes[0].Title)) { if (creationInfo.PersistMultiLanguageResources) { if (UserResourceExtensions.PersistResourceValue($"FooterNavigationNode_{titleNode.Key}_{titleNodeNodes[0].Key}_Title", defaultCulture.LCID, titleNodeNodes[0].Title, creationInfo)) { footer.Name = $"{{res:FooterNavigationNode_{titleNode.Key}_{titleNodeNodes[0].Key}_Title}}"; } } else { footer.Name = titleNodeNodes[0].Title; } } } } // find the logo node if (string.IsNullOrEmpty(footer.Logo)) { var logoNode = menuState.Nodes.FirstOrDefault(n => n.Title == Constants.SITEFOOTER_LOGONODEKEY); if (logoNode != null) { footer.Logo = Tokenize(logoNode.SimpleUrl, web.ServerRelativeUrl); } } } // find the menu Nodes var menuNodesNode = menuState.Nodes.FirstOrDefault(n => n.Title == Constants.SITEFOOTER_MENUNODEKEY); if (menuNodesNode != null) { foreach (var innerMenuNode in menuNodesNode.Nodes) { footer.FooterLinks.Add(ParseNodes(innerMenuNode, template, web.ServerRelativeUrl, creationInfo.PersistMultiLanguageResources, defaultCulture, menuNodesNode.Key, creationInfo)); } } if (creationInfo.ExtractConfiguration != null && creationInfo.ExtractConfiguration.SiteFooter != null && creationInfo.ExtractConfiguration.SiteFooter.RemoveExistingNodes) { footer.RemoveExistingNodes = true; } if (creationInfo.PersistMultiLanguageResources) { //get Titles for the rest of the Languages foreach (var language in template.SupportedUILanguages.Where(c => c.LCID != defaultCulture.LCID)) { var currentCulture = new CultureInfo(language.LCID); var structureStringMUI = web.ExecuteGetAsync($"/_api/navigation/MenuState?menuNodeKey='{Constants.SITEFOOTER_NODEKEY}'", currentCulture.Name).GetAwaiter().GetResult(); var menuStateMUI = JsonConvert.DeserializeObject <MenuState>(structureStringMUI); if (menuStateMUI.Nodes.Count > 0) { var titleNode = menuStateMUI.Nodes.FirstOrDefault(n => n.Title == Constants.SITEFOOTER_TITLENODEKEY); if (titleNode != null) { var titleNodeNodes = titleNode.Nodes; if (titleNodeNodes.Count > 0) { if (!string.IsNullOrEmpty(titleNodeNodes[0].Title)) { if (UserResourceExtensions.PersistResourceValue($"FooterNavigationNode_{titleNode.Key}_{titleNodeNodes[0].Key}_Title", currentCulture.LCID, titleNodeNodes[0].Title, creationInfo)) { footer.Name = $"{{res:FooterNavigationNode_{titleNode.Key}_{titleNodeNodes[0].Key}_Title}}"; } } } } } // find the menu Nodes var menuNodesNodeMUI = menuStateMUI.Nodes.FirstOrDefault(n => n.Title == Constants.SITEFOOTER_MENUNODEKEY); if (menuNodesNodeMUI != null) { foreach (var innerMenuNode in menuNodesNodeMUI.Nodes) { ParseNodesMUI(innerMenuNode, web.ServerRelativeUrl, currentCulture, menuNodesNode.Key, creationInfo); } } } } template.Footer = footer; if (creationInfo.PersistBrandingFiles) { // Extract site logo if property has been set and it's not dynamic image from _api URL if (!string.IsNullOrEmpty(template.Footer.Logo) && (!template.Footer.Logo.ToLowerInvariant().Contains("_api/"))) { // Convert to server relative URL if needed (can be set to FQDN URL of a file hosted in the site (e.g. for communication sites)) Uri webUri = new Uri(web.Url); string webUrl = $"{webUri.Scheme}://{webUri.DnsSafeHost}"; string footerLogoServerRelativeUrl = template.Footer.Logo.Replace(webUrl, ""); if (PersistFile(web, creationInfo, scope, footerLogoServerRelativeUrl)) { template.Files.Add(GetTemplateFile(web, footerLogoServerRelativeUrl)); } } template.Footer.Logo = Tokenize(template.Footer.Logo, web.Url, web); var files = template.Files.Distinct().ToList(); template.Files.Clear(); template.Files.AddRange(files); } } return(template); }