lunes, 4 de junio de 2012

Javascript: Ocultamiento de campos desde un XML como Web Resource

Hola, muchas veces necesitamos que los formularios de CRM cambien dependiendo de diferentes motivos. Para esto CRM 2011 provee la funcionalidad de múltiples formularios por Roles de seguridad, que permite que diferentes usuarios vean los formularios de información diferente según el rol de seguridad que tengan.
Otras veces es necesario que los campos se enseñen u oculten dependiendo de alguna otra condición. Un ejemplo típico que intentaré hoy explicar es como definir que se muestren/oculten determinados campos dependiendo de un valor de un campo (un desplegable por ejemplo para este caso).
Esto no es muy complicado de hacer, e imagino que muchos ya lo habrán hecho. Pero la idea que quiero transmitir hoy, es que esa “lógica” del formulario se defina en un Web Resource en formato XML, de forma que si se quiere reutilizar o modificar este código, puede valor para cualquier otro ejemplo.
La descripción del ejemplo de hoy es la siguiente:
Formulario: Cuenta
Evento: OnLoad() y OnChange()
Atributos: para este ejemplo, el desplegable de Categoría.
Funcionalidad: La idea es que dependiendo del valor de un desplegable, se muestren u oculten determinados campos. Está lógica se define en un Web Resource en formato XML.
Todo este ejemplo estará como siempre disponible en Codeplex:
http://elblogdedynamicscrm.codeplex.com/documentation
El funcionamiento empieza definiendo un XML con la lógica deseada:

    
    
Este XML dice que cuando el campo “name” tenga en valor “value”, se enseñarán y ocultarán unos campos que se definen separados por comas “,” (showattributes y hideattributes).
Luego ese XML se debe crear como un web resource:
image
Por último simplemente nos queda añadir el siguiente “js” en formulario de Cuentas y llamar al método “GestionVisibilidad” desde el load y desde el campo de Categoría:

/*
Ejemplo de XML en el web resource "test_xml":

    
    

*/
var xml_loaded=false;
var xmlPath = "../WebResources/new_test_xml";
var doc = new ActiveXObject("Microsoft.XMLDOM");

function GestionVisibilidad()
{
   if (!xml_loaded)
   {
      doc.preserveWhiteSpace = true;
      doc.async = false;
      doc.load(xmlPath);
      xml_loaded=true;
   }
   var nodelist;
   var nodePath = "//attributes/attribute";
   nodelist = doc.selectNodes(nodePath);
   for (var i = 0; i < nodelist.length; i++) 
   {
      var attributename= nodelist(i).attributes[0].value;
      var attributevalue= nodelist(i).attributes[1].value;
      var showattributes= nodelist(i).attributes[2].value;
      var hideattributes= nodelist(i).attributes[3].value;
      if (attributevalue==""+Xrm.Page.getAttribute(attributename).getValue())
      {
		//realizar las acciones
		var arrshowattributes=showattributes.split(","); 
		var arrhideattributes=hideattributes.split(","); 
		for (j=0;j		{
             if (Xrm.Page.getControl(arrshowattributes[j])) 
				Xrm.Page.getControl(arrshowattributes[j]).setVisible(true);
		}
		for (j=0;j		{
             if (Xrm.Page.getControl(arrhideattributes[j]))   
				Xrm.Page.getControl(arrhideattributes[j]).setVisible(false);
		}
      }
   }
}

Este javascript, básicamente lo que hace es cargar la primera vez un XML almacenado en un WebResource, y luego ejecutar la lógica definida en el mismo.

Creo que es una forma muy cómoda de crear formularios dinámicos, sin necesidad de reprogramar la lógica cada vez que es necesario.

Por último les dejo un par de capturas que podáis verlo en “acción”:

image

image

Espero les haya gustado, un abrazo!

No hay comentarios:

Publicar un comentario