CRM 4.0 - Menüeinträge ausblenden

13. Februar 2010 14:22

Vor längerer Zeit hatte ich in einem Projekt die Anforderung, das für eine Entität die Menüpunkte aktivieren/deaktivieren ausgeblendet werden sollen.

Gut, dachte ich mit, kein Problem, eben mit den Entwicklertools des IE die Ids der Menüeinträge heraussuchen und dann im OnLoad des Formulars per JavaScript ausblenden. Das hat auch wunderbar funktioniert bis ich auf die Übersichtsseite der Entität gegangen bin und feststellen musste, das dort die Menüeinträge noch angezeigt werden, und was noch schlimmer ist, ich dort auch kein JavaScript hinterlegen kann ohne eine ASPX-Seite des CRM zu verändern, was wiederum völlig unsupportet ist.

Nach etwas Überlegung und Recherche im Netz bin ich auf eine Lösung gestoßen, die ich euch nicht vorenthalten möchte.
Adi Katz hat in diesem Beitrag erklärt, wie ein Grid zur Laufzeit geändert werden kann. Das gilt natürlich nicht nur für den Inhalt des Grids, so das ich dies mit ein paar kleinen Änderungen auch für das ausblenden der Menüpunkte verwenden konnte.

In diesem Beispiel verwende ich die Entität Demoformular, die zu Beginn noch die Einträge für das aktivieren und deaktivieren des Datensatzes enthält.

grafik1.png

Zuerst der einfache Teil, das Ausblenden der Menüeinträge im Formular der Entität.
Das geht einfach mit diesem Script,

Code:
if (document.all._MIchangeStatedeactivate100035 != null)
{
document.all._MIchangeStatedeactivate100035 .style.display = "none";
}
if (document.all._MIchangeStateactivate100036 != null)
{
document.all._MIchangeStateactivate100036.style.display = "none";
}

wobei ihr die beiden Ids durch die ID des jeweiligen Menüeintrages bei euch ersetzen müsst.
Mit den IE Entwicklertools (F12 im IE8) könnt ihr sehr einfach zu dem Menüpunkt navigieren und die Ids für die Menüeinträge Aktivieren/Deaktivieren herausfinden.

grafik2.png
grafik3.png

Anschließend die Ids in das Script einsetzen, das Script in das OnLoad des Formulares kopieren und die Entität veröffentlichen.

Das Ergebnis sieht dann so aus, die Menüeinträge sind verschwunden.

grafik4.png

Jetzt zu dem Teil, wie die Menüeinträge auch aus der Übersicht entfernt werden können. Dazu sollte man wissen, das jede Seite im CRM über eine URL aufgerufen werden kann, also auch die Übersichtsseite der Entität. Diese URL kann ich in der Sitemap für jeden Eintrag konfigurieren und nach eigenen Wünschen anpassen.
Der Trick besteht jetzt darin, über die Sitemap eine eigene ASPX-Seite aufzurufen, in die ihr das gewünschte JavaScript einbettet und die anschließend wieder die Originale Übersichtsseite des CRM lädt.
Vor der Anpassung sieht die Übersicht so aus:

grafik5.png

Hier ist die ASPX-Seite, die ich in diesem Beispiel verwende:

Code:
<%@ Page Language="C#" %> 
 
<html xmlns="http://www.w3.org/1999/xhtml" > 
<head runat="server"> 
    <title>Untitled Page</title>
   <script language="javascript">
      attachEvent( "onload" , OnPageLoad ); 
      //IFrame ID 
      var contsGrid; 
      //IFrame document object 
      var iframeDoc; 
      //Views picklist   
      var SavedQuerySelector; 
      //The grid object 
      var crmGrid;

      function OnPageLoad() 
      { 
         contsGrid = document.all.contsGrid; 
         var contsUrl  = "/" + top.ORG_UNIQUE_NAME +  + "/_root/homepage.aspx?etc=10003";   
         contsGrid.src = contsUrl; 
         contsGrid.onreadystatechange = OnGridViewReady; 
      }

      function OnGridViewReady() 
      { 
         if( contsGrid.readyState != "complete" )   
            return; 
         
         iframeDoc = contsGrid.contentWindow.document; 
   
         //make sure the selector exists 
         SavedQuerySelector = iframeDoc.all.SavedQuerySelector; 
         if( SavedQuerySelector ) 
            iframeDoc.all.SavedQuerySelector.attachEvent( "onchange" , OnGridReadyChangeLayout ); 
   
         //make sure the grid exists 
         crmGrid = iframeDoc.all.crmGrid; 
         if( crmGrid ) 
         { 
            iframeDoc.all.crmGrid.attachEvent( "onrefresh" , OnGridReadyChangeLayout ); 
            //change the layout for the first time 
            OnGridReadyChangeLayout(); 
         }   
      }

      function OnGridReadyChangeLayout() 
      { 
         if( !crmGrid.InnerGrid )   
            return setTimeout( OnGridReadyChangeLayout , 100 ); 
   
         /* Hier die Funktionen für die Seite einbauen */ 
         // Aktivieren und deaktivieren ausblenden
         
         var mnuDeactivate = document.all.contsGrid.contentWindow.document.all._MIdoActioncrmGrid10003deactivate;
         if (mnuDeactivate)
            mnuDeactivate.style.display = "none";

         var mnuActivate = document.all.contsGrid.contentWindow.document.all._MIdoActioncrmGrid10003activate;
         if (mnuActivate)
            mnuActivate.style.display = "none";
      }
   </script>   
</head> 
<body scroll="no" style="margin:0px"> 
   <iframe id="contsGrid"   
      src="about:blank"   
      style="width:100%;height:100%"   
      frameborder="0"   
      scrolling="no"> 
   </iframe> 
</body> 
</html>

In der ASPX-Seite müsst ihr den Typecode der Entität, hier 10003, durch den Typecode eurer Entität ersetzen.
var contsUrl = "/" + top.ORG_UNIQUE_NAME + "/_root/homepage.aspx?etc=10003";

In der Funktion function OnGridReadyChangeLayout() könnt ihr dann den gewünschten Code hinterlegen, in diesem Beispiel der Code zum Ausblenden der Menüeinträge.
Dazu müssen natürlich erst einmal wieder die entsprechenden IDs über die IE Entwicklertools ermittelt werden.

grafik7.png

Die fertige Seite habe ich im ISV-Ordner des CRM im Verzeichnis GridView unter dem Namen Demo.aspx gespeichert.
Damit die neue Seite auch genutzt wird, muss die Sitemap entsprechend angepasst werden. Dazu die Sitemap exportieren und mit einem Editor eurer Wahl öffnen.
Sucht darin nach dem Eintrag für die Entität und ändert ihn so ab, das die eigene ASPX-Seite geladen wird.

grafik6.png

Änderung speichern und wieder ins CRM importieren und voila, wenn ihr jetzt die Übersichtsseite eurer Entität aufruft, sind die unerwünschten Einträge verschwunden.

grafik8.png

Ob es sich bei dem in diesem Artikel genannten Vorgehen um eine supportete oder unsupportete Methode handelt, kann man sicherlich lange diskutieren. Es werden keine ASPX-Seiten des CRMs und auch keine unsupporteten Eingriffe ins System vorgenommen, trotzdem wird es grenzwertig sein.

Selbstverständlich geschieht die Nutzung der oben genannten Funktionen und Vorgehensweise auf eigene Gefahr und unter Ausschluss geglichen Gewährleitung.
Du hast keine ausreichende Berechtigung, um die Dateianhänge dieses Beitrags anzusehen.