Wednesday, May 9, 2012

Comment gérer l'activation et/ou l'affichage d'un bouton sur le Ribbon CRM 2011 en fonction du rôle de sécurité

Bonjour,


En tant qu'expert technique Dynamics CRM, je tombe souvent sur cette problématique. Donc, j'ai décidé de publier ce post en se mettant dans un contexte réel. 


Objectif :

Mon client veut que toute personne ayant le rôle "Commercial TLV" ne doit pas pouvoir fermer une opportunité comme perdu. En d'autres terme, il doit pas avoir le droit de cliquer sur ce bouton au niveau de l'opportunité:


P.S : Avant de avoir recours à cette méthode, il faut s'assurer qu'il y'a que cette méthode pour y arriver. car pour certaines cas, par exemple, tel que fusionner des contacts. au lieu d'utiliser cette méthode pour cacher ce bouton : 


il suffit de sélectionner le rôle concerné, appuyer sur l'onglet "Gestion d'entreprise", de regarder au niveau des "Privilèges divers" et désactiver le privilège "Fusionner".


Comment Faire :



1ère étape : Enregistrer le script çi-après au niveau des ressources web de votre solution sous un nom que vous choisissez, par exemple : new_ManagingRole.js



 // Retourne True si l'utilisateur possède le rôle introduit en paramètre sinon il retourne False
function UserHasRole(roleName) {
 
    var serverUrl = Xrm.Page.context.getServerUrl();
    var oDataEndpointUrl = serverUrl + "/XRMServices/2011/OrganizationData.svc/";
    oDataEndpointUrl += "RoleSet?$top=1&$filter=Name eq '" + roleName + "'";
    var service = GetRequestObject();
    if (service != null) {
        service.open("GET", oDataEndpointUrl, false);
        service.setRequestHeader("X-Requested-Width", "XMLHttpRequest");
        service.setRequestHeader("Accept", "application/json, text/javascript, */*");
        service.send(null);
        var requestResults = eval('(' + service.responseText + ')').d;
        if (requestResults != null && requestResults.results.length == 1) {
            var role = requestResults.results[0]; 
            var id = role.RoleId;
            var currentUserRoles = Xrm.Page.context.getUserRoles();
            for (var i = 0; i < currentUserRoles.length; i++) {
                var userRole = currentUserRoles[i];
                if (GuidsAreEqual(userRole, id)) {
                    return true;
                }
            }
        }
    }
 
    return false;
}
 
// retourne l'objet XMLHttpRequest
function GetRequestObject() {
    if (window.XMLHttpRequest) {
        return new window.XMLHttpRequest;
    }
    else {
        try {
            return new ActiveXObject("MSXML2.XMLHTTP.3.0");
        }
        catch (ex) {
            return null;
        }
    }
}

// Compare 2 GUID values
function GuidsAreEqual(guid1, guid2) {
    var isEqual = false;
    if (guid1 == null || guid2 == null) {
        isEqual = false;
    }
    else {
        isEqual = guid1.replace(/[{}]/g, "").toLowerCase() == guid2.replace(/[{}]/g, "").toLowerCase();
    }
 
    return isEqual;
}

// la méthode d'entrée.
function callMain() {
 
if(UserHasRole("Commercial TLV"))
{
return false;
}
else 
{
return true;
}
 
}

2ième étape : Installer un outil de gestion de Ribbon tel que Ribbon Workbench .


3ième étape : Créer la nouvelle solution ManagingRoles, ajouter l'entité opportunité.



et il ne faut pas inclure les composants reliées à l'opportunité.





4ième étape : 
Ouvrir l'outil Ribbon Workbench (RW) à partir du ribbon de CRM sur le HomePage des Solutions. via le bouton Personnaliser.




Au niveau de l'écran de RW, sélectionner la solution ManagingRoles.






L'outil charge les Ribbons des entités de la solution sélectionnée.


Maintenant, selon notre choix, soit on veut que le bouton sera caché totalement, soit on veut juste le désactiver.


On dispose de ces deux type de règles :







  • Les Display Rules
  • Les Enable Rules
Supposant, qu'on veut juste le désactiver. Alors, il suffit d'ajouter une nouvelle règle en cliquant sur Enable Rules.



Renommer la règle comme suit : new.opportunity.CustomcheckRole

Appuyer sur Steps et choisir Custom Javascript Rule.


Puis au niveau du champ Library il faut choisir le la ressource web new_ManagingRole.js. Et au niveau du champ FunctionName, définir CallMainPuis appuyer sur OK


5ième étape : 

Un détail très important, en général, et comme pour ce cas là, le bouton "Fermer comme perdu" existe sur le HomePage et sur le Formulaire. Donc cette opération devrait être appliquée sur les deux modes HomePage et Form.




Pour ceci, il faut déja choisir l'un des deux mode. Pour le faire c'est facile. Au niveau du coin droit en haut de l'écran de RW sous le nom de la solution, il faut choisir l'un des deux. Par défaut c'est HomePage qui est choisi. En choisissant le mode, RW recharge instantanément les boutons de ce mode.


Je vais choisir le mode Form en premier.




Ensuite, il faut sélectionner le bouton en question. cliquer droit sur ce bouton via le souris, un menu contextuel apparaît. Il faut choisir le menuItem Customise Command.






La commande associée au bouton apparaît au niveau de la liste des commandes.






Sélectionner cette commande. Et au niveau de champ EnableRules






Ajouter la règle : new.opportunity.CustomcheckRole en tant que la première sur la liste.

Cette étape est à refaire pour le mode HomePage.


Dernière étape : Appuyer sur Publish Solution pour pouvoir publier toute ces modifications.



Bonne lecture.

N.JL

No comments:

Post a Comment