Dienstag, 20. November 2012

SharePoint: Listen eindeutig per JavaScript über die ListUrl identifizieren

Hallo Leute,

da ich mich aktuell in meinem SharePoint-Projekt mit einem Problem herumschlagen musste, welches dem Einen oder Anderem auch begegnet sein wird, wollte ich euch meine Lösung nicht vorenthalten.

Ich musste einen CustomRibbon-Button aktivieren/deaktivieren, jenachdem welche Liste auf einer Website aktiviert ist. Dabei können auf einer Website mehrere Listen per XsltListViewWebpart vorhanden sein. Dabei darf der Button aber nur für spezielle Listen aktiviert werden, für andere wiederrum nicht. Eine Lösung bleibt hier nur über JavaScript, wenn man keine Postbacks möchte. Wichtig ist hierbei, dass man mit der Lösung Listen unabhängig von ihrem DisplayName identifizieren kann.

Dazu muss man seinem SharePoint-Projekt als erstes ein leeres Element hinzufügen:



























Danach definiert man in der Elements.xml eine CustomAction, dabei ist zu beachten, dass man den RegistrationType auf ContentType setzt, und die RegistrationId auf 0x01. Damit registriert man den Button für alle Typen.










Danach kommt die Definition der CustomAction (seht ihr gleich). Da wir JavaScript benötigen, müssen wir als nächstes den Layouts-Ordner hinzufügen (bei mir ausgegraut, da ich diesen schon dem Projekt hinzugefügt hatte):













Danach legen wir in diesem Ordner eine .js-File mit unserer Logik an.






Nun müssen wir, damit die entsprechende File auch geladen wird, noch eine weitere CustomAction am Ende unserer Elements.xml anlegen:









Ok, damit sind alle Vorbereitungen getroffen...wichtig für das Aktivieren/Deaktivieren des Buttons ist die Eigenschaft: EnabledScript im UIHandler der CustomAction. Diese Eigenschaft setzen wir durch die Logik in unserer JS-Datei, hier die Zuweisung:







Okay, nun sollten wir uns die Methode: moreThanOneEnabled() anschauen, denn der Rückgabewert dieser Methode bestimmt, ob der Button aktiviert oder deaktiviert ist. Diese Methode muss in unser JS-File (die wichtigsten Stellen sind kommentiert):



























In dieser Methode holen wir uns zuerst die Guid der selektierten Liste. Danach schauen wir, ob wir eine andere Liste gewählt haben (die aktuelle Guid speichern wir in der globalen Variablen listId, welche ausserhalb definiert wurde). Wenn wir eine neue haben, dann holen wir uns den Context, und laden asynchron die DefaultViewUrl. Wenn diese Methode erfolgreich ausgeführt wurde, rufen wir onSuccessMethod auf (zeige ich euch gleich). In dieser Methode holen wir uns dann die URL. Weiterhin setzen wir result auf NULL, damit bei einer neuen Liste der Button erstmal wieder deaktiviert wird, solang wir nicht wissen, ob es eine Liste ist, welche wir benötigen.
Danach schauen wir, ob die globale Variable result gesetzt wurde (diese wird in der onSuccessMethode gesetzt, wenn wir eine Liste gefunden haben, für welche wir den Button einblenden wollen, oder wenn eine neue Liste gewählt wurde). Wenn result null ist, geben wir false zurück. Sollte result NICHT null sein, prüfen wir, ob in der aktuellen Liste auch Elemente gewählt wurden, und geben TRUE zurück, wenn result TRUE ist, und Elemente gewählt wurden. Sonst geben wir FALSE zurück.

Schauen wir uns nun die onSuccessMethode an, in der wir die Bedingungen festlegen, ob wir eine Liste haben, für die wir den Button aktivieren wollen oder nicht. In meinem Beispiel wird der Button für eine Liste, welche intern "MeineListe" heisst, aktiviert, für alle anderen deaktiviert. Dabei ist es egal, wie die Liste über die UI benannt wurde. Weiterhin sind man in diesem Code auch die benötigten globalen Variablen:
















In dieser Methode holen wir uns als erstes die DefaultViewUrl, diese wurde durch context.Load(list, 'DefaultViewUrl') in moreThanOneEnabled() geladen. Danach untersuchen wir die URL nach dem Namen der Liste, mit der sie angelegt wurde (denn dieser ändert sich nie, egal wie die Liste danach benannt wird). Dann kommen unsere Bedingungen, in denen wir dann result entsprechend setzen. True damit der Button aktiviert ist, false zum deaktiviren.
Als letztes rufen wir RefreshComnmandUI() auf, dies führt dazu, dass moreThanOneEnabled() ein weiteres aufgerufen wird, und somit die entsprechenden result-Werte an EnabledScript zugewiesen werden.

Ich hoffe ich konnte euch damit ungefähr zeigen, wie man mit dem JS-ClientObjectModel arbeiten kann und Listen eindeutig identifiziert. Bis zum nächsten mal ;)

mfg
Sebastian

Keine Kommentare:

Kommentar veröffentlichen