12

I've been looking for a way to add a web part to a page using JSOM/CSOM or any other api available to sharepoint hosted apps.

The only solutions I have found so far are for custom sharepoint solutions. Could anyone confirm that this is (im)possible?

To be clear, I want to add a web part to a sharepoint page. Not to a page of my app.

  • If you give access to the library that holds the web part page, then you could probably edit it through jsom, and then add web part. Heh, if you could do that you could actually edit the iframe tag that holds your app, and through html5 (sandbox allow attribute) give full access, which renders the DNS-solution for cross origin lockdown useless.. so perhaps not – eirikb Feb 26 '14 at 15:16
  • is this what you are looking for : sharepoint.stackexchange.com/questions/79579/… ? – Cameron Verhelst Feb 26 '14 at 15:44
  • @CameronVerhelst that answer is csom, not jsom. And, for what it is worth, missing the auth, but could probably be converted to jsom. This might be interesting though: sharepoint.stackexchange.com/a/86569/627 – eirikb Feb 26 '14 at 15:47
  • 4
    I realise this, but the question does ask for either JSOM/CSOM – Cameron Verhelst Feb 26 '14 at 15:49
  • 2
    If anyone is interested, I have found something interesting myself in the meantime at msdn.microsoft.com/en-us/library/office/… – Glenn Vandamme Feb 26 '14 at 15:56
15

How to add WebPart client object on page via JSOM

function addWebPart(webUrl, pageUrl,webPartXml,zoneId,zoneIndex, Success,Error){
    var context = new SP.ClientContext(webUrl);
    var web = context.get_web();

    var file = web.getFileByServerRelativeUrl(webUrl + pageUrl);
    var webPartMngr = file.getLimitedWebPartManager(SP.WebParts.PersonalizationScope.shared);
    var webPartDef = webPartMngr.importWebPart(webPartXml);
    var webPart = webPartDef.get_webPart();
    webPartMngr.addWebPart(webPart, zoneId, zoneIndex);

    context.load(webPart);
    context.executeQueryAsync(
      function() {
        Success(webPart);
      },
      Error
    );
}

Example: add Content Editor on root web

var webPartXml = '<?xml version="1.0" encoding="utf-8"?>' +
'<WebPart xmlns="http://schemas.microsoft.com/WebPart/v2">' +
    '<Assembly>Microsoft.SharePoint, Version=16.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c</Assembly>' + 
    '<TypeName>Microsoft.SharePoint.WebPartPages.ContentEditorWebPart</TypeName>' + 
    '<Title>$Resources:core,ContentEditorWebPartTitle;</Title>' +
    '<Description>$Resources:core,ContentEditorWebPartDescription;</Description>' +
    '<PartImageLarge>/_layouts/15/images/mscontl.gif</PartImageLarge>' +
'</WebPart>';

addWebPart('/','Pages/default.aspx',webPartXml,'Left',1,function(webPart){
    console.log(webPart.get_title() + ' has been added'); 
},function(sender,args){
    console.log(args.get_message());
});
  • 1
    Nice answer (+1). Perhaps send in context and web, since you would need to call set_webRequestExecutorFactory? Also, I tried to do this with REST earlier before your post, but I wasn't able to call addWebPart, I just got 404, any idea why? (importWebPart worked fine, at least I got some kind of reply) – eirikb Feb 26 '14 at 19:20
  • Thanks! Good idea, but I have not found a way to add web part on page via REST yet. – Vadim Gremyachev Mar 3 '14 at 11:00
  • 2
    "I wasn't able to call addWebPart, I just got 404, any idea why?" The AddWebPart_Client method of the SPLimitedWebPartManager class is the client-side equivalent of the AddWebPart method. Unfortunately, this method is decorated with a ClientCallableMethod attribute having ClientLibraryTargets=ClientLibraryTargets.NonRESTful, making this method unusable from REST calls. – pholpar Jul 22 '16 at 12:23

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.