Tuesday, May 18, 2010

Add a WebPart into the Rich Content of a wiki page in SP2010

After a long struggle looking in the SP API for how to insert a WebPart in the "rich content" of a wiki page, i found the answer. Thanks to Stefan Stanev for posting the answer to my question.

I have modified the code a bit to suite my needs

SPSite osite = properties.Feature.Parent as SPSite; 
   using (SPWeb oWeb = osite.OpenWeb(osite.RootWeb.ID)) 
  {
    //SPLimitedWebPartManager webpartsManager =  oWeb.GetLimitedWebPartManager(oWeb.RootFolder.WelcomePage, PersonalizationScope.Shared);

   SPFile file = oWeb.GetFile(oWeb.RootFolder.WelcomePage);
   Guid cwpID = AddWebPartToRichContent(file);
   Guid xlvID = AddListWebPartToRichContent(file, "Announcements");

  }

private Guid AddWebPartToRichContent(SPFile file)
{
// NOTE: we assume that the SPFile was checked out
// get the limited wp manager for that SPFile
SPLimitedWebPartManager mngr = file.GetLimitedWebPartManager(PersonalizationScope.Shared);

// create a sample content editor wp
ContentEditorWebPart cwp = new ContentEditorWebPart();
cwp.Title = "My editor";

// add the web part to the special wpz zone
mngr.AddWebPart(cwp, "wpz", 0);

// store the web part's internal ID
Guid cwpID = mngr.GetStorageKey(cwp);

// get the list item for that SPFile
SPListItem item = file.Item;

// update the PublishingPageContent field value
item["WikiField"] += this.GetEmbeddedWPString(cwpID);

// update the item
item.SystemUpdate(false);

// the SPFile instance can be checked in, published, approved afterwards

return cwpID;

}

private Guid AddListWebPartToRichContent(SPFile file, string listTitle)
{
// NOTE: we assume that the SPFile was checked out
// get the limited wp manager for that SPFile
SPLimitedWebPartManager mngr = file.GetLimitedWebPartManager(PersonalizationScope.Shared);

// create a sample XLV
XsltListViewWebPart xlv = new XsltListViewWebPart();

// get a target list
SPList list = file.ParentFolder.ParentWeb.Lists[listTitle];

// set the ListName property with the capitalized list ID w/o the curly braces
xlv.ListName = list.ID.ToString("B").ToUpper();

// use the schema of the default view
xlv.ViewGuid = list.DefaultView.ID.ToString("B").ToUpper();

// add the web part to the special wpz zone
mngr.AddWebPart(xlv, "wpz", 0);

// store the web part's internal ID
Guid xlvID = mngr.GetStorageKey(xlv);

// get the list item for that SPFile
SPListItem item = file.Item;

// update the PublishingPageContent field value
item["WikiField"] += this.GetEmbeddedWPString(xlvID);

// update the item
item.SystemUpdate(false);

// the SPFile instance can be checked in, published, approved afterwards

return xlvID;

}

private string GetEmbeddedWPString(Guid wpID)
{
const string form = @"
                                    

                                    

                                    

                                    
                                   
";

// set the web part's ID as part of the ID-s of tho div elements
return string.Format(form, wpID);

}


I hope this would help someone out there.

Update: Found another helpful post
http://www.habaneros.com/mobile/blog/10-03-30/Programmatically_Change_Content_on_a_Wiki_Page_in_SharePoint_2010.aspx