Este código Javascript que expongo sirve para obtener el rol del usuario que está navegando por el CRM.
Una vez tenemos el rol, con la funcion UserHasRole compruebo si es igual que un rol a mi elección y según si lo es o no bloqueo un campo del formulario o lo dejo habilitado para escribir en él.
Edito los permisos de un campo según el rol:
if (UserHasRole("<nombredelrol>"))
{
// Permito la escritura en el campo
document.crmForm.all.<nombrecampo>.Disabled=false;
}
else
{
// Pongo sólo lectura el campo que quiero
document.crmForm.all.<nombrecampo>.Disabled=true;
}
Compruebo si el rol es el mismo que le paso a la función:
function UserHasRole(roleName)
{
//oXml es un objeto que llama a obtener el rol
var oXml = GetCurrentUserRoles();
if(oXml != null)
{
//Selecciono el nodo Texto
var roles = oXml.selectNodes("//BusinessEntity/q1:name");
if(roles != null)
{
for( i = 0; i < roles.length; i++)
{
if(roles[i].text == roleName)
{
//Devuelve true si el rol es el indicado
return true;
}
}
}
}
//Sino devuelve falso
return false;
}
Obtengo el rol del usuario que entra en el CRM:
function GetCurrentUserRoles()
{
// Compongo el xml
var xml = "" +
"<?xml version=\"1.0\" encoding=\"utf-8\"?>" +
"<soap:Envelope xmlns:soap=\"http://schemas.xmlsoap.org/soap/envelope/\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\">" +
GenerateAuthenticationHeader() +
" <soap:Body>" +
" <RetrieveMultiple xmlns=\"http://schemas.microsoft.com/crm/2007/WebServices\">" +
" <query xmlns:q1=\"http://schemas.microsoft.com/crm/2006/Query\" xsi:type=\"q1:QueryExpression\">" +
" <q1:EntityName>role</q1:EntityName>" +
" <q1:ColumnSet xsi:type=\"q1:ColumnSet\">" +
" <q1:Attributes>" +
" <q1:Attribute>name</q1:Attribute>" +
" </q1:Attributes>" +
" </q1:ColumnSet>" +
" <q1:Distinct>false</q1:Distinct>" +
" <q1:LinkEntities>" +
" <q1:LinkEntity>" +
" <q1:LinkFromAttributeName>roleid</q1:LinkFromAttributeName>" +
" <q1:LinkFromEntityName>role</q1:LinkFromEntityName>" +
" <q1:LinkToEntityName>systemuserroles</q1:LinkToEntityName>" +
" <q1:LinkToAttributeName>roleid</q1:LinkToAttributeName>" +
" <q1:JoinOperator>Inner</q1:JoinOperator>" +
" <q1:LinkEntities>" +
" <q1:LinkEntity>" +
" <q1:LinkFromAttributeName>systemuserid</q1:LinkFromAttributeName>" +
" <q1:LinkFromEntityName>systemuserroles</q1:LinkFromEntityName>" +
" <q1:LinkToEntityName>systemuser</q1:LinkToEntityName>" +
" <q1:LinkToAttributeName>systemuserid</q1:LinkToAttributeName>" +
" <q1:JoinOperator>Inner</q1:JoinOperator>" +
" <q1:LinkCriteria>" +
" <q1:FilterOperator>And</q1:FilterOperator>" +
" <q1:Conditions>" +
" <q1:Condition>" +
" <q1:AttributeName>systemuserid</q1:AttributeName>" +
" <q1:Operator>EqualUserId</q1:Operator>" +
" </q1:Condition>" +
" </q1:Conditions>" +
" </q1:LinkCriteria>" +
" </q1:LinkEntity>" +
" </q1:LinkEntities>" +
" </q1:LinkEntity>" +
" </q1:LinkEntities>" +
" </query>" +
" </RetrieveMultiple>" +
" </soap:Body>" +
"</soap:Envelope>" +
"";
var xmlHttpRequest = new ActiveXObject("Msxml2.XMLHTTP");
xmlHttpRequest.Open("POST", "/mscrmservices/2007/CrmService.asmx", false);
xmlHttpRequest.setRequestHeader("SOAPAction"," http://schemas.microsoft.com/crm/2007/WebServices/RetrieveMultiple");
xmlHttpRequest.setRequestHeader("Content-Type", "text/xml; charset=utf-8");
xmlHttpRequest.setRequestHeader("Content-Length", xml.length);
xmlHttpRequest.send(xml);
var resultXml = xmlHttpRequest.responseXML;
return(resultXml);
}
5 comentarios:
2 de septiembre de 2008, 17:15
hola... tngo una consulta... cuando deshabilito un campo q es modificado por JScript, ese cambio no se almacena en la BD... tienes alguna solución????. Gracias
8 de septiembre de 2008, 12:09
Hola, ¿Qué tipo de campo modificas por JScript? ¿Modificas antes o lo deshabilitas antes? Si puedes copiarme el código te podría servir de más ayuda.
Un saludo.
28 de julio de 2009, 22:18
Hola este codigo lo pongo en onload todo?? y que campos del codigo hay que cambiarle por que me genera error...
gracias.
28 de julio de 2009, 22:19
Hola este codigo lo pongo en onload todo?? y que campos del codigo hay que cambiarle por que me genera error...
gracias.
10 de febrero de 2010, 16:52
Hola,
Acabo de implementar el codigo y funciona correctamente así que gracias por este gran ejemplo!
Sabes si es posible, para no tener que ir desactivando campos segun los roles, crear formularios?? por lo poco que se solo me deja crear vistas y ademas no me deja ni relacionar una vista con un determinado rol! muy raro no? CRM OnDemand de Siebel permite crear formularios y asociarlos a los roles que quieras...
Un saludo!
Publicar un comentario