2014-12-03 11 views
5

qualcuno è riuscito ad aggiungere una web part in una pagina Wiki utilizzando CSOM?Come aggiungere una web part in un SitePages/Home.aspx utilizzando CSOM

Background: Home.aspx è una pagina Wiki e tutti i suoi WP si trovano nella zona di testo ricco (infatti una colonna "WikiField"). Tecnicamente si trovano in una zona web nascosta "wpz" e in aggiunta a questo c'è sempre un segnaposto con l'ID di WP nella colonna WikiField.

Ho modificato il codice lato server esistente visto su http://blog.mastykarz.nl/programmatically-adding-web-parts-rich-content-sharepoint-2010/ e http://640kbisenough.com/2014/06/26/sharepoint-2013-moving-webparts-programmatically-to-rich-content-zone/ in questo:

using System; 
using Microsoft.SharePoint.Client; 
using Microsoft.SharePoint.Client.WebParts; 

public class Class1 
{ 
    void DeployWebPart(ClientContext clientContext, string zone, string pattern, string position) 
    { 
     List library = clientContext.Web.GetList("/sites/site/SitePages/"); 
     clientContext.Load(library); 
     clientContext.ExecuteQuery(); 
     CamlQuery query = CamlQuery.CreateAllItemsQuery(100); 
     ListItemCollection itemColl = library.GetItems(query); 
     clientContext.Load(itemColl, items => items.Include(i => i.Id, i => i.DisplayName, i => i["WikiField"])); 
     clientContext.ExecuteQuery(); 
     ListItem item = itemColl.Where(i => i.DisplayName == "Home").First(); 
     clientContext.ExecuteQuery(); 
     File page = item.File; 
     LimitedWebPartManager lwm = page.GetLimitedWebPartManager(PersonalizationScope.Shared); 
     string xmlWebPart = @"<webParts>...</webParts>"; 
     WebPartDefinition wpd = lwm.ImportWebPart(xmlWebPart); 
     WebPartDefinition realWpd = lwm.AddWebPart(wpd.WebPart, "wpz", 0); 
     List targetList = clientContext.Web.GetList("/sites/site/Announcements/"); 
     clientContext.Load(targetList, l => l.Views); 
     clientContext.Load(realWpd); 
     clientContext.ExecuteQuery(); 
     string wpId = String.Format("g_{0}", realWpd.Id.ToString().Replace('-', '_')); 
     if (zone == "wpz") 
     { 
      string htmlcontent = String.Format(CultureInfo.InvariantCulture, "<div class=\"ms-rtestate-read ms-rte-wpbox\" contenteditable=\"false\"><div class=\"ms-rtestate-notify ms-rtestate-read {0}\" id=\"div_{0}\"></div><div id=\"vid_{0}\" style=\"display:none;\"></div></div>", new object[] { realWpd.Id.ToString("D") }); 
      string content = item["WikiField"] as string; 
      System.Text.RegularExpressions.Regex regex = new System.Text.RegularExpressions.Regex(System.Text.RegularExpressions.Regex.Escape(pattern)); 
      if (position == "before") 
      { 
       content = regex.Replace(content, (htmlcontent + pattern), 1); 
      } 
      else 
      { 
       content = regex.Replace(content, (pattern + htmlcontent), 1); 
      } 
      item.Update(); 
      clientContext.ExecuteQuery(); 
     } 
    } 
} 

Tutto funziona bene fino all'ultimo item.Update() e clientContext.ExecuteQuery() vengono invocati. Prima dell'aggiornamento() il nuovo segnaposto viene inserito correttamente nei contenuti di WikiField. Ma dopo l'aggiornamento() il contenuto del WikiField ritorna allo stato originale (!)

Nota: in alternativa è possibile aggiungere il WP in un'altra zona (ad esempio "Fondo"). In questo caso il WP viene visualizzato sulla pagina. Ma ha due principali svantaggi: la zona appena creata non è ben formattata e il WP non può essere spostato o eliminato.

Grazie per qualsiasi input su questo.

risposta

3

L'esempio seguente mostra come aggiungere web part nella pagina Enterprise Wiki:

public static void AddWebPartIntoWikiPage(ClientContext context, string pageUrl, string webPartXml) 
{ 
     var page = context.Web.GetFileByServerRelativeUrl(pageUrl); 
     var webPartManager = page.GetLimitedWebPartManager(PersonalizationScope.Shared); 

     var importedWebPart = webPartManager.ImportWebPart(webPartXml); 
     var webPart = webPartManager.AddWebPart(importedWebPart.WebPart, "wpz", 0); 
     context.Load(webPart); 
     context.ExecuteQuery(); 

     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>", webPart.Id); 
     ListItem item = page.ListItemAllFields; 
     context.Load(item); 
     context.ExecuteQuery(); 
     item["PublishingPageContent"] = marker; 
     item.Update(); 
     context.ExecuteQuery(); 
} 

Uso

var webPartXml = System.IO.File.ReadAllText(filePath); 
using (var ctx = new ClientContext(webUri)) 
{ 
    AddWebPartIntoWikiPage(ctx, wikiPageUrl,webPartXml); 
} 

Risultato

enter image description here

+1

Ciao Vadim, io sono non un esperto in editoria ma la normale pagina Wiki (es. /SitePages/Home.aspx) il tipo di contenuto non ha il campo PublishingPageContent. Tutto quello che posso vedere è un campo WikiField. Il tuo codice non è stato in grado di aggiornare il contenuto del WikiField, sfortunatamente. Avresti qualche altra idea? –

+0

Ho lo stesso problema di Jan. Non ho potuto modificare il campo PublishingPageContent. –

+3

Abbiamo questo funzionamento, sostituendo 'PublishingPageContent' con 'WikiField' – dhendry