Einige Kunden möchten den Funktionsumfang der SharePoint 2010 Standardvorlagen (bspw. Publishing Site) reduzieren und beispielsweise vordefinierte Menüpunkte aus der Ribbon oder dem Site Action-Menü ausblenden. Diese Menüpunkte fallen entweder komplett weg oder werden durch eigene Mechanismen ersetzt, die mehr Restriktion ermöglichen.

Um die Kundenspezifische Anpassung einer Website zu realisieren, empfiehlt es sich ein Feature zu erstellen, das bei Bedarf aktiviert und deaktiviert werden kann. Nachfolgend möchte ich  zeigen, wie das Ausblenden der SharePoint-Elemente via .Net Code realisiert werden kann.

 

Einträge aus dem SiteAction-Menü entfernen

Um Elemente aus dem Site Action Menü zu entfernen, klinkt man sich mit einer SharePoint-CustomAction und einem eigenen Control in das Site Action Menü ein und kann auf diese Weise Einfluss auf die Darstellung nehmen. Die folgende Custom Action registriert das Control und injiziert  auf diese Weise die Logik zum Ausblenden der Menüeinträge.

<CustomAction
Id=“SiteActionsToolbarHide“
Title=“Publishing Site Actions Menu Customization“
Description=“Hides elements from the site action menu“
Location=“Microsoft.SharePoint.StandardMenu“
GroupId=“SiteActions“
Sequence=“209″
ControlAssembly=“HanseVision.Customization, Version=1.0.0.0, Culture=neutral, PublicKeyToken=3241ec53f7b982b7″
ControlClass=“HanseVision.Customization.Controls.HideSiteActionMenuEntryControl“>
</CustomAction>

Folgender C#-Code wird die Menüeinträge mit der Id “wsaCreatePage”, “MenuItem_CreateDocLib” und “MenuItem_Create” aus dem SiteAction-Menü ausgeblenden.

public class HideSiteActionMenuEntryControl : WebControl
    {
        protected override void OnLoad(EventArgs e)
        {
            var menu = ToolBarMenuButton.GetMenuControl(this);
            menu.MenuControl.PreRender += (o, args) =>;
            {
                var createPageItem = menu.GetMenuItem("wsaCreatePage");
                if (createPageItem != null)
                    menu.MenuControl.HiddenMenuItems.Add(createPageItem);

                var createLibItem = menu.GetMenuItem("MenuItem_CreateDocLib");
                if (createLibItem != null)
                    menu.MenuControl.HiddenMenuItems.Add(createLibItem);

                var createItem = menu.GetMenuItem("MenuItem_Create");
                if (createItem != null)
                    menu.MenuControl.HiddenMenuItems.Add(createItem);
            };
        }
    }

 

Einträge aus der Ribbon entfernen

Um diese Anforderung zu realisieren, hänge ich ein eigenes User Control (ASCX) an ein Delegate Control in der Seite. Das Delegate Control “AdditionalPageHead” ist auf jeder SharePoint-Seite verfügbar und somit für diesem Anwendungsfall ideal.

Delegate-Registrierung:

<Control Id=“AdditionalPageHead“ ControlSrc=“~/_controltemplates/HanseVision/Customization/RibbonModification.ascx“ Sequence=“1″ />
 
Im C#-Code des User Controls kann nun programmatisch auf die Ribbon-Elemente zugegriffen werden. Nachfolgender Code entfernt die definierten Ribbon-Elemente anhand ihrer ID.

 public partial class RibbonModification : UserControl
{
protected void Page_Load(object sender, EventArgs e)
{
// IDs of Ribbon HTML RTE are defined in:
//C:\Program Files\Common Files\Microsoft Shared\Web Server Extensions\14\TEMPLATE\GLOBAL\XML\CMDUI.XML
SPRibbon ribbon = SPRibbon.GetCurrent(this.Page);
if (ribbon != null)
{
//hide the following ribbon controls
ribbon.TrimById(„Ribbon.EditingTools.CPEditTab.Font.Underline“);
ribbon.TrimById(„Ribbon.EditingTools.CPEditTab.Font.Fonts“);
ribbon.TrimById(„Ribbon.EditingTools.CPEditTab.Font.FontSize“);
ribbon.TrimById(„Ribbon.EditingTools.CPInsert.Media.Media“); //Silverlight Video Webpart
ribbon.TrimById(„Ribbon.EditingTools.CPInsert.Tables.Table“);// insert table
}
}
}

Mit diesen beiden Möglichkeiten und den  “HideCustomActions” von SharePoint kann der Funktionsumfang von SharePoint auf die Kundenanforderungen reduziert werden. Auch wenn der Fokus meistens auf Erweiterbarkeit von SharePoint-Funktionalität liegt, ist es doch schön zu wissen, dass unerwünschte Funktionalität einfach aus dem Standard entfernt werden kann.