Results for tag "deaktivieren"

CRM 2011 – Ribbons via Javascript deaktivieren (disable Ribbons with javascript)

Jeder CRM Developer wird wohl schon vor folgendem Problem gestanden sein: Einen Ribbon Button deaktivieren, weil dieser im aktuellen Kontext keinen Sinn macht. Andere Buttons verwirren den Kunden, wiederrum andere sollen überhaupt verschwinden.

In einem meiner Projekte hatten wir nun die Situation, dass wir in einem bestimmten Prozess-Stati alle Ribbon Buttons von ca. 15-20 Entitäten sperren sollten. Inklusive der Original-Ribbon-Buttons (Datei, Entität, Hinzufügen, Listentools, etc.). Microsoft stellt dafür keinen vernünftigen Weg zur Verfügung, schlägt nur die Customizations.xml vor, was für ca. 400 Buttons ein enormer Zeitaufwand wäre, abgesehen von der extremen fehleranfälligkeit.

Ich habe daher, trotz aller Warnungn von div. CRM-Spezialisten („dieser Weg wird von MS nicht supportet“, etc.), einen Weg mittels Javascript gefunden, mittels welchem sich die Ribbon Buttons deaktivieren oder ganz ausblenden lassen, seht selbst:

[sourcecode language=“javascript“]

function HideRibbonButtons () {

var dateiButton = parent.document.getElementById("jewelcontainer"); // versteckt den "Datei"-Ribbon. Diesen zu deaktivieren habe ich nicht getestet!
dateiButton.style.display = ’none‘;

var ribbon = parent.document.getElementById("Mscrm.Ribbon");
var container = ribbon.childNodes[2].childNodes[0]; // container = Ein Tab, oberhalb der dargestellten Ribbons.

for (var i = 0; i < container.childNodes.length; i++) {
var group = container.childNodes[i];

if (group.id.indexOf(‚Isv‘) > 0) { // selbst hinzugefügte tabs enthalten bei mir den Hinsweis "Isv" und werden explizit ausgenommen.
// do nothing…
}
else {
DisableAllChilds(group);
}
}
}

// iteriert über alle child elements, bis das element mit der Rolle "button" gefunden wurde.
// An dieser Stelle kann dann die Deactivate oder Hide Funktionalität aufgerufen werden
function DisableAllChilds(element) {

for (var i = 0; i < element.childNodes.length; i++) {
var subElement = element.childNodes[i];

if (subElement.childNodes.length > 0)
DisableAllChilds(subElement);
}

if (element.role == "button") {

DeactivateRibbonButton(element);

}

}

// nachdem sich ein button nicht so ohne weiteres deaktivieren lässt (der dahinterliegende Event lässt sich nicht ausschalten),
// habe ich das element einfach geklont und das original-Element durch das erzeugte Element ersetzt.
function DeactivateRibbonButton(element) {
var link = document.createElement("a");
link.role = "button";
link.className = "ms-cui-ctl-large ms-cui-disabled";

try {
link.appendChild(element.childNodes[0]); // image/buttion
link.appendChild(element.childNodes[0]); // label
}
catch (exception) {
// do nothing…
}

element.parentNode.replaceChild(link, element);
}

// einen Button ausblenden ist hingegen recht easy und sollte keine negativen Auswirkungen haben.
function HideRibbonButton(element) {
element.style.display = ’none‘;
}

[/sourcecode]

Wichtig ist es noch zu wissen, dass das CRM nur den ersten Tab voll lädt, bedeutet, die Ribbons für alle weiteren Tabs werden erst bei erstmaligem Aufruf nachgeladen. Daher ist es notwendig, die Funktion „HideRibbonButtons()“ mehrmals aufzurufen, ich mache dieses mittels einem „setInterval“. Einen eleganteren Weg habe ich leider nicht finden können.

Abschließend nochmals explizit der Hinweis: Dies ist ein von Microsoft nicht unterstützter Weg! Bitte überlegt euch daher gut, ob ihr diesen gehen wollt!

Viel Spaß beim Nachmachen!