public void CanProvisionObjects() { var template = new ProvisioningTemplate(); Page page = new Page(); page.Layout = WikiPageLayout.TwoColumns; page.Overwrite = true; page.Url = "~site/sitepages/pagetest.aspx"; var webPart = new WebPart(); webPart.Column = 1; webPart.Row = 1; webPart.Contents = webpartcontents; webPart.Title = "Script Test"; page.WebParts.Add(webPart); template.Pages.Add(page); using (var ctx = TestCommon.CreateClientContext()) { TokenParser.Initialize(ctx.Web, template); new ObjectPages().ProvisionObjects(ctx.Web, template, new ProvisioningTemplateApplyingInformation()); ctx.Load(ctx.Web, w => w.ServerRelativeUrl); ctx.ExecuteQueryRetry(); var file = ctx.Web.GetFileByServerRelativeUrl(UrlUtility.Combine(ctx.Web.ServerRelativeUrl, "/SitePages/pagetest.aspx")); ctx.Load(file, f => f.Exists); ctx.ExecuteQueryRetry(); Assert.IsTrue(file.Exists); var wps = ctx.Web.GetWebParts(UrlUtility.Combine(ctx.Web.ServerRelativeUrl, "/SitePages/pagetest.aspx")); Assert.IsTrue(wps.Any()); } }
public override ProvisioningTemplate ExtractObjects(Web web, ProvisioningTemplate template, ProvisioningTemplateCreationInformation creationInfo) { using (var scope = new PnPMonitoredScope(this.Name)) { // Extract the Home Page web.EnsureProperties(w => w.RootFolder.WelcomePage, w => w.ServerRelativeUrl, w => w.Url); var homepageUrl = web.RootFolder.WelcomePage; if (string.IsNullOrEmpty(homepageUrl)) { homepageUrl = "Default.aspx"; } var welcomePageUrl = UrlUtility.Combine(web.ServerRelativeUrl, homepageUrl); var file = web.GetFileByServerRelativeUrl(welcomePageUrl); try { var listItem = file.EnsureProperty(f => f.ListItemAllFields); if (listItem != null) { if (listItem.FieldValues.ContainsKey("WikiField")) { // Wiki page var fullUri = new Uri(UrlUtility.Combine(web.Url, web.RootFolder.WelcomePage)); var folderPath = fullUri.Segments.Take(fullUri.Segments.Count() - 1).ToArray().Aggregate((i, x) => i + x).TrimEnd('/'); var fileName = fullUri.Segments[fullUri.Segments.Count() - 1]; var homeFile = web.GetFileByServerRelativeUrl(welcomePageUrl); LimitedWebPartManager limitedWPManager = homeFile.GetLimitedWebPartManager(PersonalizationScope.Shared); web.Context.Load(limitedWPManager); var webParts = web.GetWebParts(welcomePageUrl); var page = new Page() { Layout = WikiPageLayout.Custom, Overwrite = true, Url = Tokenize(fullUri.PathAndQuery, web.Url), }; var pageContents = listItem.FieldValues["WikiField"].ToString(); Regex regexClientIds = new Regex(@"id=\""div_(?<ControlId>(\w|\-)+)"); if (regexClientIds.IsMatch(pageContents)) { foreach (Match webPartMatch in regexClientIds.Matches(pageContents)) { String serverSideControlId = webPartMatch.Groups["ControlId"].Value; try { String serverSideControlIdToSearchFor = String.Format("g_{0}", serverSideControlId.Replace("-", "_")); WebPartDefinition webPart = limitedWPManager.WebParts.GetByControlId(serverSideControlIdToSearchFor); web.Context.Load(webPart, wp => wp.Id, wp => wp.WebPart.Title, wp => wp.WebPart.ZoneIndex ); web.Context.ExecuteQueryRetry(); var webPartxml = TokenizeWebPartXml(web, web.GetWebPartXml(webPart.Id, welcomePageUrl)); page.WebParts.Add(new Model.WebPart() { Title = webPart.WebPart.Title, Contents = webPartxml, Order = (uint)webPart.WebPart.ZoneIndex, Row = 1, // By default we will create a onecolumn layout, add the webpart to it, and later replace the wikifield on the page to position the webparts correctly. Column = 1 // By default we will create a onecolumn layout, add the webpart to it, and later replace the wikifield on the page to position the webparts correctly. }); pageContents = Regex.Replace(pageContents, serverSideControlId, string.Format("{{webpartid:{0}}}", webPart.WebPart.Title), RegexOptions.IgnoreCase); } catch (ServerException) { scope.LogWarning("Found a WebPart ID which is not available on the server-side. ID: {0}", serverSideControlId); } } } page.Fields.Add("WikiField", pageContents); template.Pages.Add(page); // Set the homepage if (template.WebSettings == null) { template.WebSettings = new WebSettings(); } template.WebSettings.WelcomePage = homepageUrl; } else { if (web.Context.HasMinimalServerLibraryVersion(Constants.MINIMUMZONEIDREQUIREDSERVERVERSION)) { // Not a wikipage template = GetFileContents(web, template, welcomePageUrl, creationInfo, scope); if (template.WebSettings == null) { template.WebSettings = new WebSettings(); } template.WebSettings.WelcomePage = homepageUrl; } else { WriteWarning(string.Format("Page content export requires a server version that is newer than the current server. Server version is {0}, minimal required is {1}", web.Context.ServerLibraryVersion, Constants.MINIMUMZONEIDREQUIREDSERVERVERSION), ProvisioningMessageType.Warning); scope.LogWarning("Page content export requires a server version that is newer than the current server. Server version is {0}, minimal required is {1}", web.Context.ServerLibraryVersion, Constants.MINIMUMZONEIDREQUIREDSERVERVERSION); } } } } catch (ServerException ex) { if (ex.ServerErrorCode != -2146232832) { throw; } else { if (web.Context.HasMinimalServerLibraryVersion(Constants.MINIMUMZONEIDREQUIREDSERVERVERSION)) { // Page does not belong to a list, extract the file as is template = GetFileContents(web, template, welcomePageUrl, creationInfo, scope); if (template.WebSettings == null) { template.WebSettings = new WebSettings(); } template.WebSettings.WelcomePage = homepageUrl; } else { WriteWarning(string.Format("Page content export requires a server version that is newer than the current server. Server version is {0}, minimal required is {1}", web.Context.ServerLibraryVersion, Constants.MINIMUMZONEIDREQUIREDSERVERVERSION), ProvisioningMessageType.Warning); scope.LogWarning("Page content export requires a server version that is newer than the current server. Server version is {0}, minimal required is {1}", web.Context.ServerLibraryVersion, Constants.MINIMUMZONEIDREQUIREDSERVERVERSION); } } } // If a base template is specified then use that one to "cleanup" the generated template model if (creationInfo.BaseTemplate != null) { template = CleanupEntities(template, creationInfo.BaseTemplate); } } return template; }
//TODO: refactor this private void AddWebParts(Web web, Page page, TokenParser parser) { var url = parser.ParseString(page.Url); ContentPage contentPage = page as ContentPage; if (contentPage != null) { var file = web.GetFileByServerRelativeUrl(url); file.CheckOut(); foreach (var model in contentPage.WebParts) { try { model.Contents = parser.ParseString(model.Contents); string oldId = null; string newId = null; if (!WebPartsModelProvider.IsV3FormatXml(model.Contents)) { var id = WebPartsModelProvider.GetWebPartControlId(model.Contents); var idToReplace = GetNewControlId(); model.Contents = model.Contents.Replace(id, idToReplace); newId = this.GetIdFromControlId(idToReplace); oldId = this.GetIdFromControlId(id); } var addedWebPart = this.AddWebPart(web, model, file); newId = newId ?? addedWebPart.Id.ToString().ToLower(); oldId = oldId ?? GetWebPartIdFromSchema(model.Contents).ToLower(); parser.AddToken(new IdToken(web, newId, oldId)); } catch (Exception ex) { Log.Error(Constants.LOGGING_SOURCE_FRAMEWORK_PROVISIONING, "Could not add webpart: {0} - {1}", ex.Message, ex.StackTrace); } } var html = parser.ParseString(contentPage.Html); if (!string.IsNullOrEmpty(html)) { web.AddHtmlToWikiPage(url, html); } file.CheckIn(String.Empty, CheckinType.MajorCheckIn); return; } }
//TODO: move to class private void AddPage(Web web, string url, Page page, TokenParser parser) { var publishingPage = page as PublishingPage; if (publishingPage != null) { string layoutUrl = parser.ParseString(publishingPage.PageLayoutUrl); web.AddPublishingPageByUrl(url, layoutUrl, publishingPage.PageTitle, publishingPage.Html); } else { var contentPage = page as ContentPage; if (contentPage != null) { web.AddWikiPageByUrl(url, contentPage.Html); } else { web.AddWikiPageByUrl(url); web.AddLayoutToWikiPage(page.Layout, url); } } }