Home

Activar / Desactivar botones del Ribbon según user role in CRM 2011

webmaster's picture

Teniendo personalizada la vista de nuestra entidad new_gastos, con los nuevos botones que aprueban los gastos y pagan los mismos, es necesario habilitarlos solo para ciertos roles de usuarios para que desde la misma vista de los gastos puedan actuar sobre los botones. Al principio creiamos que con solo habilitar en la zona de </DisplayRule> <EnableRules> </EnableRules> </DisplayRules> era suficiente, pero al parecer después de consultar varios blogs sobre el tema la solución pasa por la combinación de una definición en esa zona del ribbon, de una llamada a un webresource que contenga una function que nos devuelva el role del usuario conectado y con ello habilitar el que se displayen o habiliten los correspondientes botones.

Empezamos por la personalización de los botones del Ribbon, en lo que respecta a las propiedades de <EnableRules> </EnableRules> para poder apuntar a la libreria js donde tenemos definida la función que detectará si el usuario conectado tiene el role que queremos sea el autorizado a operar con estos botones. En nuestro caso será el "Administrador del sistema". Para ello vamos a utilizar una herramienta gráfica que utilizamos habitualmente para los diseños y personalización del Ribbon "Visual Ribbon Editor".


Pulse en la imagen para ampliar

Esto hará que en la Zona de RuleDefinitions tengamos las definiciones para cada botón en la que se hace mención a la librería new_DatabaseTools,js dentro de ella a la function UserHasRole

<RuleDefinitions>
    <TabDisplayRules />
    <DisplayRules />
    <EnableRules>
      <EnableRule Id="Mscrm.HomepageGrid.new_gastos.MainTab.Aprobaciones.aprobar.Command.EnableRule.CustomRule">
        <CustomRule Library="$webresource:new_DatabaseTools.js" FunctionName="UserHasRole" />
      </EnableRule>
      <EnableRule Id="Mscrm.HomepageGrid.new_gastos.MainTab.Aprobaciones.pagos.Command.EnableRule.CustomRule">
        <CustomRule Library="$webresource:new_DatabaseTools.js" FunctionName="UserHasRole" />
      </EnableRule>
    </EnableRules>
  </RuleDefinitions>

El botón "Save" del Visual Ribbon Editor guardará los cambios en la Riboon de la Entidad que hemos cargado y pubicará los cambios para que sean efectivo de inmediato en el CRM 2011

El siguiente paso es definir dentro de la librería new_DatabaseTools la función UserHasRole que verificará un role en concreto de usuario y devolverá el valor true a la propiedad Enabled del botón lo que hará que se active el botón en la barra. El código de esta función la habia desarrollado un MVP de Microsoft Dynamics CRM Rajeev Pentyala – Microsoft Dynamics CRM Certified Professional en su blog Dynamics CRM Blog por lo que nosotros solo la hemos adaptado a nuestro esquema.

function UserHasRole() {
    var roleName = "Administrador del sistema"  // Aqui definimos el role para no pasarlo como parámetros desde fuera
    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;
                //Get Current User Roles
                var currentUserRoles = Xrm.Page.context.getUserRoles();
                //Check whether current user roles has the role passed as argument
                for (var i = 0; i < currentUserRoles.length;i++) {
                    var userRole = currentUserRoles[i];
                    if (GuidsAreEqual(userRole, id)) {
                        return true;
                    }
                }
            }
        }
        return false;
    }
 
function GetRequestObject() {
    if (window.XMLHttpRequest) 
    {
            return new window.XMLHttpRequest;
    }
    else
    {
        try
        {
             return new ActiveXObject("MSXML2.XMLHTTP.3.0");
        }
            catch (ex) {return null;}
     }
}
 
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;
 }
// #endregion

A diferencia de la original, nosotros hemos incluido el nombre del rol a buscar dentro de la var roleName, pero podriamos parametrizar la funcion agregando ese valor como parámetro de la misma y definirla asi:

function UserHarRole(roleName){...}

En ese caso deberiamos agregar dentro de la definición del botón dentro de la etiqueta <CustomRule></CustomRule> una etiqueta llamada StringParameter  con el valor del nombre del rol que queremos pasarle a la funcion de esta forma:

<CustomRule Library="$webresource:new_DatabaseTools.js" FunctionName="UserHasRole" >
           <StringParameter Value="Administrador del sistema" />
</CustomRule>

Mas abajo una muestra del funcionamiento de la entidad "Gastos" con diferentes usuarios:

Nota; Para que funcionen las llamada a las funciones del Odata Service es necesario tener adjunto a la entidad como webresource las librerias jQuery,js y Json2.js que se pueden descargar desde Codeplex. 

Fuente: 

Centro Práctico de LEMURSOLUTION & Rajeev Pentyala – Dynamics CRM Blog

Contacto: 
webmaster