CRM 4.0 - Menüeinträge ausblenden

Bild Tipps & Tricks zu den Dynamics CRM Versionen
Hier bitte keine Fragen stellen, sondern nur bereits vorhandene Tricks veröffentlichen.
Forumsregeln
Impressum • Community-Knigge • Nutzungsbedingungen • Datenschutzrichtlinie
Hier bitte keine Fragen stellen, sondern nur bereits vorhandene Tricks veröffentlichen.

CRM 4.0 - Menüeinträge ausblenden

Beitragvon Michael Sulz » 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
grafik1.png (4.32 KiB) 2591-mal betrachtet

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

Code: Alles auswählen
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
grafik4.png (3.88 KiB) 2591-mal betrachtet

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
grafik5.png (24.56 KiB) 2591-mal betrachtet

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

Code: Alles auswählen
<%@ 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
grafik8.png (23.08 KiB) 2591-mal betrachtet

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.
Gruß, Michael Sulz
Mein Blog
Xing LinkedIn Facebook Twitter

Frage beantwortet? Schreibe bitte [Gelöst] vor den Titel des ersten Beitrags.
Bitte erst suchen, dann fragen. Bitte beachte den kleinen Community-Knigge.
Kein Support per PN, Mail, IM oder Telefon! Dafür ist dieses Forum da.

Wie man Fragen richtig stellt
Benutzeravatar
Michael Sulz
Microsoft Partner
Microsoft Partner
 
Beiträge: 4939
Registriert: 9. September 2009 17:41
Wohnort: Münster
Realer Name: Michael Sulz
Arbeitsort: Münster
Bezug zu Microsoft Dynamics: Microsoft Partner
Microsoft Dynamics Produkt: Microsoft Dynamics CRM

Zurück zu CRM Tipps & Tricks

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 1 Gast