Nachdem ich mich gerade "ein wenig" mit ein paar "Themen" rund um CustomActions beschäftigt habe (freundlich ausgedrückt – immerhin ist es 04:00 in der Früh und ich hab mich durch aus ein wenig geärgert) – möchte ich der weiten Welt meine Erleuchtungen nicht vorenthalten :)
Grundsätzlich sind ja CustomActions eine einfache Möglichkeit in SharePoint eigene Menüeinträge in den Websiteeinstellungen, Listeneinstellungen, beim Menu eines Elements, … hinzuzfügen –> um mit einer Verlinkung dann auf einer eigenen Seite eigenen Code auszuführen. Wir verwenden das eigentlich überall… angefangen von eigenen Konfigurationseinstellungen in der Zentraladministration bis hin zu eigens hinterlegten Upload-Seiten bei Dokumentenbibliotheken.
Wir haben jüngst eine relativ einfache Solution geschrieben um bei einer Bibliothek / Ordner die effektiven Berechtigungen - wirklich runtergebrochen auf den User – anzuzeigen, d.h. jeder Benutzer der in einer Bibliothek / Ordner was hochladet, soll sich ansehen können –> wer darf eigentlich das was ich hochlade sehen? Die Anforderung ist grundsätzlich nicht so banal, weil man einerseits SharePoint-Gruppen und verschachtelte Active Directory Gruppen auflösen muss um alle effektiven Berechtigungen pro Benutzer wirklich darstellen zu können – aber das ist eine andere Geschichte, hier gehts um die CustomAction…
Die Solution ist relativ einfach aufgebaut – es gibt ein Feature SharxXPermission\MenuEntries und eine layouts-Seite ElementPermissions.aspx
In der MenuEntries.xml ist eine CustomAction (grundsätzliche Einstellungsmöglichkeiten findet man hier - http://msdn.microsoft.com/en-us/library/ms460194.aspx und in welche Menü's man sich überall hineinhängen kann hier http://msdn.microsoft.com/en-us/library/bb802730.aspx) hinterlegt
Bis dato noch relativ einfach – vor allem kann man auch über definierte Tokens verschiedene Parameter bei der Url mitgeben (http://hristopavlov.wordpress.com/2008/12/08/urlaction-tokens-of-the-customaction-feature/). Aber man hat ja hohe Ansprüche an sich selbst und will alles perfekt machen. Und wie sollte das aussehen? Natürlich am besten so wie direkt im SharePoint und zwar sollte man über den Breadcrumb erkennen, wo man sich gerade die Berechtigungen ansieht (egal in welcher Subwebsite und in welchem Unterordner man sich befindet). Also so:
Ha – da wirds schon ein wenig kniffelig :)
Damit man den Standard BreadCrumb vom SharePoint verwenden kann muss man im Layouts Verzeichnis ein eigenes xml File anlegen nach der Namenskonvention layouts.sitemap.[eigener Name].xml und dort definieren wie man sich in den SharePoint über den SPContentMapProvider hineinhängen will.
Wer es ganz perfekt machen will, der hängt zu seinem Feature noch einen EventReceiver der beim FeatureActived folgenden Code ausführt
dann wird auch alles vollautomatisch deployed (ansonsten muss man noch händisch ein STSADM -o copyappbincontent ausführen – damit das auch in _app_bin/layouts.sitemap deployed wird)
So aber damit das ganze nicht zu einfach ist, müssen wir jetzt auch noch die richtigen Parameter mit übergeben, damit der SharePoint Breadcrumb uns auch wirklich die komplette Ordnerstruktur aufbaut. Was dazu notwendig ist – findet man einfach heraus in dem man in einem Ordner auf Hochladen klickt oder sich bei einem Ordner die Berechtigungen anzeigt –> dann erkennt man nämlich dass der Breadcrumb einerseits die List (ID) und andererseits den RootFolder braucht. ListID haben wir über den Token, aber wie bekommen wir den RootFolder?? Dazu brauchen wir ein wenig Javascript und das möchte ich aus Zeitgründen nicht genauer erläutern, weil sonst wird es fad (aber falls auch immer es wer brauchen kann - Javascript mit RegularExpressions um bei der aktuellen window.location den RootFolder Parameter auszulesen –> hier die komplette URL-Action:
<UrlAction Url="javascript:function getValue() { var results = new RegExp( '[\\?&]RootFolder=([^&#]*)').exec( window.location ); if(results == null) return ''; else return results[1]; } function redirect(){window.location='{SiteUrl}/_layouts/SharxXPermission/ElementPermissions.aspx?List={ListId}&RootFolder='+getValue();}redirect();"/>
So das hätten wir. Leider gibts noch eine kleine Unzulänglichkeit, die mir eigentlich den Schlaf geraubt hat und zwar wollte ich meinen Menüeintrag unter Aktionen –> Berechtigungen anzeigen für alle Teilnehmer zur Verfügung stellen:
SharePoint liefert uns hier auch die Möglichkeit bei der CustomAction das Attribute Rights (http://msdn.microsoft.com/en-us/library/microsoft.sharepoint.spbasepermissions.aspx) zu setzen – was ich auch brav gemacht habe - Rights="AddListItems" leider musste ich nach langem Testen und viel Suchen im Internet erfahren, dass für die Location="Microsoft.SharePoint.StandardMenu" GroupId="Actions" nur die Rechte vom ParentWeb gelten… Tja ich konnte es auch nicht glauben, weil sich ja die Listen-Toolbar aufgrund der Rechte auch verändert – aber einerseits konnte ich das Phänomen auch beobachten und andererseits schreibt das auch ein MSFT von Microsoft - It also seems that the "Rights" of "Microsoft.SharePoint.StandardMenu" belongs to the parent site - http://social.msdn.microsoft.com/Forums/en-US/sharepointdevelopment/thread/12af8d7e-7498-49dd-9e62-f94e2dbc161a
die Lösungsmöglichkeiten von dort sind leider auch nicht wirklich zielführend, also -> :(… aber ich hoffe zumindest, das derjenige, der über das gleiche Phänomen stolpert nicht so lange testet und deployed und wertvolle Schlafenszeit verschenkt, wie ich…