/// <summary> /// Add web part to a wiki style page /// </summary> /// <param name="properties">Site to insert the web part on</param> /// <param name="webPart">Information about the web part to insert</param> /// <param name="page">Page to add the web part on</param> /// <param name="row">Row of the wiki table that should hold the inserted web part</param> /// <param name="col">Column of the wiki table that should hold the inserted web part</param> /// <param name="addSpace">Does a blank line need to be added after the web part (to space web parts)</param> public void AddWebPartToWikiPage(ClientContext ctx, Web web, string folder, WebPartEntity webPart, string page, int row, int col, bool addSpace) { //Note: getfilebyserverrelativeurl did not work...not sure why not Microsoft.SharePoint.Client.Folder pagesLib = web.GetFolderByServerRelativeUrl(folder); ctx.Load(pagesLib.Files); ctx.ExecuteQuery(); Microsoft.SharePoint.Client.File webPartPage = null; foreach (Microsoft.SharePoint.Client.File aspxFile in pagesLib.Files) { if (aspxFile.Name.Equals(page, StringComparison.InvariantCultureIgnoreCase)) { webPartPage = aspxFile; break; } } if (webPartPage == null) { return; } ctx.Load(webPartPage); ctx.Load(webPartPage.ListItemAllFields); ctx.ExecuteQuery(); string wikiField = (string)webPartPage.ListItemAllFields["WikiField"]; LimitedWebPartManager limitedWebPartManager = webPartPage.GetLimitedWebPartManager(PersonalizationScope.Shared); WebPartDefinition oWebPartDefinition = limitedWebPartManager.ImportWebPart(webPart.WebPartXml); WebPartDefinition wpdNew = limitedWebPartManager.AddWebPart(oWebPartDefinition.WebPart, "wpz", 0); ctx.Load(wpdNew); ctx.ExecuteQuery(); //HTML structure in default team site home page (W16) //<div class="ExternalClass284FC748CB4242F6808DE69314A7C981"> // <div class="ExternalClass5B1565E02FCA4F22A89640AC10DB16F3"> // <table id="layoutsTable" style="width:100%;"> // <tbody> // <tr style="vertical-align:top;"> // <td colspan="2"> // <div class="ms-rte-layoutszone-outer" style="width:100%;"> // <div class="ms-rte-layoutszone-inner" style="word-wrap:break-word;margin:0px;border:0px;"> // <div><span><span><div class="ms-rtestate-read ms-rte-wpbox"><div class="ms-rtestate-read 9ed0c0ac-54d0-4460-9f1c-7e98655b0847" id="div_9ed0c0ac-54d0-4460-9f1c-7e98655b0847"></div><div class="ms-rtestate-read" id="vid_9ed0c0ac-54d0-4460-9f1c-7e98655b0847" style="display:none;"></div></div></span></span><p> </p></div> // <div class="ms-rtestate-read ms-rte-wpbox"> // <div class="ms-rtestate-read c7a1f9a9-4e27-4aa3-878b-c8c6c87961c0" id="div_c7a1f9a9-4e27-4aa3-878b-c8c6c87961c0"></div> // <div class="ms-rtestate-read" id="vid_c7a1f9a9-4e27-4aa3-878b-c8c6c87961c0" style="display:none;"></div> // </div> // </div> // </div> // </td> // </tr> // <tr style="vertical-align:top;"> // <td style="width:49.95%;"> // <div class="ms-rte-layoutszone-outer" style="width:100%;"> // <div class="ms-rte-layoutszone-inner" style="word-wrap:break-word;margin:0px;border:0px;"> // <div class="ms-rtestate-read ms-rte-wpbox"> // <div class="ms-rtestate-read b55b18a3-8a3b-453f-a714-7e8d803f4d30" id="div_b55b18a3-8a3b-453f-a714-7e8d803f4d30"></div> // <div class="ms-rtestate-read" id="vid_b55b18a3-8a3b-453f-a714-7e8d803f4d30" style="display:none;"></div> // </div> // </div> // </div> // </td> // <td class="ms-wiki-columnSpacing" style="width:49.95%;"> // <div class="ms-rte-layoutszone-outer" style="width:100%;"> // <div class="ms-rte-layoutszone-inner" style="word-wrap:break-word;margin:0px;border:0px;"> // <div class="ms-rtestate-read ms-rte-wpbox"> // <div class="ms-rtestate-read 0b2f12a4-3ab5-4a59-b2eb-275bbc617f95" id="div_0b2f12a4-3ab5-4a59-b2eb-275bbc617f95"></div> // <div class="ms-rtestate-read" id="vid_0b2f12a4-3ab5-4a59-b2eb-275bbc617f95" style="display:none;"></div> // </div> // </div> // </div> // </td> // </tr> // </tbody> // </table> // <span id="layoutsData" style="display:none;">true,false,2</span> // </div> //</div> XmlDocument xd = new XmlDocument(); xd.PreserveWhitespace = true; xd.LoadXml(wikiField); // Sometimes the wikifield content seems to be surrounded by an additional div? XmlElement layoutsTable = xd.SelectSingleNode("div/div/table") as XmlElement; if (layoutsTable == null) { layoutsTable = xd.SelectSingleNode("div/table") as XmlElement; } XmlElement layoutsZoneInner = layoutsTable.SelectSingleNode(string.Format("tbody/tr[{0}]/td[{1}]/div/div", row, col)) as XmlElement; // - space element XmlElement space = xd.CreateElement("p"); XmlText text = xd.CreateTextNode(" "); space.AppendChild(text); // - wpBoxDiv XmlElement wpBoxDiv = xd.CreateElement("div"); layoutsZoneInner.AppendChild(wpBoxDiv); if (addSpace) { layoutsZoneInner.AppendChild(space); } XmlAttribute attribute = xd.CreateAttribute("class"); wpBoxDiv.Attributes.Append(attribute); attribute.Value = "ms-rtestate-read ms-rte-wpbox"; attribute = xd.CreateAttribute("contentEditable"); wpBoxDiv.Attributes.Append(attribute); attribute.Value = "false"; // - div1 XmlElement div1 = xd.CreateElement("div"); wpBoxDiv.AppendChild(div1); div1.IsEmpty = false; attribute = xd.CreateAttribute("class"); div1.Attributes.Append(attribute); attribute.Value = "ms-rtestate-read " + wpdNew.Id.ToString("D"); attribute = xd.CreateAttribute("id"); div1.Attributes.Append(attribute); attribute.Value = "div_" + wpdNew.Id.ToString("D"); // - div2 XmlElement div2 = xd.CreateElement("div"); wpBoxDiv.AppendChild(div2); div2.IsEmpty = false; attribute = xd.CreateAttribute("style"); div2.Attributes.Append(attribute); attribute.Value = "display:none"; attribute = xd.CreateAttribute("id"); div2.Attributes.Append(attribute); attribute.Value = "vid_" + wpdNew.Id.ToString("D"); ListItem listItem = webPartPage.ListItemAllFields; listItem["WikiField"] = xd.OuterXml; listItem.Update(); ctx.ExecuteQuery(); }
private void ExtractWikiPage(Microsoft.SharePoint.Client.File file, ProvisioningTemplate template, PnPMonitoredScope scope, ListItem listItem) { scope.LogDebug(String.Format("ExtractWikiPage {0}", file.ServerRelativeUrl)); var fullUri = GetFullUri(web); var page = new Page() { Layout = WikiPageLayout.Custom, Overwrite = true, Url = fullUri.PathAndQuery.TokenizeUrl(web.Url), }; var wikiField = listItem.FieldValues["WikiField"]; var pageContents = wikiField.ToString(); var regexClientIds = new System.Text.RegularExpressions.Regex(@"id=\""div_(?<ControlId>(\w|\-)+)"); if (regexClientIds.IsMatch(pageContents)) { LimitedWebPartManager limitedWPManager = file.GetLimitedWebPartManager(PersonalizationScope.Shared); foreach (System.Text.RegularExpressions.Match webPartMatch in regexClientIds.Matches(pageContents)) { String serverSideControlId = webPartMatch.Groups["ControlId"].Value; try { String serverSideControlIdToSearchFor = String.Format("g_{0}", serverSideControlId.Replace("-", "_")); //var webParts = limitedWPManager.WebParts.ToList(); WebPartDefinition webPart = limitedWPManager.WebParts.GetByControlId(serverSideControlIdToSearchFor); if (webPart != null && webPart.Id != null) { 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, file.ServerRelativeUrl)); page.WebParts.Add(new OfficeDevPnP.Core.Framework.Provisioning.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 (PropertyOrFieldNotInitializedException) { scope.LogWarning("Found a WebPart ID which is not available on the server-side. ID: {0}", serverSideControlId); try { web.Context.ExecuteQueryRetry(); } catch { //suppress pending transaction // avoids issues with invalid/corrupted wiki pages } } 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); }
/// <summary> /// Function to update project landing page as per new project name /// </summary> /// <param name="siteContext">Client context</param> /// <param name="projectToUpdate">Details of project to be updated</param> /// <param name="guid">Project GUID</param> /// <param name="calendarStatus">If Calendar is created</param> /// <param name="taskStatus">If task is created</param> /// <param name="rssFeedStatus">If RSS feed is created</param> public static void UpdateProjectLandingPage(ClientContext siteContext, Project projectToUpdate, string guid, bool calendarStatus, bool taskStatus, bool rssFeedStatus, IConfigurationRoot configuration) { int listID = RetrieveItemId(siteContext, Constants.SITE, guid); try { if (-1 != listID) { List list = siteContext.Web.Lists.GetByTitle(Constants.SITE); ListItem listItem = list.GetItemById(listID); siteContext.Load(listItem); Microsoft.SharePoint.Client.File file = listItem.File; listItem["Title"] = projectToUpdate.NewProjectName; listItem.Update(); /// Update stamped project and project GUID on project landing page LimitedWebPartManager wpm = file.GetLimitedWebPartManager(PersonalizationScope.Shared); siteContext.Load(wpm.WebParts, wps => wps.Include(wp => wp.WebPart.Properties, wp => wp.WebPart.Title)); siteContext.ExecuteQuery(); WebPartDefinitionCollection oWebPartDefinition = wpm.WebParts; siteContext.Load(oWebPartDefinition, item => item.Include(li => li.ZoneId, li => li.WebPart, li => li.WebPart.Properties)); siteContext.ExecuteQuery(); foreach (WebPartDefinition zone in oWebPartDefinition) { if (zone.WebPart.Title.ToLower() == "rss viewer") { rssFeedStatus = true; break; } } foreach (WebPartDefinition zone in oWebPartDefinition) { if (("HeaderZone").Equals(zone.ZoneId)) { zone.DeleteWebPart(); break; } } string catalogAssetsPathStyles = configuration.GetSection("General")["CatalogAssetsStyles"]; string sharePointDLLVersion = configuration.GetSection("General")["SharePointDLLVersion"]; string matterLandingcss = configuration.GetSection("General")["ProjectLandingCss"]; string projectLandingAssets = configuration.GetSection("General")["ProjectLandingAssets"]; string projectCenterAssets = configuration.GetSection("General")["ProjectCenterAssets"]; string projectLandingSectionContent = "<div id=\"{0}\"></div>"; string styleTag = "<link href=\"{0}\" type=\"text/css\" rel=\"stylesheet\" />"; string cssLink = string.Format(CultureInfo.InvariantCulture, catalogAssetsPathStyles + matterLandingcss, projectCenterAssets + Constants.FRONTSLASH + projectLandingAssets); string commonCssLink = string.Format(CultureInfo.InvariantCulture, catalogAssetsPathStyles + Constants.COMMONCSS, projectCenterAssets + Constants.FRONTSLASH + Constants.COMMONASSETS); string headerWebPartSection = string.Format(CultureInfo.InvariantCulture, projectLandingSectionContent, Constants.MATTERCENTERHEADER); string projectLandingStampProperties = "var documentLibraryName = \"{0}\", isNewProjectLandingPage = true, documentLibraryGUID=\"{1}\";"; string scriptTagWithContents = "<script type=\"text/javascript\">{0}</script>"; headerWebPartSection = string.Concat(string.Format(CultureInfo.InvariantCulture, styleTag, cssLink), headerWebPartSection); headerWebPartSection = string.Concat(string.Format(CultureInfo.InvariantCulture, styleTag, commonCssLink), headerWebPartSection); headerWebPartSection = string.Concat(string.Format(CultureInfo.InvariantCulture, scriptTagWithContents, string.Format(CultureInfo.InvariantCulture, projectLandingStampProperties, projectToUpdate.NewProjectName, guid)), headerWebPartSection); string headerWebPart = string.Format(CultureInfo.InvariantCulture, Constants.ContentEditorWebPart, headerWebPartSection, sharePointDLLVersion); WebPartDefinition webPartDefinition = null; if (!string.IsNullOrWhiteSpace(headerWebPart)) { LimitedWebPartManager limitedWebPartManager = file.GetLimitedWebPartManager(PersonalizationScope.Shared); webPartDefinition = limitedWebPartManager.ImportWebPart(headerWebPart); limitedWebPartManager.AddWebPart(webPartDefinition.WebPart, "HeaderZone", 1); siteContext.ExecuteQuery(); } // Remove existing web-parts from page and recreate List projectList = siteContext.Web.Lists.GetByTitle(projectToUpdate.NewProjectName); siteContext.Load(projectList, lst => lst.Title, lst => lst.EntityTypeName); siteContext.ExecuteQuery(); DeleteProjectWebparts(siteContext, projectList); CreateOneNote(siteContext, projectList, projectToUpdate.NewProjectName, configuration); if (taskStatus) { CreateWebPart(siteContext, projectList, projectToUpdate.NewProjectName, Constants.TASK, Constants.TASKPANE, 2, configuration); } if (calendarStatus) { CreateWebPart(siteContext, projectList, projectToUpdate.NewProjectName, Constants.CALENDAR, Constants.CALENDARPANE, 3, configuration); } if (rssFeedStatus) { CreateWebPart(siteContext, projectList, projectToUpdate.NewProjectName, Constants.RSSTITLE, Constants.RSSPANE, 4, configuration); CreateWebPart(siteContext, projectList, projectToUpdate.NewProjectName, Constants.RSSFEED, Constants.RSSPANE, 5, configuration); } } else { //frmMain.status.UpdateStatus("Project landing page not found with GUID: " + projectToUpdate.ProjectGUID, MatterCenter.Common.Message.MessageType.Error); } } catch (Exception exception) { throw; } }
/// <summary> /// Add web part to a wiki style page /// </summary> /// <param name="web">Site to be processed - can be root web or sub site</param> /// <param name="serverRelativePageUrl">Server relative url of the page to add the webpart to</param> /// <param name="webPart">Information about the web part to insert</param> /// <param name="row">Row of the wiki table that should hold the inserted web part</param> /// <param name="col">Column of the wiki table that should hold the inserted web part</param> /// <param name="addSpace">Does a blank line need to be added after the web part (to space web parts)</param> /// <exception cref="System.ArgumentException">Thrown when serverRelativePageUrl is a zero-length string or contains only white space</exception> /// <exception cref="System.ArgumentNullException">Thrown when serverRelativePageUrl or webPart is null</exception> public static void AddWebPartToWikiPage(this Web web, string serverRelativePageUrl, WebPartEntity webPart, int row, int col, bool addSpace) { if (string.IsNullOrEmpty(serverRelativePageUrl)) { throw (serverRelativePageUrl == null) ? new ArgumentNullException("serverRelativePageUrl") : new ArgumentException("Empty parameter", "serverRelativePageUrl"); } if (webPart == null) { throw new ArgumentNullException("webPart"); } File webPartPage = web.GetFileByServerRelativeUrl(serverRelativePageUrl); if (webPartPage == null) { return; } web.Context.Load(webPartPage, wp => wp.ListItemAllFields); web.Context.ExecuteQueryRetry(); string wikiField = (string)webPartPage.ListItemAllFields["WikiField"]; LimitedWebPartManager limitedWebPartManager = webPartPage.GetLimitedWebPartManager(PersonalizationScope.Shared); WebPartDefinition oWebPartDefinition = limitedWebPartManager.ImportWebPart(webPart.WebPartXml); WebPartDefinition wpdNew = limitedWebPartManager.AddWebPart(oWebPartDefinition.WebPart, "wpz", 0); web.Context.Load(wpdNew); web.Context.ExecuteQueryRetry(); // Close all BR tags Regex brRegex = new Regex("<br>", RegexOptions.IgnoreCase); wikiField = brRegex.Replace(wikiField, "<br/>"); XmlDocument xd = new XmlDocument(); xd.PreserveWhitespace = true; xd.LoadXml(wikiField); // Sometimes the wikifield content seems to be surrounded by an additional div? XmlElement layoutsTable = xd.SelectSingleNode("div/div/table") as XmlElement; if (layoutsTable == null) { layoutsTable = xd.SelectSingleNode("div/table") as XmlElement; } XmlElement layoutsZoneInner = layoutsTable.SelectSingleNode(string.Format("tbody/tr[{0}]/td[{1}]/div/div", row, col)) as XmlElement; // - space element XmlElement space = xd.CreateElement("p"); XmlText text = xd.CreateTextNode(" "); space.AppendChild(text); // - wpBoxDiv XmlElement wpBoxDiv = xd.CreateElement("div"); layoutsZoneInner.AppendChild(wpBoxDiv); if (addSpace) { layoutsZoneInner.AppendChild(space); } XmlAttribute attribute = xd.CreateAttribute("class"); wpBoxDiv.Attributes.Append(attribute); attribute.Value = "ms-rtestate-read ms-rte-wpbox"; attribute = xd.CreateAttribute("contentEditable"); wpBoxDiv.Attributes.Append(attribute); attribute.Value = "false"; // - div1 XmlElement div1 = xd.CreateElement("div"); wpBoxDiv.AppendChild(div1); div1.IsEmpty = false; attribute = xd.CreateAttribute("class"); div1.Attributes.Append(attribute); attribute.Value = "ms-rtestate-read " + wpdNew.Id.ToString("D"); attribute = xd.CreateAttribute("id"); div1.Attributes.Append(attribute); attribute.Value = "div_" + wpdNew.Id.ToString("D"); // - div2 XmlElement div2 = xd.CreateElement("div"); wpBoxDiv.AppendChild(div2); div2.IsEmpty = false; attribute = xd.CreateAttribute("style"); div2.Attributes.Append(attribute); attribute.Value = "display:none"; attribute = xd.CreateAttribute("id"); div2.Attributes.Append(attribute); attribute.Value = "vid_" + wpdNew.Id.ToString("D"); ListItem listItem = webPartPage.ListItemAllFields; listItem["WikiField"] = xd.OuterXml; listItem.Update(); web.Context.ExecuteQueryRetry(); }
/// <summary> /// Adding All Web Parts on Matter Landing Page /// </summary> /// <param name="clientContext">SharePoint Client Context</param> /// <param name="limitedWebPartManager">LimitedWebPartManager object to import web parts</param> /// <param name="webPartDefinition">WebPartDefinition object to add web parts on page.</param> /// <param name="webParts">Array of web parts that should be added on Matter Landing Page</param> /// <param name="zones">Array of Zone IDs</param> /// <returns>true if success else false</returns> internal static string AddWebPart(ClientContext clientContext, LimitedWebPartManager limitedWebPartManager, WebPartDefinition webPartDefinition, string[] webParts, string[] zones) { int index = 0; int ZoneIndex = 1; for (index = 0; index < webParts.Length; index++) { if (!string.IsNullOrWhiteSpace(webParts[index])) { webPartDefinition = limitedWebPartManager.ImportWebPart(webParts[index]); limitedWebPartManager.AddWebPart(webPartDefinition.WebPart, zones[index], ZoneIndex); clientContext.ExecuteQuery(); } } return Constants.TRUE; }
private static void TestClassicPage() { string url = "https://m365x725618.sharepoint.com/sites/ClassicPublishing01"; string searchKeyword = "Contoso"; string replaceKeyword = "NewContoso"; using (ClientContext context = GetClientContext(url)) { // enumaret "Pages" Lib var files = context.Web.Lists.GetByTitle("Pages").RootFolder.Files; context.Load(files, fs => fs.Include(f => f.ServerRelativeUrl), fs => fs.Include(f => f.CheckedOutByUser.UserPrincipalName), fs => fs.Include(f => f.ListItemAllFields), fs => fs.Include(f => f.CheckOutType)); context.ExecuteQuery(); foreach (var file in files) { if (file.CheckOutType == CheckOutType.None) { //string pageUrl = "https://m365x725618.sharepoint.com/sites/ClassicPublishing01/Pages/TestClassicPage.aspx"; //Microsoft.SharePoint.Client.File file = context.Web.GetFileByUrl(pageUrl); LimitedWebPartManager manager = file.GetLimitedWebPartManager(PersonalizationScope.Shared); context.Load(manager.WebParts, wps => wps.Include(wp => wp.WebPart.Title), wps => wps.Include(wp => wp.WebPart.ZoneIndex), wps => wps.Include(wp => wp.WebPart.Properties), wps => wps.Include(wp => wp.Id), wps => wps.Include(wp => wp.ZoneId)); context.ExecuteQuery(); //check out file for change. bool pageChanged = false; file.CheckOut(); //Update PublishingPageContent string pageContent = file.ListItemAllFields["PublishingPageContent"].ToString(); if (pageContent.IndexOf(searchKeyword, StringComparison.CurrentCultureIgnoreCase) != -1) { file.ListItemAllFields["PublishingPageContent"] = pageContent.Replace(searchKeyword, replaceKeyword); file.ListItemAllFields.Update(); pageChanged = true; } foreach (var wp in manager.WebParts) { if (wp.WebPart.Title == "Content Editor") { //export the web to get CEWP's content var wpXml = manager.ExportWebPart(wp.Id); context.ExecuteQuery(); string wpContent = wpXml.Value; if (wpContent.IndexOf(searchKeyword, StringComparison.CurrentCultureIgnoreCase) != -1) { Console.WriteLine("Found '{0}' at {1}", searchKeyword, file.ServerRelativeUrl); string zoneId = wp.ZoneId; int zoneIndex = wp.WebPart.ZoneIndex; //replace the content string wpNewContext = wpContent.Replace(searchKeyword, replaceKeyword); //remove old wp wp.DeleteWebPart(); context.ExecuteQuery(); //import the wp var wpDef = manager.ImportWebPart(wpNewContext); manager.AddWebPart(wpDef.WebPart, zoneId, zoneIndex); context.ExecuteQuery(); Console.WriteLine("Replace '{0}' to '{1}' at {2}", searchKeyword, replaceKeyword, file.ServerRelativeUrl); pageChanged = true; } } } if (pageChanged) { file.CheckIn("replace content", CheckinType.MajorCheckIn); } else { file.UndoCheckOut(); } context.ExecuteQuery(); Console.WriteLine("File '{0}' was processed and {1} changes", file.ServerRelativeUrl, pageChanged ? "found" : "no"); } else { Console.WriteLine("File '{0}' was checked out by {1}", file.ServerRelativeUrl, file.CheckedOutByUser.UserPrincipalName); } } } }
public bool Validate(PageCollection sourcePages, Microsoft.SharePoint.Client.ClientContext ctx) { int scount = 0; int tcount = 0; Web web = ctx.Web; ctx.Load(web, w => w.Url, w => w.ServerRelativeUrl); ctx.ExecuteQueryRetry(); foreach (var sourcePage in sourcePages) { string pageUrl = sourcePage.Url.ToString(); pageUrl = pageUrl.Replace("{site}", web.ServerRelativeUrl); Microsoft.SharePoint.Client.File file = web.GetFileByServerRelativeUrl(pageUrl); ctx.Load(file, page => page.ListItemAllFields, page => page.ListItemAllFields.RoleAssignments.Include(roleAsg => roleAsg.Member, roleAsg => roleAsg.RoleDefinitionBindings.Include(roleDef => roleDef.Name))); ctx.ExecuteQueryRetry(); if (file != null) { #region Page - Fields if (sourcePage.Fields.Count > 0) { scount = 0; tcount = 0; string sourceWikifield = sourcePage.Fields["WikiField"].ToString(); string targetwikiField = (string)file.ListItemAllFields["WikiField"]; if (sourceWikifield.Trim() != RemoveHTMLTags(targetwikiField).Trim()) { return(false); } } #endregion #region Page - Webparts if (!ctx.Web.IsNoScriptSite() && sourcePage.WebParts.Count > 0) { LimitedWebPartManager wpm = file.GetLimitedWebPartManager(PersonalizationScope.Shared); ctx.Load(wpm.WebParts, wps => wps.Include(wp => wp.WebPart.Title, wp => wp.WebPart.Properties)); ctx.ExecuteQueryRetry(); if (wpm.WebParts.Count > 0) { foreach (var spwp in sourcePage.WebParts) { scount++; foreach (WebPartDefinition wpd in wpm.WebParts) { if (spwp.Title == wpd.WebPart.Title) { tcount++; //Page - Webpart Properties Microsoft.SharePoint.Client.WebParts.WebPart wp = wpd.WebPart; var isWebPropertiesMatch = CSOMWebPartPropertiesValidation(spwp.Contents, wp.Properties); if (!isWebPropertiesMatch) { return(false); } } else { return(false); } } } if (scount != tcount) { return(false); } } else { return(false); } } #endregion #region Page - Security scount = 0; tcount = 0; if (sourcePage.Security != null && file.ListItemAllFields.RoleAssignments.Count > 0) { bool securityResult = ValidateSecurityCSOM(ctx, sourcePage.Security, file.ListItemAllFields); if (!securityResult) { return(false); } } #endregion } else { return(false); } } return(true); }
private static void MoveWebPartsToWikiOrPublishingContentEditorWebPartZone(ClientContext ctx, Dictionary <string, string> newIdMappings, LimitedWebPartManager limitedWebPartManager) { foreach (var wp in limitedWebPartManager.WebParts) { if (newIdMappings.Values.Contains(wp.Id.ToString().Replace("{", "").Replace("}", "").ToLower())) { wp.MoveWebPartTo("wpz", 0); wp.SaveWebPartChanges(); ctx.ExecuteQueryRetry(); } } }
private static void LoadWebPartManagerFromSharePoint(ClientContext ctx, LimitedWebPartManager limitedWebPartManager) { ctx.Load(limitedWebPartManager.WebParts, wps => wps.Include(wp => wp.Id)); ctx.ExecuteQueryRetry(); }
private static bool SetViewForWebpart(string fileUrl, ClientContext context, List list, string webpartName) { //Setup bool result = true; _log.Debug("Inside SetViewForWebpart"); Stopwatch stopwatch = new Stopwatch(); stopwatch.Start(); try { File file = context.Web.GetFileByServerRelativeUrl(fileUrl); LimitedWebPartManager webPartManager = file.GetLimitedWebPartManager(PersonalizationScope.Shared); context.Load(webPartManager, w => w.WebParts, w => w.WebParts.Include(wp => wp.WebPart), w => w.WebParts.Include(wp => wp.WebPart.Properties)); context.ExecuteQueryRetry(); WebPartDefinitionCollection webPartDefinitionCollection = webPartManager.WebParts; foreach (WebPartDefinition webPartDefinition in webPartDefinitionCollection) { WebPart webpart = webPartDefinition.WebPart; Dictionary <string, object> propertyValue = webpart.Properties.FieldValues; if (propertyValue["Title"].ToString().Equals(webpartName)) { View listView = list.Views.GetById(webPartDefinition.Id); var viewFields = listView.ViewFields; context.Load(listView, l => l.ListViewXml); context.Load(viewFields); context.ExecuteQueryRetry(); if (true) { int styleId = 0; //parse xml XmlDocument doc = new XmlDocument(); doc.LoadXml(listView.ListViewXml); XmlElement element = (XmlElement)doc.SelectSingleNode("//View//ViewStyle"); if (element == null) { element = doc.CreateElement("ViewStyle"); element.SetAttribute("ID", styleId.ToString()); doc.DocumentElement.AppendChild(element); } else { element.SetAttribute("ID", styleId.ToString()); } listView.ListViewXml = doc.FirstChild.InnerXml; //Performance listView.Update(); context.ExecuteQueryRetry(); } webpart.Properties["InplaceSearchEnabled"] = false; webpart.Properties["DisableViewSelectorMenu"] = true; webPartDefinition.SaveWebPartChanges(); context.ExecuteQueryRetry(); if (true) { listView.ViewFields.RemoveAll(); listView.ViewFields.Add("ID"); listView.ViewFields.Add("FileLeafRef"); } listView.RowLimit = 30; listView.TabularView = false; listView.Update(); context.ExecuteQueryRetry(); } } } catch (Exception e) { result = false; _log.Error(e, "Error inside SetViewForWebpart"); } stopwatch.Stop(); _log.Debug($"It took {stopwatch.Elapsed} to set the view"); return(true); }
/// <summary> /// Analyses a wiki page /// </summary> /// <returns>Information about the analyzed wiki page</returns> public Tuple <PageLayout, List <WebPartEntity> > Analyze() { List <WebPartEntity> webparts = new List <WebPartEntity>(); //Load the page var wikiPageUrl = page[Constants.FileRefField].ToString(); var wikiPage = cc.Web.GetFileByServerRelativeUrl(wikiPageUrl); cc.Load(wikiPage); cc.ExecuteQueryRetry(); // Load wiki content in HTML parser if (page.FieldValues[Constants.WikiField] == null) { throw new Exception("WikiField contents was set to null, this is an invalid and empty wiki page."); } var pageContents = page.FieldValues[Constants.WikiField].ToString(); var htmlDoc = parser.Parse(pageContents); var layout = GetLayout(htmlDoc); if (string.IsNullOrEmpty(pageContents)) { layout = PageLayout.Wiki_OneColumn; } List <WebPartPlaceHolder> webPartsToRetrieve = new List <WebPartPlaceHolder>(); var rows = htmlDoc.All.Where(p => p.LocalName == "tr"); int rowCount = 0; foreach (var row in rows) { rowCount++; var columns = row.Children.Where(p => p.LocalName == "td" && p.Parent == row); int colCount = 0; foreach (var column in columns) { colCount++; var contentHost = column.Children.Where(p => p.LocalName == "div" && (p.ClassName != null && p.ClassName.Equals("ms-rte-layoutszone-outer", StringComparison.InvariantCultureIgnoreCase))).FirstOrDefault(); // Check if this element is nested in another already processed element...this needs to be skipped to avoid content duplication and possible processing errors if (contentHost != null && contentHost.FirstElementChild != null && !IsNestedLayoutsZoneOuter(contentHost)) { var content = contentHost.FirstElementChild; // Drop elements which we anyhow can't transform and/or which are stripped out from RTE CleanHtml(content, htmlDoc); StringBuilder textContent = new StringBuilder(); int order = 0; foreach (var node in content.ChildNodes) { // Do we find a web part inside... if (((node as IHtmlElement) != null) && ContainsWebPart(node as IHtmlElement)) { var extraText = StripWebPart(node as IHtmlElement); string extraTextAfterWebPart = null; string extraTextBeforeWebPart = null; if (!string.IsNullOrEmpty(extraText)) { // Should be, but checking anyhow int webPartMarker = extraText.IndexOf(webPartMarkerString); if (webPartMarker > -1) { extraTextBeforeWebPart = extraText.Substring(0, webPartMarker); extraTextAfterWebPart = extraText.Substring(webPartMarker + webPartMarkerString.Length); // there could have been multiple web parts in a row (we don't support text inbetween them for now)...strip the remaining markers extraTextBeforeWebPart = extraTextBeforeWebPart.Replace(webPartMarkerString, ""); extraTextAfterWebPart = extraTextAfterWebPart.Replace(webPartMarkerString, ""); } } if (!string.IsNullOrEmpty(extraTextBeforeWebPart)) { textContent.AppendLine(extraTextBeforeWebPart); } // first insert text part (if it was available) if (!string.IsNullOrEmpty(textContent.ToString())) { order++; webparts.Add(CreateWikiTextPart(textContent.ToString(), rowCount, colCount, order)); textContent.Clear(); } // then process the web part order++; Regex regexClientIds = new Regex(@"id=\""div_(?<ControlId>(\w|\-)+)"); if (regexClientIds.IsMatch((node as IHtmlElement).OuterHtml)) { foreach (Match webPartMatch in regexClientIds.Matches((node as IHtmlElement).OuterHtml)) { // Store the web part we need, will be retrieved afterwards to optimize performance string serverSideControlId = webPartMatch.Groups["ControlId"].Value; var serverSideControlIdToSearchFor = $"g_{serverSideControlId.Replace("-", "_")}"; webPartsToRetrieve.Add(new WebPartPlaceHolder() { ControlId = serverSideControlIdToSearchFor, Id = serverSideControlId, Row = rowCount, Column = colCount, Order = order }); } } // Process the extra text that was positioned after the web part (if any) if (!string.IsNullOrEmpty(extraTextAfterWebPart)) { textContent.AppendLine(extraTextAfterWebPart); } } else { if (!string.IsNullOrEmpty(node.TextContent.Trim()) && node.TextContent.Trim() == "\n") { // ignore, this one is typically added after a web part } else { if (node.HasChildNodes) { textContent.AppendLine((node as IHtmlElement).OuterHtml); } else { if (!string.IsNullOrEmpty(node.TextContent.Trim())) { textContent.AppendLine(node.TextContent); } else { if (node.NodeName.Equals("br", StringComparison.InvariantCultureIgnoreCase)) { textContent.AppendLine("<BR>"); } // given that wiki html can contain embedded images and videos while not having child nodes we need include these. // case: img/iframe tag as "only" element to evaluate (e.g. first element in the contenthost) else if (node.NodeName.Equals("img", StringComparison.InvariantCultureIgnoreCase) || node.NodeName.Equals("iframe", StringComparison.InvariantCultureIgnoreCase)) { textContent.AppendLine((node as IHtmlElement).OuterHtml); } } } } } } // there was only one text part if (!string.IsNullOrEmpty(textContent.ToString())) { // insert text part to the web part collection order++; webparts.Add(CreateWikiTextPart(textContent.ToString(), rowCount, colCount, order)); } } } } // Bulk load the needed web part information if (webPartsToRetrieve.Count > 0) { // Load web part manager and use it to load each web part LimitedWebPartManager limitedWPManager = wikiPage.GetLimitedWebPartManager(PersonalizationScope.Shared); cc.Load(limitedWPManager); foreach (var webPartToRetrieve in webPartsToRetrieve) { // Check if the web part was loaded when we loaded the web parts collection via the web part manager if (!Guid.TryParse(webPartToRetrieve.Id, out Guid webPartToRetrieveGuid)) { // Skip since guid is not valid continue; } // Sometimes the returned wiki html contains web parts which are not anymore on the page...using the ExceptionHandlingScope // we can handle these errors server side while just doing a single roundtrip var scope = new ExceptionHandlingScope(cc); using (scope.StartScope()) { using (scope.StartTry()) { webPartToRetrieve.WebPartDefinition = limitedWPManager.WebParts.GetByControlId(webPartToRetrieve.ControlId); cc.Load(webPartToRetrieve.WebPartDefinition, wp => wp.Id, wp => wp.WebPart.ExportMode, wp => wp.WebPart.Title, wp => wp.WebPart.ZoneIndex, wp => wp.WebPart.IsClosed, wp => wp.WebPart.Hidden, wp => wp.WebPart.Properties); } using (scope.StartCatch()) { } } } cc.ExecuteQueryRetry(); // Load the web part XML for the web parts that do allow it bool isDirty = false; foreach (var webPartToRetrieve in webPartsToRetrieve) { // Important to only process the web parts that did not return an error in the previous server call if (webPartToRetrieve.WebPartDefinition != null && (webPartToRetrieve.WebPartDefinition.ServerObjectIsNull.HasValue && webPartToRetrieve.WebPartDefinition.ServerObjectIsNull.Value == false)) { // Retry to load the properties, sometimes they're not retrieved webPartToRetrieve.WebPartDefinition.EnsureProperty(wp => wp.Id); webPartToRetrieve.WebPartDefinition.WebPart.EnsureProperties(wp => wp.ExportMode, wp => wp.Title, wp => wp.ZoneIndex, wp => wp.IsClosed, wp => wp.Hidden, wp => wp.Properties); if (webPartToRetrieve.WebPartDefinition.WebPart.ExportMode == WebPartExportMode.All) { webPartToRetrieve.WebPartXml = limitedWPManager.ExportWebPart(webPartToRetrieve.WebPartDefinition.Id); isDirty = true; } } } if (isDirty) { cc.ExecuteQueryRetry(); } // Determine the web part type and store it in the web parts array foreach (var webPartToRetrieve in webPartsToRetrieve) { if (webPartToRetrieve.WebPartDefinition != null && (webPartToRetrieve.WebPartDefinition.ServerObjectIsNull.HasValue && webPartToRetrieve.WebPartDefinition.ServerObjectIsNull.Value == false)) { // Important to only process the web parts that did not return an error in the previous server call if (webPartToRetrieve.WebPartDefinition.WebPart.ExportMode != WebPartExportMode.All) { // Use different approach to determine type as we can't export the web part XML without indroducing a change webPartToRetrieve.WebPartType = GetTypeFromProperties(webPartToRetrieve.WebPartDefinition.WebPart.Properties); } else { webPartToRetrieve.WebPartType = GetType(webPartToRetrieve.WebPartXml.Value); } webparts.Add(new WebPartEntity() { Title = webPartToRetrieve.WebPartDefinition.WebPart.Title, Type = webPartToRetrieve.WebPartType, Id = webPartToRetrieve.WebPartDefinition.Id, ServerControlId = webPartToRetrieve.Id, Row = webPartToRetrieve.Row, Column = webPartToRetrieve.Column, Order = webPartToRetrieve.Order, ZoneId = "", ZoneIndex = (uint)webPartToRetrieve.WebPartDefinition.WebPart.ZoneIndex, IsClosed = webPartToRetrieve.WebPartDefinition.WebPart.IsClosed, Hidden = webPartToRetrieve.WebPartDefinition.WebPart.Hidden, Properties = Properties(webPartToRetrieve.WebPartDefinition.WebPart.Properties, webPartToRetrieve.WebPartType, webPartToRetrieve.WebPartXml == null ? "" : webPartToRetrieve.WebPartXml.Value), }); } } #region old approach /* * // Load web parts on wiki page * var limitedWPManager = wikiPage.GetLimitedWebPartManager(PersonalizationScope.Shared); * cc.Load(limitedWPManager); * var webParts = limitedWPManager.WebParts; * cc.Load(webParts, p => p.Include(wp => wp.Id, wp => wp.WebPart.ExportMode, wp => wp.WebPart.Title, wp => wp.WebPart.ZoneIndex, wp => wp.WebPart.IsClosed, wp => wp.WebPart.Hidden, wp => wp.WebPart.Properties)); * cc.ExecuteQueryRetry(); * * foreach (var webPartToRetrieve in webPartsToRetrieve) * { * try * { * // Check if the web part was loaded when we loaded the web parts collection via the web part manager * Guid webPartToRetrieveGuid; * if (!Guid.TryParse(webPartToRetrieve.Id, out webPartToRetrieveGuid)) * { * // Skip since guid is not valid * continue; * } * * var foundWebPart = webParts.Where(p => p.Id.Equals(webPartToRetrieveGuid)).FirstOrDefault(); * if (foundWebPart == null) * { * // If not found then try to retrieve the webpart via the GetByControlId method * foundWebPart = limitedWPManager.WebParts.GetByControlId(webPartToRetrieve.ControlId); * cc.Load(foundWebPart, wp => wp.Id, wp => wp.WebPart.ExportMode, wp => wp.WebPart.Title, wp => wp.WebPart.ZoneIndex, wp => wp.WebPart.IsClosed, wp => wp.WebPart.Hidden, wp => wp.WebPart.Properties); * cc.ExecuteQueryRetry(); * } * * if (foundWebPart != null) * { * // Retry to load the properties, sometimes they're not retrieved * foundWebPart.EnsureProperty(wp => wp.Id); * foundWebPart.WebPart.EnsureProperties(wp => wp.ExportMode, wp => wp.Title, wp => wp.ZoneIndex, wp => wp.IsClosed, wp => wp.Hidden, wp => wp.Properties); * * //var changed = false; * string webPartXml = ""; * string webPartType = ""; * var exportMode = foundWebPart.WebPart.ExportMode; * if (foundWebPart.WebPart.ExportMode != WebPartExportMode.All) * { * // Use different approach to determine type as we can't export the web part XML without indroducing a change * webPartType = GetTypeFromProperties(foundWebPart.WebPart.Properties); * } * else * { * * var result = limitedWPManager.ExportWebPart(foundWebPart.Id); * cc.ExecuteQueryRetry(); * webPartXml = result.Value; * webPartType = GetType(webPartXml); * } * * webparts.Add(new WebPartEntity() * { * Title = foundWebPart.WebPart.Title, * Type = webPartType, * Id = foundWebPart.Id, * ServerControlId = webPartToRetrieve.Id, * Row = webPartToRetrieve.Row, * Column = webPartToRetrieve.Column, * Order = webPartToRetrieve.Order, * ZoneId = "", * ZoneIndex = (uint)foundWebPart.WebPart.ZoneIndex, * IsClosed = foundWebPart.WebPart.IsClosed, * Hidden = foundWebPart.WebPart.Hidden, * Properties = Properties(foundWebPart.WebPart.Properties, webPartType, webPartXml), * }); * } * } * catch (ServerException) * { * //Eat exception because we've found a WebPart ID which is not available on the server-side * } * } */ #endregion } // Somehow the wiki was not standard formatted, so lets wrap its contents in a text block if (webparts.Count == 0 && !String.IsNullOrEmpty(htmlDoc.Source.Text)) { webparts.Add(CreateWikiTextPart(htmlDoc.Source.Text, 1, 1, 1)); } return(new Tuple <PageLayout, List <WebPartEntity> >(layout, webparts)); }
private static void AddWebPartToWikiPage(ClientContext ctx, string fileUrl, WebPartEntity webPart, int row, int col, bool addSpace) { _log.Debug("Inside AddWebPartToWikiPage"); Stopwatch stopwatch = new Stopwatch(); stopwatch.Start(); File webPartPage = ctx.Web.GetFileByServerRelativeUrl(fileUrl); if (webPartPage == null) { return; } ctx.Load(webPartPage); ctx.Load(webPartPage.ListItemAllFields); ctx.ExecuteQuery(); string wikiField = (string)webPartPage.ListItemAllFields["WikiField"]; LimitedWebPartManager limitedWebPartManager = webPartPage.GetLimitedWebPartManager(PersonalizationScope.Shared); ctx.Load(limitedWebPartManager); ctx.ExecuteQuery(); WebPartDefinition oWebPartDefinition = limitedWebPartManager.ImportWebPart(webPart.WebPartXml); WebPartDefinition wpdNew = limitedWebPartManager.AddWebPart(oWebPartDefinition.WebPart, "wpz", 0); ctx.Load(wpdNew); ctx.ExecuteQuery(); XmlDocument xd = new XmlDocument(); xd.PreserveWhitespace = true; xd.LoadXml(wikiField); // Sometimes the wikifield content seems to be surrounded by an additional div? XmlElement layoutsTable = xd.SelectSingleNode("div/div/table") as XmlElement; if (layoutsTable == null) { layoutsTable = xd.SelectSingleNode("div/table") as XmlElement; } XmlElement layoutsZoneInner = layoutsTable.SelectSingleNode(string.Format("tbody/tr[{0}]/td[{1}]/div/div", row, col)) as XmlElement; // - space element XmlElement space = xd.CreateElement("p"); XmlText text = xd.CreateTextNode(" "); space.AppendChild(text); // - wpBoxDiv XmlElement wpBoxDiv = xd.CreateElement("div"); layoutsZoneInner.AppendChild(wpBoxDiv); if (addSpace) { layoutsZoneInner.AppendChild(space); } XmlAttribute attribute = xd.CreateAttribute("class"); wpBoxDiv.Attributes.Append(attribute); attribute.Value = "ms-rtestate-read ms-rte-wpbox"; attribute = xd.CreateAttribute("contentEditable"); wpBoxDiv.Attributes.Append(attribute); attribute.Value = "false"; // - div1 XmlElement div1 = xd.CreateElement("div"); wpBoxDiv.AppendChild(div1); div1.IsEmpty = false; attribute = xd.CreateAttribute("class"); div1.Attributes.Append(attribute); attribute.Value = "ms-rtestate-read " + wpdNew.Id.ToString("D"); attribute = xd.CreateAttribute("id"); div1.Attributes.Append(attribute); attribute.Value = "div_" + wpdNew.Id.ToString("D"); // - div2 XmlElement div2 = xd.CreateElement("div"); wpBoxDiv.AppendChild(div2); div2.IsEmpty = false; attribute = xd.CreateAttribute("style"); div2.Attributes.Append(attribute); attribute.Value = "display:none"; attribute = xd.CreateAttribute("id"); div2.Attributes.Append(attribute); attribute.Value = "vid_" + wpdNew.Id.ToString("D"); ListItem listItem = webPartPage.ListItemAllFields; listItem["WikiField"] = xd.OuterXml; listItem.Update(); ctx.ExecuteQuery(); stopwatch.Stop(); _log.Debug($"It took {stopwatch.Elapsed} to create the webpart"); }
private void GetUsageInList(Web rootWeb, ref List list, ref string actualWebPartType) { // list = rootWeb.Lists.GetByTitle("Pages"); try { //Load the necessary properties with the list ctx.Load(list, l => l.Title, l => l.IsSiteAssetsLibrary, l => l.IsPrivate, l => l.IsCatalog, l => l.IsApplicationList); ctx.ExecuteQuery(); } catch { list = null; } //Skip the OOB libraries if (list != null) { CamlQuery query = new CamlQuery(); //Get only the items where the checkedout user field is not empty (which means the file is checked out) query.ViewXml = "<View Scope=\"RecursiveAll\"></View>"; ListItemCollection items = list.GetItems(query); //Load all the items ctx.Load(items); ctx.ExecuteQuery(); WriteLine("Found " + items.Count + " item(s) on list " + list.Title); //Iterate each items to get write to the log foreach (ListItem item in items) { ctx.Load(item, i => i.File, i => i.File.ServerRelativeUrl, i => i.File.Name); ctx.ExecuteQuery(); if (item.File.Name.EndsWith(".aspx", StringComparison.InvariantCultureIgnoreCase)) { var oFile = item.File; LimitedWebPartManager limitedWebPartManager = oFile.GetLimitedWebPartManager(PersonalizationScope.Shared); ctx.Load(limitedWebPartManager.WebParts, wps => wps.Include( wp => wp.WebPart.Title, wp => wp.Id, wp => wp.WebPart.Properties, wp => wp.WebPart.ZoneIndex)); ctx.ExecuteQuery(); if (limitedWebPartManager.WebParts.Count == 0) { WriteLine("No Web Parts on this page."); } else { foreach (WebPartDefinition wpDef in limitedWebPartManager.WebParts) { try { string ZoneID = string.Empty; #region Get Type Name string webPartPropertiesXml = GetWebPartPropertiesServiceCall(wpDef.Id.ToString(), oFile.ServerRelativeUrl, rootWeb.Url); string WebPartTypeName = string.Empty; if (webPartPropertiesXml.Contains("WebPart/v2")) { XmlDataDocument xmldoc = new XmlDataDocument(); xmldoc.LoadXml(webPartPropertiesXml); WebPartTypeName = xmldoc.DocumentElement.GetElementsByTagName("TypeName").Item(0).FirstChild.Value; ZoneID = xmldoc.DocumentElement.GetElementsByTagName("ZoneID").Item(0).FirstChild.Value; xmldoc = null; } else { webParts webPartProp = null; byte[] byteArray = Encoding.UTF8.GetBytes(webPartPropertiesXml); using (MemoryStream stream = new MemoryStream(byteArray)) { using (StreamReader streamReader = new StreamReader(stream)) { using (System.Xml.XmlReader reader = new XmlTextReader(streamReader)) { XmlSerializer serializer = new XmlSerializer(typeof(webParts)); webPartProp = (webParts)serializer.Deserialize(reader); WebPartTypeName = webPartProp.webPart.metaData.type.name; reader.Close(); reader.Dispose(); } streamReader.Close(); streamReader.Dispose(); } stream.Close(); stream.Flush(); stream.Dispose(); } byteArray = null; } actualWebPartType = GetWebPartShortTypeName(WebPartTypeName); #endregion if (WebPartsToRetrieve.Contains(actualWebPartType)) { WriteLine(oFile.ServerRelativeUrl + "\t" + wpDef.Id + "\t" + wpDef.Id + "\t" + wpDef.WebPart.Title + "\t" + actualWebPartType + "\t" + rootWeb.Url + "\t" + ZoneID + "\t" + wpDef.WebPart.ZoneIndex + Environment.NewLine); Program.strOutput += oFile.ServerRelativeUrl + "," + wpDef.Id + "," + wpDef.Id + "," + wpDef.WebPart.Title + "," + actualWebPartType + "," + rootWeb.Url + "," + ZoneID + "," + wpDef.WebPart.ZoneIndex + Environment.NewLine; } } catch (Exception ex) { WriteLine("Error in Web Part Definition: " + wpDef.WebPart.Title); WriteLine(ex.Message); } } } } } } }
protected void btnAddToPage_Click(object sender, EventArgs e) { var spContext = SharePointContextProvider.Current.GetSharePointContext(Context); using (var clientContext = spContext.CreateUserClientContextForSPHost()) { //get the web part page (DevHome.aspx) which is specific to a developer site template var list = clientContext.Web.Lists.GetByTitle("Site Pages"); CamlQuery camlQuery = new CamlQuery(); var items = list.GetItems(camlQuery); clientContext.Load(items, i => i.Include(item => item.DisplayName, item => item["WikiField"]).Where(item => item.DisplayName == "DevHome")); clientContext.ExecuteQuery(); //get the webpart xml string wpXML = ""; using (var stream = System.IO.File.OpenRead(Server.MapPath("~/MyPicWebPart.dwp"))) { XDocument xdoc = XDocument.Load(stream); wpXML = xdoc.ToString(); wpXML = wpXML.Replace("\r\n", ""); } //add the webpart to the page var wikiPage = items[0].File; LimitedWebPartManager limitedWebPartManager = wikiPage.GetLimitedWebPartManager(PersonalizationScope.Shared); WebPartDefinition wpd = limitedWebPartManager.ImportWebPart(wpXML); var newWP = limitedWebPartManager.AddWebPart(wpd.WebPart, "wpz", 0); clientContext.Load(newWP); clientContext.ExecuteQuery(); // Create reference to WebPart in HTML string wikiField = items[0]["WikiField"] as string; XmlDocument xd = new XmlDocument(); xd.PreserveWhitespace = true; xd.LoadXml(wikiField); XmlElement layoutsZoneInner = xd.SelectSingleNode("div/table/tbody/tr/td/div/div") as XmlElement; //create wrapper XmlElement wpWrapper = xd.CreateElement("div"); layoutsZoneInner.AppendChild(wpWrapper); XmlAttribute attribute = xd.CreateAttribute("class"); wpWrapper.Attributes.Append(attribute); attribute.Value = "ms-rtestate-read ms-rte-wpbox"; //create inner elements XmlElement div1 = xd.CreateElement("div"); wpWrapper.AppendChild(div1); div1.IsEmpty = false; attribute = xd.CreateAttribute("class"); div1.Attributes.Append(attribute); attribute.Value = "ms-rtestate-notify ms-rtestate-read " + newWP.Id.ToString("D"); attribute = xd.CreateAttribute("id"); div1.Attributes.Append(attribute); attribute.Value = "div_" + newWP.Id.ToString("D"); XmlElement div2 = xd.CreateElement("div"); wpWrapper.AppendChild(div2); div2.IsEmpty = false; attribute = xd.CreateAttribute("class"); div2.Attributes.Append(attribute); attribute.Value = "ms-rtestate-read"; attribute = xd.CreateAttribute("style"); div2.Attributes.Append(attribute); attribute.Value = "display:none"; attribute = xd.CreateAttribute("id"); div2.Attributes.Append(attribute); attribute.Value = "vid_" + newWP.Id.ToString("D"); // Update items[0]["WikiField"] = xd.OuterXml; items[0].Update(); clientContext.ExecuteQuery(); //toggle the UI imgWPP.ImageUrl = "~/Images/Yes.png"; btnAddToPage.Enabled = false; } }
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; WebPartDefinition webPart = limitedWPManager.WebParts.GetByControlId(String.Format("g_{0}", serverSideControlId.Replace("-", "_"))); 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); } } 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); }
private void GetPage(Web web, ProvisioningTemplate template, ProvisioningTemplateCreationInformation creationInfo, string pageUrl) { try { var pageFullUrl = UrlUtility.Combine(web.ServerRelativeUrl, pageUrl); var file = web.GetFileByServerRelativeUrl(pageFullUrl); web.Context.Load(file, f => f.Name, f => f.CheckOutType, f => f.ListItemAllFields.ParentList.ForceCheckout, f => f.Level); web.Context.ExecuteQueryRetry(); FileLevel fileLevel = file.Level; var checkedOut = CheckOutIfNeeded(web, file); try { var listItem = file.EnsureProperty(f => f.ListItemAllFields); if (listItem != null) { if (listItem.FieldValues.ContainsKey("WikiField")) { #region 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(pageFullUrl); LimitedWebPartManager limitedWPManager = homeFile.GetLimitedWebPartManager(PersonalizationScope.Shared); web.Context.Load(limitedWPManager); var webParts = web.GetWebParts(pageFullUrl); 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, pageFullUrl)); page.WebParts.Add(new OfficeDevPnP.Core.Framework.Provisioning.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) { Console.WriteLine( "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; #endregion } else { if (web.Context.HasMinimalServerLibraryVersion(Constants.MINIMUMZONEIDREQUIREDSERVERVERSION)) { // Not a wikipage template = GetFileContents(web, template, pageFullUrl, creationInfo, pageUrl); } else { Console.WriteLine( 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); Console.WriteLine( "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, pageFullUrl, creationInfo, pageUrl); } else { Console.WriteLine( 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); Console.WriteLine( "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); } } } switch (fileLevel) { case Microsoft.SharePoint.Client.FileLevel.Published: { file.PublishFileToLevel(Microsoft.SharePoint.Client.FileLevel.Published); break; } case Microsoft.SharePoint.Client.FileLevel.Draft: { file.PublishFileToLevel(Microsoft.SharePoint.Client.FileLevel.Draft); break; } default: { if (checkedOut) { file.CheckIn("", CheckinType.MajorCheckIn); web.Context.ExecuteQueryRetry(); } break; } } } catch (Exception ex) { throw ex; } }
public static void AddCEWP(ClientContext clientContext, string formUrl, string WebPartTitle, string Zone, string contentLink, bool closeDefaultWebPart) { formUrl = formUrl.Replace("//", "/"); contentLink = contentLink.Replace("//", "/"); System.Console.WriteLine(contentLink); Microsoft.SharePoint.Client.File oFile = clientContext.Web.GetFileByServerRelativeUrl(formUrl); LimitedWebPartManager limitedWebPartManager = oFile.GetLimitedWebPartManager(PersonalizationScope.Shared); string webpartxml = @"<?xml version='1.0' encoding='utf-8'?> <WebPart xmlns:xsd='http://www.w3.org/2001/XMLSchema' xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance' xmlns='http://schemas.microsoft.com/WebPart/v2'> <Title>" + WebPartTitle + @"</Title> <FrameType>Default</FrameType> <Description /> <IsIncluded>true</IsIncluded> <ZoneID>" + Zone + @"</ZoneID> <PartOrder>0</PartOrder> <FrameState>Normal</FrameState> <Height /> <Width /> <AllowRemove>true</AllowRemove> <AllowZoneChange>true</AllowZoneChange> <AllowMinimize>true</AllowMinimize> <AllowConnect>true</AllowConnect> <AllowEdit>true</AllowEdit> <AllowHide>true</AllowHide> <IsVisible>true</IsVisible> <DetailLink /> <HelpLink /> <HelpMode>Modeless</HelpMode> <Dir>Default</Dir> <PartImageSmall /> <MissingAssembly>Cannot import this Web Part.</MissingAssembly> <PartImageLarge>/_layouts/15/images/mscontl.gif</PartImageLarge> <IsIncludedFilter /> <ContentLink>" + contentLink + @"</ContentLink> <Assembly>Microsoft.SharePoint, Version=16.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c</Assembly> <TypeName>Microsoft.SharePoint.WebPartPages.ContentEditorWebPart</TypeName> <ContentLink xmlns='http://schemas.microsoft.com/WebPart/v2/ContentEditor'>" + contentLink + @"</ContentLink> <Content xmlns='http://schemas.microsoft.com/WebPart/v2/ContentEditor' /> <PartStorage xmlns='http://schemas.microsoft.com/WebPart/v2/ContentEditor' /> </WebPart>" /*The webpart XML */; try { clientContext.Load(limitedWebPartManager.WebParts); clientContext.ExecuteQuery(); if (closeDefaultWebPart) { CloseDefaultWebPart(clientContext, limitedWebPartManager.WebParts); } DeleteWebPart(clientContext, formUrl, WebPartTitle); var wpd = limitedWebPartManager.ImportWebPart(webpartxml); limitedWebPartManager.AddWebPart(wpd.WebPart, Zone, 0); clientContext.ExecuteQuery(); } catch (Exception ex) { System.Console.WriteLine("error while adding the web part to the {0} form", formUrl); System.Console.WriteLine(ex.Message); } }
internal void LoadWebPartsInWikiContentFromServer(List <WebPartEntity> webparts, File wikiPage, List <WebPartPlaceHolder> webPartsToRetrieve) { // Load web part manager and use it to load each web part LimitedWebPartManager limitedWPManager = wikiPage.GetLimitedWebPartManager(PersonalizationScope.Shared); cc.Load(limitedWPManager); foreach (var webPartToRetrieve in webPartsToRetrieve) { // Check if the web part was loaded when we loaded the web parts collection via the web part manager if (!Guid.TryParse(webPartToRetrieve.Id, out Guid webPartToRetrieveGuid)) { // Skip since guid is not valid continue; } // Sometimes the returned wiki html contains web parts which are not anymore on the page...using the ExceptionHandlingScope // we can handle these errors server side while just doing a single roundtrip var scope = new ExceptionHandlingScope(cc); using (scope.StartScope()) { using (scope.StartTry()) { webPartToRetrieve.WebPartDefinition = limitedWPManager.WebParts.GetByControlId(webPartToRetrieve.ControlId); cc.Load(webPartToRetrieve.WebPartDefinition, wp => wp.Id, wp => wp.WebPart.ExportMode, wp => wp.WebPart.Title, wp => wp.WebPart.ZoneIndex, wp => wp.WebPart.IsClosed, wp => wp.WebPart.Hidden, wp => wp.WebPart.Properties); } using (scope.StartCatch()) { } } } cc.ExecuteQueryRetry(); // Load the web part XML for the web parts that do allow it bool isDirty = false; foreach (var webPartToRetrieve in webPartsToRetrieve) { // Important to only process the web parts that did not return an error in the previous server call if (webPartToRetrieve.WebPartDefinition != null && (webPartToRetrieve.WebPartDefinition.ServerObjectIsNull.HasValue && webPartToRetrieve.WebPartDefinition.ServerObjectIsNull.Value == false)) { // Retry to load the properties, sometimes they're not retrieved webPartToRetrieve.WebPartDefinition.EnsureProperty(wp => wp.Id); webPartToRetrieve.WebPartDefinition.WebPart.EnsureProperties(wp => wp.ExportMode, wp => wp.Title, wp => wp.ZoneIndex, wp => wp.IsClosed, wp => wp.Hidden, wp => wp.Properties); if (webPartToRetrieve.WebPartDefinition.WebPart.ExportMode == WebPartExportMode.All) { webPartToRetrieve.WebPartXml = limitedWPManager.ExportWebPart(webPartToRetrieve.WebPartDefinition.Id); isDirty = true; } } } if (isDirty) { cc.ExecuteQueryRetry(); } // Determine the web part type and store it in the web parts array foreach (var webPartToRetrieve in webPartsToRetrieve) { if (webPartToRetrieve.WebPartDefinition != null && (webPartToRetrieve.WebPartDefinition.ServerObjectIsNull.HasValue && webPartToRetrieve.WebPartDefinition.ServerObjectIsNull.Value == false)) { // Important to only process the web parts that did not return an error in the previous server call if (webPartToRetrieve.WebPartDefinition.WebPart.ExportMode != WebPartExportMode.All) { // Use different approach to determine type as we can't export the web part XML without indroducing a change webPartToRetrieve.WebPartType = GetTypeFromProperties(webPartToRetrieve.WebPartDefinition.WebPart.Properties); } else { webPartToRetrieve.WebPartType = GetType(webPartToRetrieve.WebPartXml.Value); } webparts.Add(new WebPartEntity() { Title = webPartToRetrieve.WebPartDefinition.WebPart.Title, Type = webPartToRetrieve.WebPartType, Id = webPartToRetrieve.WebPartDefinition.Id, ServerControlId = webPartToRetrieve.Id, Row = webPartToRetrieve.Row, Column = webPartToRetrieve.Column, Order = webPartToRetrieve.Order, ZoneId = "", ZoneIndex = (uint)webPartToRetrieve.WebPartDefinition.WebPart.ZoneIndex, IsClosed = webPartToRetrieve.WebPartDefinition.WebPart.IsClosed, Hidden = webPartToRetrieve.WebPartDefinition.WebPart.Hidden, Properties = Properties(webPartToRetrieve.WebPartDefinition.WebPart.Properties, webPartToRetrieve.WebPartType, webPartToRetrieve.WebPartXml == null ? "" : webPartToRetrieve.WebPartXml.Value), }); } } #region old approach /* * // Load web parts on wiki page * var limitedWPManager = wikiPage.GetLimitedWebPartManager(PersonalizationScope.Shared); * cc.Load(limitedWPManager); * var webParts = limitedWPManager.WebParts; * cc.Load(webParts, p => p.Include(wp => wp.Id, wp => wp.WebPart.ExportMode, wp => wp.WebPart.Title, wp => wp.WebPart.ZoneIndex, wp => wp.WebPart.IsClosed, wp => wp.WebPart.Hidden, wp => wp.WebPart.Properties)); * cc.ExecuteQueryRetry(); * * foreach (var webPartToRetrieve in webPartsToRetrieve) * { * try * { * // Check if the web part was loaded when we loaded the web parts collection via the web part manager * Guid webPartToRetrieveGuid; * if (!Guid.TryParse(webPartToRetrieve.Id, out webPartToRetrieveGuid)) * { * // Skip since guid is not valid * continue; * } * * var foundWebPart = webParts.Where(p => p.Id.Equals(webPartToRetrieveGuid)).FirstOrDefault(); * if (foundWebPart == null) * { * // If not found then try to retrieve the webpart via the GetByControlId method * foundWebPart = limitedWPManager.WebParts.GetByControlId(webPartToRetrieve.ControlId); * cc.Load(foundWebPart, wp => wp.Id, wp => wp.WebPart.ExportMode, wp => wp.WebPart.Title, wp => wp.WebPart.ZoneIndex, wp => wp.WebPart.IsClosed, wp => wp.WebPart.Hidden, wp => wp.WebPart.Properties); * cc.ExecuteQueryRetry(); * } * * if (foundWebPart != null) * { * // Retry to load the properties, sometimes they're not retrieved * foundWebPart.EnsureProperty(wp => wp.Id); * foundWebPart.WebPart.EnsureProperties(wp => wp.ExportMode, wp => wp.Title, wp => wp.ZoneIndex, wp => wp.IsClosed, wp => wp.Hidden, wp => wp.Properties); * * //var changed = false; * string webPartXml = ""; * string webPartType = ""; * var exportMode = foundWebPart.WebPart.ExportMode; * if (foundWebPart.WebPart.ExportMode != WebPartExportMode.All) * { * // Use different approach to determine type as we can't export the web part XML without indroducing a change * webPartType = GetTypeFromProperties(foundWebPart.WebPart.Properties); * } * else * { * * var result = limitedWPManager.ExportWebPart(foundWebPart.Id); * cc.ExecuteQueryRetry(); * webPartXml = result.Value; * webPartType = GetType(webPartXml); * } * * webparts.Add(new WebPartEntity() * { * Title = foundWebPart.WebPart.Title, * Type = webPartType, * Id = foundWebPart.Id, * ServerControlId = webPartToRetrieve.Id, * Row = webPartToRetrieve.Row, * Column = webPartToRetrieve.Column, * Order = webPartToRetrieve.Order, * ZoneId = "", * ZoneIndex = (uint)foundWebPart.WebPart.ZoneIndex, * IsClosed = foundWebPart.WebPart.IsClosed, * Hidden = foundWebPart.WebPart.Hidden, * Properties = Properties(foundWebPart.WebPart.Properties, webPartType, webPartXml), * }); * } * } * catch (ServerException) * { * //Eat exception because we've found a WebPart ID which is not available on the server-side * } * } */ #endregion }
public override void Provision(ClientContext context, Web web) { //create the group createYammerGroup(txtGroupName.Text, (cboNewsfeedType.SelectedValue == "Private") ? true : false); //get user details var response = getYammerJson(String.Format("https://www.yammer.com/api/v1/users/current.json?access_token={0}", hdnYammerAccessToken.Value)); JObject oResponse = JObject.Parse(response); var network = oResponse.SelectToken("network_domains[0]").ToString(); var userId = oResponse.SelectToken("id").ToString(); //get the users groups to check for the group response = getYammerJson(String.Format("https://www.yammer.com/api/v1/groups/for_user/{0}.json", userId)); var groups = JsonConvert.DeserializeObject <List <YamGroup> >(response); string groupId = null; for (int i = 0; i < groups.Count; i++) { if (groups[i].full_name.Equals(txtGroupName.Text, StringComparison.CurrentCultureIgnoreCase)) { groupId = groups[i].Id; break; } } if (groupId != null) { string wpXML = @" <?xml version='1.0' encoding='utf-8'?> <webParts> <webPart xmlns='http://schemas.microsoft.com/WebPart/v3'> <metaData> <type name='Microsoft.SharePoint.WebPartPages.ScriptEditorWebPart, Microsoft.SharePoint, Version=16.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c' /> <importErrorMessage>$Resources:core,ImportErrorMessage;</importErrorMessage> </metaData> <data> <properties> <property name='Title' type='string'>$Resources:core,ScriptEditorWebPartTitle;</property> <property name='Description' type='string'>$Resources:core,ScriptEditorWebPartDescription;</property> <property name='ChromeType' type='chrometype'>None</property> <property name='Content' type='string'> <![CDATA[ <div id='embedded-feed' style='height: 500px;'></div> <script type='text/javascript' src='https://assets.yammer.com/assets/platform_embed.js'></script> <script type='text/javascript'> yam.connect.embedFeed({ container: '#embedded-feed', network: '" + network + @"', feedType: 'group', feedId: '" + groupId + @"'}); </script> ]]> </property> </properties> </data> </webPart> </webParts>"; wpXML = wpXML.Replace("\r\n", ""); //get the web part page var list = web.Lists.GetByTitle("Site Pages"); CamlQuery camlQuery = new CamlQuery(); var items = list.GetItems(camlQuery); context.Load(items, i => i.Include(item => item.DisplayName, item => item["WikiField"]).Where(item => item.DisplayName == "Home")); context.ExecuteQuery(); //remove the sitefeed var wikiPage = items[0].File; LimitedWebPartManager limitedWebPartManager = wikiPage.GetLimitedWebPartManager(PersonalizationScope.Shared); var wps = limitedWebPartManager.WebParts; context.Load(wps); context.ExecuteQuery(); for (int i = 0; i < wps.Count; i++) { var wp = wps[i].WebPart; context.Load(wp); context.ExecuteQuery(); if (wp.ZoneIndex == 1) { wps[i].DeleteWebPart(); context.ExecuteQuery(); break; } } //add the yammer embed WebPartDefinition wpd = limitedWebPartManager.ImportWebPart(wpXML); var newWP = limitedWebPartManager.AddWebPart(wpd.WebPart, "wpz", 0); context.Load(newWP); context.ExecuteQuery(); // Create reference to WebPart in HTML string wikiField = items[0]["WikiField"] as string; XmlDocument xd = new XmlDocument(); xd.PreserveWhitespace = true; xd.LoadXml(wikiField); XmlElement layoutsZoneInner = xd.SelectSingleNode("div/table/tbody/tr[2]/td/div/div") as XmlElement; //create wrapper XmlElement wpWrapper = xd.CreateElement("div"); layoutsZoneInner.AppendChild(wpWrapper); XmlAttribute attribute = xd.CreateAttribute("class"); wpWrapper.Attributes.Append(attribute); attribute.Value = "ms-rtestate-read ms-rte-wpbox"; //create inner elements XmlElement div1 = xd.CreateElement("div"); wpWrapper.AppendChild(div1); div1.IsEmpty = false; attribute = xd.CreateAttribute("class"); div1.Attributes.Append(attribute); attribute.Value = "ms-rtestate-notify ms-rtestate-read " + newWP.Id.ToString("D"); attribute = xd.CreateAttribute("id"); div1.Attributes.Append(attribute); attribute.Value = "div_" + newWP.Id.ToString("D"); XmlElement div2 = xd.CreateElement("div"); wpWrapper.AppendChild(div2); div2.IsEmpty = false; attribute = xd.CreateAttribute("class"); div2.Attributes.Append(attribute); attribute.Value = "ms-rtestate-read"; attribute = xd.CreateAttribute("style"); div2.Attributes.Append(attribute); attribute.Value = "display:none"; attribute = xd.CreateAttribute("id"); div2.Attributes.Append(attribute); attribute.Value = "vid_" + newWP.Id.ToString("D"); // Update items[0]["WikiField"] = xd.OuterXml; items[0].Update(); context.ExecuteQuery(); } }
public SPRemoteEventResult ProcessEvent(SPRemoteEventProperties properties) { SPRemoteEventResult result = new SPRemoteEventResult(); try { using (ClientContext clientContext = TokenHelper.CreateAppEventClientContext(properties, useAppWeb: false)) { if (clientContext != null) { /*INSTALLED*/ if (properties.EventType == SPRemoteEventType.AppInstalled) { //Enable Publishing Feature Guid id = new Guid(PUBLISHING_INFRASTRUCTURE_FEATURE_ID); var query1 = from f in clientContext.Site.Features where f.DefinitionId == id select f; var features = clientContext.LoadQuery(query1); clientContext.ExecuteQuery(); if (features.Count() == 0) { clientContext.Site.Features.Add(id, false, FeatureDefinitionScope.None); clientContext.ExecuteQuery(); } //Create Search Center var query2 = from w in clientContext.Site.RootWeb.Webs where w.Title == SEARCH_CENTER_TITLE select w; var webs = clientContext.LoadQuery(query2); clientContext.ExecuteQuery(); if (webs.Count() == 0) { WebCreationInformation webCreationInfo = new WebCreationInformation(); webCreationInfo.Url = SEARCH_CENTER_URL; webCreationInfo.Title = SEARCH_CENTER_TITLE; webCreationInfo.UseSamePermissionsAsParentSite = true; webCreationInfo.WebTemplate = SEARCH_CENTER_TEMPLATE; Web newWeb = clientContext.Web.Webs.Add(webCreationInfo); clientContext.ExecuteQuery(); } //Upload Display template List gallery = clientContext.Site.RootWeb.Lists.GetByTitle(MASTER_PAGE_GALLERY_TITLE); Folder folder = clientContext.Site.RootWeb.GetFolderByServerRelativeUrl(DISPLAY_TEMPLATE_FOLDER_URL); clientContext.ExecuteQuery(); var query3 = from f in folder.Files where f.Name == DISPLAY_TEMPLATE_NAME select f; var files = clientContext.LoadQuery(query3); clientContext.ExecuteQuery(); if (files.Count() == 0) { System.IO.FileStream fs = System.IO.File.Open( HostingEnvironment.MapPath(DISPLAY_TEMPLATE_PATH), System.IO.FileMode.Open, System.IO.FileAccess.Read); FileCreationInformation fileCreationInfo = new FileCreationInformation(); fileCreationInfo.ContentStream = fs; fileCreationInfo.Url = DISPLAY_TEMPLATE_NAME; fileCreationInfo.Overwrite = true; Microsoft.SharePoint.Client.File newFile = folder.Files.Add(fileCreationInfo); clientContext.Load(newFile); clientContext.ExecuteQuery(); } //Set web part properties webs = clientContext.LoadQuery(query2); clientContext.ExecuteQuery(); File resultsPage = webs.First().GetFileByServerRelativeUrl(SEARCH_PAGE_URL); resultsPage.CheckOut(); clientContext.ExecuteQuery(); LimitedWebPartManager manager = resultsPage.GetLimitedWebPartManager(PersonalizationScope.Shared); var webPartDefs = manager.WebParts; clientContext.Load(webPartDefs, parts => parts.Include(part => part.WebPart.Properties), parts => parts.Include(part => part.WebPart.Title)); clientContext.ExecuteQuery(); foreach (var webPartDef in webPartDefs) { if (webPartDef.WebPart.Title == RESULTS_WEB_PART_TITLE) { webPartDef.WebPart.Properties[DATA_PROVIDER_PROPERTY] = "{\"QueryGroupName\":\"Default\",\"QueryPropertiesTemplateUrl\":\"sitesearch://webroot\",\"IgnoreQueryPropertiesTemplateUrl\":false,\"SourceID\":\"33b36a58-671f-4805-8db1-0078509b88c9\",\"SourceName\":\"InstallerResultSource\",\"SourceLevel\":\"SPSite\",\"CollapseSpecification\":\"\",\"QueryTemplate\":\"{searchboxquery}\",\"FallbackSort\":null,\"FallbackSortJson\":\"null\",\"RankRules\":null,\"RankRulesJson\":\"null\",\"AsynchronousResultRetrieval\":false,\"SendContentBeforeQuery\":true,\"BatchClientQuery\":true,\"FallbackLanguage\":-1,\"FallbackRankingModelID\":\"\",\"EnableStemming\":true,\"EnablePhonetic\":false,\"EnableNicknames\":false,\"EnableInterleaving\":true,\"EnableQueryRules\":true,\"EnableOrderingHitHighlightedProperty\":false,\"HitHighlightedMultivaluePropertyLimit\":-1,\"IgnoreContextualScope\":false,\"ScopeResultsToCurrentSite\":false,\"TrimDuplicates\":true,\"Properties\":{},\"PropertiesJson\":\"{}\",\"ClientType\":\"AllResultsQuery\",\"UpdateAjaxNavigate\":true,\"SummaryLength\":180,\"DesiredSnippetLength\":90,\"PersonalizedQuery\":false,\"FallbackRefinementFilters\":null,\"IgnoreStaleServerQuery\":true,\"RenderTemplateId\":\"\",\"AlternateErrorMessage\":null,\"Title\":\"\"}"; webPartDef.SaveWebPartChanges(); clientContext.ExecuteQuery(); } if (webPartDef.WebPart.Title == NAVIGATION_WEB_PART_TITLE) { webPartDef.DeleteWebPart(); clientContext.ExecuteQuery(); } } resultsPage.CheckIn("Modified by Search Installer.", CheckinType.MajorCheckIn); resultsPage.Publish("Modified by Search Installer."); clientContext.ExecuteQuery(); } /*UNINSTALLING*/ if (properties.EventType == SPRemoteEventType.AppUninstalling) { //Find Search Center var web = clientContext.Site.RootWeb; var query = from w in clientContext.Site.RootWeb.Webs where w.Url == SEARCH_CENTER_URL select w; var webs = clientContext.LoadQuery(query); clientContext.ExecuteQuery(); //Delete the Search Center if (webs.First() != null) { webs.First().DeleteObject(); clientContext.ExecuteQuery(); } } } } result.Status = SPRemoteEventServiceStatus.Continue; } catch (ServerException x) { #if DEBUG if (!System.Diagnostics.EventLog.SourceExists("Installer App Events")) { System.Diagnostics.EventLog.CreateEventSource( "Installer App Events", "Application"); } System.Diagnostics.EventLog.WriteEntry( "Installer App Events", x.Message); #endif result.Status = SPRemoteEventServiceStatus.Continue; } return(result); }
public static string AddWebPart(ClientContext clientContext, ListItem listItem, LimitedWebPartManager wpm, string wikiField, string wpFilename, string zone) { string filepath = HttpContext.Current.Server.MapPath("~/Configuration/" + wpFilename); string webPartFileContents = System.IO.File.ReadAllText(filepath); WebPartDefinition wpd = wpm.ImportWebPart(webPartFileContents); WebPartDefinition wpdNew = wpm.AddWebPart(wpd.WebPart, "wpz", 0); clientContext.Load(wpdNew); clientContext.ExecuteQuery(); // Create reference to WebPart in HTML string marker = String.Format(CultureInfo.InvariantCulture, "<div class=\"ms-rtestate-read ms-rte-wpbox\" contentEditable=\"false\"><div class=\"ms-rtestate-read {0}\" id=\"div_{0}\"></div><div style='display:none' id=\"vid_{0}\"></div></div>", new object[] { wpdNew.Id.ToString("D") }); wikiField = wikiField.Replace(zone, zone + marker); return(wikiField); }
public SPOWebPartDefinition AddWebPartToWikiPage(string webPartXml, string title, int row, int col, bool addSpace) { string wikiField = (string)ListItemAllFields["WikiField"]; XmlDocument xd = new XmlDocument(); xd.PreserveWhitespace = true; xd.LoadXml(wikiField); // Sometimes the wikifield content seems to be surrounded by an additional div? XmlElement layoutsTable = xd.SelectSingleNode("div/div/table") as XmlElement; if (layoutsTable == null) { layoutsTable = xd.SelectSingleNode("div/table") as XmlElement; } XmlElement layoutsZoneInner = layoutsTable.SelectSingleNode(string.Format("tbody/tr[{0}]/td[{1}]/div/div", row, col)) as XmlElement; if (layoutsZoneInner == null) { throw new ArgumentException("Unable to locate row and/or column to insert HTML into."); } LimitedWebPartManager limitedWebPartManager = File.GetLimitedWebPartManager(PersonalizationScope.Shared); WebPartDefinition webPartDefinition = limitedWebPartManager.ImportWebPart(webPartXml); var wpdNew = limitedWebPartManager.AddWebPart(webPartDefinition.WebPart, "wpz", 0); File.Context.Load(wpdNew, w => w.Id, w => w.WebPart); File.Context.ExecuteQuery(); // - space element XmlElement space = xd.CreateElement("p"); XmlText text = xd.CreateTextNode(" "); space.AppendChild(text); // - wpBoxDiv XmlElement wpBoxDiv = xd.CreateElement("div"); layoutsZoneInner.AppendChild(wpBoxDiv); if (addSpace) { layoutsZoneInner.AppendChild(space); } XmlAttribute attribute = xd.CreateAttribute("class"); wpBoxDiv.Attributes.Append(attribute); attribute.Value = "ms-rtestate-read ms-rte-wpbox"; attribute = xd.CreateAttribute("contentEditable"); wpBoxDiv.Attributes.Append(attribute); attribute.Value = "false"; // - div1 XmlElement div1 = xd.CreateElement("div"); wpBoxDiv.AppendChild(div1); div1.IsEmpty = false; attribute = xd.CreateAttribute("class"); div1.Attributes.Append(attribute); attribute.Value = "ms-rtestate-read " + wpdNew.Id.ToString("D"); attribute = xd.CreateAttribute("id"); div1.Attributes.Append(attribute); attribute.Value = "div_" + wpdNew.Id.ToString("D"); // - div2 XmlElement div2 = xd.CreateElement("div"); wpBoxDiv.AppendChild(div2); div2.IsEmpty = false; attribute = xd.CreateAttribute("style"); div2.Attributes.Append(attribute); attribute.Value = "display:none"; attribute = xd.CreateAttribute("id"); div2.Attributes.Append(attribute); attribute.Value = "vid_" + wpdNew.Id.ToString("D"); var listItem = ListItemAllFields; listItem["WikiField"] = xd.OuterXml; listItem.Update(); var spowpd = new SPOWebPartDefinition(wpdNew); if (spowpd.WebPart.Title != title) { spowpd.WebPart.Title = title; spowpd.SaveWebPartChanges(); } return(spowpd); }
private Dictionary <string, string> ReplaceWebPartWebSpecificIDsWithTokens(ClientContext ctx, Web web, string fileUrl, LimitedWebPartManager webPartManager, Dictionary <Guid, List> listIds) { var webPartsXml = new Dictionary <string, string>(); foreach (var wpmWebPart in webPartManager.WebParts) { var part = RequestContextCredentials == null ? WebPartUtility.GetWebPart(ctx, web, fileUrl, wpmWebPart.Id) .Replace("\r", "") .Replace("\n", "") .Trim() .Replace(" ", " ") .Replace(" ", " ") : WebPartUtility.GetWebPart(web, RequestContextCredentials, fileUrl, wpmWebPart.Id) .Replace("\r", "") .Replace("\n", "") .Trim() .Replace(" ", " ") .Replace(" ", " "); part = TokenizeText(web, listIds, part); webPartsXml[wpmWebPart.Id.ToString().ToLower().Replace("{", "").Replace("}", "")] = part; } return(webPartsXml); }
/// <summary> /// Add a web part to a site page. /// </summary> /// <param name="context"> /// The SharePoint context. /// </param> /// <param name="webpartxml"> /// The web part XML. /// </param> /// <param name="pageUrl"> /// The destination page URL. /// </param> /// <param name="zone"> /// The zone ID. /// </param> /// <param name="zoneIndex"> /// The zone index. /// </param> /// <param name="replacetag">Placeholder tag to replace on publishing pages.</param> public static void AddWebPart(ClientContext context, string webpartxml, string pageUrl, string zone, int zoneIndex, string replacetag) { Microsoft.SharePoint.Client.File page = null; try { page = context.Web.GetFileByServerRelativeUrl(pageUrl); ListItem listItemHome = page.ListItemAllFields; context.Load(page); context.Load(listItemHome); context.ExecuteQuery(); page.CheckOut(); LimitedWebPartManager wpm = page.GetLimitedWebPartManager(PersonalizationScope.Shared); WebPartDefinition importedWebPart = wpm.ImportWebPart(webpartxml); WebPartDefinition webPart = wpm.AddWebPart(importedWebPart.WebPart, zone, zoneIndex); context.Load(webPart, w => w.Id); context.ExecuteQuery(); // Position the part at top of the Publishing Page if (zone == "wpz") { // SitePage item if (listItemHome.FieldValues.ContainsKey("WikiField")) { // Look for Placeholder text to replace, keeps the web part in the table (no zones) string pageContents = listItemHome["WikiField"] as string; if (pageContents != null && pageContents.Contains(replacetag)) { listItemHome["WikiField"] = pageContents.Replace(replacetag, GetEmbeddedWebPart(webPart.Id)); } else { listItemHome["WikiField"] = string.Concat(GetEmbeddedWebPart(webPart.Id), pageContents); } } else if (listItemHome.FieldValues.ContainsKey("PublishingPageContent")) { // Pages item listItemHome["PublishingPageContent"] = string.Concat(GetEmbeddedWebPart(webPart.Id), "<br/>", listItemHome["PublishingPageContent"], "<br/>"); } listItemHome.Update(); context.ExecuteQuery(); } } catch (Exception e) { // Error handling System.Diagnostics.Trace.TraceError("Error Adding Opportunity WebPart to page " + e.Message); } finally { if (page != null) { page.CheckIn("Added the Opportunity Details Web Part", CheckinType.MinorCheckIn); ////page.Publish("Added the Opportunity Details Web Part"); context.ExecuteQuery(); } } }
/// <summary> /// Adds all web parts on matter landing page. /// </summary> /// <param name="clientContext">Client Context</param> /// <param name="limitedWebPartManager">LimitedWebPartManager object to import web parts</param> /// <param name="webPartDefinition">WebPartDefinition object to add web parts on page</param> /// <param name="webParts">Array of web parts that should be added on Matter Landing Page</param> /// <param name="zones">Array of Zone IDs</param> /// <returns>Success flag</returns> public bool AddWebPart(ClientContext clientContext, LimitedWebPartManager limitedWebPartManager, WebPartDefinition webPartDefinition, string[] webParts, string[] zones) { bool result = false; if (null != clientContext && null != limitedWebPartManager && null != webParts && null != zones) { int index = 0; try { for (index = 0; index < webParts.Length; index++) { if (!string.IsNullOrWhiteSpace(webParts[index])) { webPartDefinition = limitedWebPartManager.ImportWebPart(webParts[index]); limitedWebPartManager.AddWebPart(webPartDefinition.WebPart, zones[index], ServiceConstants.ZONE_INDEX); clientContext.ExecuteQuery(); } } } catch (Exception) { result = false; } } return result; }
public static void SetSupportCaseContent(ClientContext ctx, string pageName, string url, string queryurl) { List pages = ctx.Web.Lists.GetByTitle("Pages"); ctx.Load(pages.RootFolder, f => f.ServerRelativeUrl); ctx.ExecuteQuery(); Microsoft.SharePoint.Client.File file = ctx.Web.GetFileByServerRelativeUrl(pages.RootFolder.ServerRelativeUrl + "/" + pageName + ".aspx"); ctx.Load(file); ctx.ExecuteQuery(); file.CheckOut(); LimitedWebPartManager limitedWebPartManager = file.GetLimitedWebPartManager(PersonalizationScope.Shared); string quicklaunchmenuFormat = @"<div><a href='{0}/{1}'>Sample Home Page</a></div> <br /> <div style='font-weight:bold'>CSR Dashboard</div> <div class='cdsm_mainmenu'> <ul> <li><a href='{0}/CSRInfo/{1}'>My CSR Info</a></li> <li><a href='{0}/CallQueue/{1}'>Call Queue</a></li> <li> <span class='collapse_arrow'></span> <span><a href='{0}/CustomerDashboard/{1}'>Customer Dashboard</a></span> <ul> <li><a href='{0}/CustomerDashboard/Orders{1}'>Recent Orders</a></li> <li><a class='current' href='#'>Support Cases</a></li> <li><a href='{0}/CustomerDashboard/Notes{1}'>Notes</a></li> </ul> </li> </ul> </div> <div class='cdsm_submenu'> </div>"; string quicklaunchmenu = string.Format(quicklaunchmenuFormat, url, queryurl); string qlwebPartXml = "<?xml version=\"1.0\" encoding=\"utf-8\"?><webParts><webPart xmlns=\"http://schemas.microsoft.com/WebPart/v3\"><metaData><type name=\"Microsoft.SharePoint.WebPartPages.ScriptEditorWebPart, Microsoft.SharePoint, Version=15.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c\" /><importErrorMessage>Cannot import this Web Part.</importErrorMessage></metaData><data><properties><property name=\"Content\" type=\"string\"><![CDATA[" + quicklaunchmenu + "]]></property><property name=\"ChromeType\" type=\"chrometype\">None</property></properties></data></webPart></webParts>"; WebPartDefinition qlWpd = limitedWebPartManager.ImportWebPart(qlwebPartXml); WebPartDefinition qlWpdNew = limitedWebPartManager.AddWebPart(qlWpd.WebPart, "SupportCasesZoneLeft", 0); ctx.Load(qlWpdNew); //Customer Dropdown List Script Web Part string dpwebPartXml = System.IO.File.ReadAllText(System.Web.Hosting.HostingEnvironment.ApplicationPhysicalPath + "Assets/CustomerDropDownlist.webpart"); WebPartDefinition dpWpd = limitedWebPartManager.ImportWebPart(dpwebPartXml); WebPartDefinition dpWpdNew = limitedWebPartManager.AddWebPart(dpWpd.WebPart, "SupportCasesZoneTop", 0); ctx.Load(dpWpdNew); //Support Case CBS Info Web Part string cbsInfoWebPartXml = System.IO.File.ReadAllText(System.Web.Hosting.HostingEnvironment.ApplicationPhysicalPath + "Assets/SupportCaseCBSWebPartInfo.webpart"); WebPartDefinition cbsInfoWpd = limitedWebPartManager.ImportWebPart(cbsInfoWebPartXml); WebPartDefinition cbsInfoWpdNew = limitedWebPartManager.AddWebPart(cbsInfoWpd.WebPart, "SupportCasesZoneMiddle", 0); ctx.Load(cbsInfoWpdNew); //Support Case Content By Search Web Part string cbswebPartXml = System.IO.File.ReadAllText(System.Web.Hosting.HostingEnvironment.ApplicationPhysicalPath + "Assets/SupportCase CBS Webpart/SupportCaseCBS.webpart"); WebPartDefinition cbsWpd = limitedWebPartManager.ImportWebPart(cbswebPartXml); WebPartDefinition cbsWpdNew = limitedWebPartManager.AddWebPart(cbsWpd.WebPart, "SupportCasesZoneMiddle", 1); ctx.Load(cbsWpdNew); //Support Cases App Part string appPartXml = System.IO.File.ReadAllText(System.Web.Hosting.HostingEnvironment.ApplicationPhysicalPath + "Assets/SupportCaseAppPart.webpart"); WebPartDefinition appPartWpd = limitedWebPartManager.ImportWebPart(appPartXml); WebPartDefinition appPartdNew = limitedWebPartManager.AddWebPart(appPartWpd.WebPart, "SupportCasesZoneBottom", 0); ctx.Load(appPartdNew); //Get Host Web Query String and show support case list web part string querywebPartXml = System.IO.File.ReadAllText(System.Web.Hosting.HostingEnvironment.ApplicationPhysicalPath + "Assets/GetHostWebQueryStringAndShowList.webpart"); WebPartDefinition queryWpd = limitedWebPartManager.ImportWebPart(querywebPartXml); WebPartDefinition queryWpdNew = limitedWebPartManager.AddWebPart(queryWpd.WebPart, "SupportCasesZoneBottom", 1); ctx.Load(queryWpdNew); file.CheckIn("Data storage model", CheckinType.MajorCheckIn); file.Publish("Data storage model"); ctx.Load(file); ctx.ExecuteQuery(); }