Add Custom Tabs and Groups to the Ribbon on SharePoint using CSOM PowerShell

Introduction

In this article, you will learn how to add custom ribbon tabs, ribbon groups and ribbon items (user actions) for the list, using CSOM Powershell on SharePoint 2013 / SharePoint online sites.

Steps Involved

The following prerequisites are required to be executed before going for any operations using CSOM PowerShell on SharePoint sites.

  1. Add the references, using the Add-Type command with the necessary reference paths. The necessary references are Client.dll, Client.Runtime.dll and publishing.dll.

    Add-Type -Path "C:\Program Files\Common Files\microsoft shared\Web Server Extensions\16\ISAPI\Microsoft.SharePoint.Client.dll"

    Add-Type -Path "C:\Program Files\Common Files\microsoft shared\Web Server Extensions\16\ISAPI\Microsoft.SharePoint.Client.Runtime.dll"

    Add-Type -Path "C:\Program Files\Common Files\microsoft shared\Web Server Extensions\16\ISAPI\Microsoft.SharePoint.Client.Publishing.dll"

  2. Initialize the client context object with the site URL.
    1. $siteURL = ""  
    2. $ctx = New-Object Microsoft.SharePoint.Client.ClientContext($siteURL)  
  3. If you are trying to access SharePoint online site, you need to setup the site credentials with the credentials parameter and load it to the client context. 
    1. #Not required for on premise site - Start  
    2. $userId = ""  
    3. $pwd = Read-Host -Prompt "Enter password" -AsSecureString  
    4. $creds = New-Object Microsoft.SharePoint.Client.SharePointOnlineCredentials($userId, $pwd)  
    5. $ctx.credentials = $creds  
    6. #Not required for on premise site - End  
  4. If you are trying to access SharePoint on premise site, the credentials parameter is not required to be set to the context, but you need to run the code on the respective SharePoint Server or you need to pass the network credentials and set the context.
    1. #Credentials for on premise site - Start  
    2. $pwd = Read-Host -Prompt "Enter password" -AsSecureString  
    3. $creds = New-Object System.Net.NetworkCredential("domain\userid", $pwd)  
    4. $ctx.Credentials = $creds  
    5. #Credentials for on premise site - End  

We will see how we can add the custom ribbon tabs and the other components to SharePoint list ribbon.

  • Get the existing user action collection. Access the Web and get the existing user actions, using UserCustomActions property. Load and execute the property.

  • Add new custom action to the user actions collection. The necessary parameters for the new action are registration ID, title, registration type and location. Here, we need to set the ribbon tab values.

    • Registration ID - Corresponding List template ID to add the user action. For example, here 100 denotes the custom list templates.

    • Registration Type - Denotes the association type.

    • Location - Custom action location.

  • Build the XML for the new extension. The following are the steps considered:
    • New custom tab has been added to the ribbon. 
    • The new group has been associated with the tab created. 
    • The custom control (button) is added to the group created.

  • Update and execute to see the changes.
The XML extension contains the following elements.
  • New definition for tab with the specified ribbon location. The tab will contain scaling and group components.

    • The scaling will denote the behavior of the tab (sizing). The size is associated to the layout title under the group template.

    • The groups can have one or more group elements. Each group will have the properties like title, description, template (associated to group template) and id. The group also contains the controls that are associated. The controls are button, label, etc. 

      • For each control, set the necessary parameters. The command parameter is associated to UIHandler. The TemplateAlias should match alias name, defined for the control under the group template.

  • Another definition for the group template needs to be created. Here, the new template details for the group, layout mapping and display mode (size) for the controls are defined.

  • The UIHandler section contains necessary JavaScript function for the controls defined. 
The following piece of code shows the operation with the necessary XML.
  1. $web = $ctx.Site.RootWeb  
  2. $userActions = $web.UserCustomActions  
  3. $ctx.Load($userActions)   
  4. $ctx.ExecuteQuery()   
  5.   
  6. $newRibbonItem = $userActions.Add()  
  7. $newRibbonItem.RegistrationId = "100"  
  8. $newRibbonItem.Title = "Custom Ribbon Tab"  
  9. $newRibbonItem.RegistrationType = [Microsoft.SharePoint.Client.UserCustomActionRegistrationType]::List  
  10. #$newRibbonItem.Id = "Ribbon.CustomTab"  
  11. $newRibbonItem.Location = "CommandUI.Ribbon"  
  12.   
  13. $ribbonUI = '<CommandUIExtension>  
  14.                     <CommandUIDefinitions>  
  15.                         <CommandUIDefinition Location="Ribbon.Tabs._children">  
  16.                             <Tab Id="Ribbon.CustomTab" Title="Custom Tab" Description="Custom Tab with groups and user action" Sequence="100">  
  17.                                 <Scaling Id="Ribbon.CustomTab.Scaling">  
  18.                                     <MaxSize Id="Ribbon.CustomTab.CustomGroup1.MaxSize"  
  19.                                         GroupId="Ribbon.CustomTab.CustomGroup1"  
  20.                                         Size="LargeLayout" />  
  21.                                 </Scaling>  
  22.                                 <Groups Id="Ribbon.CustomTab.CustomGroups">  
  23.                                     <Group Id="Ribbon.CustomTab.CustomGroup1"  
  24.                                         Description="Collection of user actions"  
  25.                                         Title="CustomGroup1"  
  26.                                         Sequence="20"  
  27.                                         Template="Ribbon.Templates.LargeLayout">  
  28.                                         <Controls Id="Ribbon.CustomTab.CustomGroup1.Controls">  
  29.                                             <Button Id="Ribbon.CustomTab.CustomGroup1.ShowAlert" Alt="Show Alert" Sequence="101"  
  30.                                                  Command="ShowRibbonAlert"  
  31.                                                  LabelText="Custom Alert"  
  32.                                                  Image32by32="_layouts/15/images/alertme.png"  
  33.                                                  Image16by16="_layouts/15/images/alertme.png"  
  34.                                                  TemplateAlias="ButtonTemplate" />  
  35.                                         </Controls>  
  36.                                     </Group>  
  37.                                 </Groups>  
  38.                             </Tab>  
  39.   
  40.                        </CommandUIDefinition>  
  41.                         <CommandUIDefinition Location="Ribbon.Templates._children">   
  42.                             <GroupTemplate Id="Ribbon.Templates.LargeLayout">   
  43.                                 <Layout Title="LargeLayout" LayoutTitle="LargeLayout">   
  44.                                     <Section Alignment="Top" Type="OneRow">   
  45.                                         <Row>   
  46.                                             <ControlRef DisplayMode="Large" TemplateAlias="ButtonTemplate" />   
  47.                                         </Row>   
  48.                                     </Section>   
  49.                                 </Layout>   
  50.                             </GroupTemplate>   
  51.                         </CommandUIDefinition>  
  52.                     </CommandUIDefinitions>  
  53.                     <CommandUIHandlers>  
  54.                         <CommandUIHandler Command="ShowRibbonAlert"  
  55.                              CommandAction="javascript:alert(''hi'');"/>  
  56.                     </CommandUIHandlers>  
  57.                 </CommandUIExtension >'  
  58.   
  59. $newRibbonItem.CommandUIExtension = $ribbonUI  
  60. $newRibbonItem.Update()  
  61. $ctx.Load($newRibbonItem)  
  62. $ctx.ExecuteQuery()  
The following image shows the tab along with the group and control.


Summary

Thus, you learned how to add the custom ribbon tab, ribbon group to the tab and user actions to the group for a SharePoint list, using CSOM PowerShell on SharePoint 2013 / SharePoint online sites.