La idea sigue siendo la misma que planteé aquella vez, pero con mas opciones.
El resumen de la funcionalidad propuesta hoy es el 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 realicen acciones en el formulario, como ocultar campos, secciones, o tabs y cambiar el nivel de requerimiento de 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
Para estas nuevas funcionalidades, he tenido que hacer el XML de configuración, algo mas completo:
Básicamente, los atributos del xml quedaría definido así:
- name: nombre del campo que definirá el “disparo” de las acciones
- value: valor del campo que definirá el disparo de las acciones
- showattributes/hideattributes: define los campos a mostrar/ocultar, separados por comas (,).
- showsections/hidesections: para introducir las secciones a ocultar/mostrar. para esto se debe añadir con el formato “nombre_tab/nombre_sección” además de poder añadir varias secciones separadas por comas (,).
- showtabs/hidetabs: para añadir nombres de tabs o pestañas a ocultar/mostrar
- setrequiredlevel: para modificar el nivel de requerimiento de uno o varios campos, separados por comas (,). El formato es el siguiente: “required|recommended|none:campo1-campo2-campo3”
Bien, una vez definido y explicado el tema del xml con las acciones que queremos disparar, veamos como nos queda el código javascript, algo mas largo, pero lo he ordenado algo mejor:
/*
DynamicForm method.
*/
function DynamicForm()
{
LoadXmlWebResource("new_test_xml");
var nodePath = "//attributes/attribute";
var nodelist = doc.selectNodes(nodePath);
for (var i = 0; i < nodelist.length; i++)
{
var attributes=nodelist(i).attributes;
var attributename= attributes.getNamedItem("name").nodeValue;
var attributevalue= attributes.getNamedItem("value").nodeValue;
var showattributes= attributes.getNamedItem("showattributes").nodeValue;
var hideattributes= attributes.getNamedItem("hideattributes").nodeValue;
var showsections= attributes.getNamedItem("showsections").nodeValue;
var hidesections= attributes.getNamedItem("hidesections").nodeValue;
var showtabs= attributes.getNamedItem("showtabs").nodeValue;
var hidetabs= attributes.getNamedItem("hidetabs").nodeValue;
var setrequiredlevel=attributes.getNamedItem("setrequiredlevel").nodeValue;
if (attributevalue==""+getValue(attributename))
{
/*Mostrar campos*/
var arrshowattributes=showattributes.split(",");
for (j=0;j<arrshowattributes.length;j++)
{
showhideAttribute(arrshowattributes[j],true);
}
/*Ocultar campo*/
var arrhideattributes=hideattributes.split(",");
for (j=0;j<arrhideattributes.length;j++)
{
showhideAttribute(arrhideattributes[j],false);
}
/*Mostrar secciones*/
var arrshowsections=showsections.split(",");
for (j=0;j<arrshowsections.length;j++)
{
var tab_section=arrshowsections[j].split("/");
var tabname=tab_section[0];
var sectionname=tab_section[1];
showhideSection(tabname, sectionname,true);
}
/*Ocultar secciones*/
var arrhidesections=hidesections.split(",");
for (j=0;j<arrhidesections.length;j++)
{
var tab_section=arrhidesections[j].split("/");
var tabname=tab_section[0];
var sectionname=tab_section[1];
showhideSection(tabname, sectionname,false);
}
/*Mostrar tabs*/
var arrshowtabs=showtabs.split(",");
for (j=0;j<arrshowtabs.length;j++)
{
showhideTab(arrshowtabs[j],true);
}
/*Ocultar tabs */
var arrhidetabs=hidetabs.split(",");
for (j=0;j<arrhidetabs.length;j++)
{
showhideTab(arrhidetabs[j],false);
}
/*Requiredlevel de los atributos*/
var arrsetrequiredlevel=setrequiredlevel.split(",");
for (j=0;j<arrsetrequiredlevel.length;j++)
{
/*required:fax-address1_city,recommended:address1_name*/
var req_level=arrsetrequiredlevel[j].split(":");
var slevel=req_level[0];
var attrs_req=req_level[1].split("-");
for (v=0;v<attrs_req.length;v++)
{
setRequiredLevel(attrs_req[v],slevel);
}
}
}
}
}
La idea de esta parte del código, es simplemente leer e interpretar el XML y disparar las acciones que hay definidas en el mismo.
Todas las funciones genéricas las he definido aparte:
/*
Métodos comunes de Dynamics CRM 2011 Forms.
*/
function getValue(attributename)
{
if (Xrm.Page.getAttribute(attributename))
return Xrm.Page.getAttribute(attributename).getValue();
else
return null;
}
function showhideAttribute(attributename,show)
{
if (Xrm.Page.getControl(attributename))
Xrm.Page.getControl(attributename).setVisible(show);
}
function showhideSection(tabname, sectionname, show) {
var tab = Xrm.Page.ui.tabs.get(tabname);
if (tab != null && sectionname != null) {
var section = tab.sections.get(sectionname);
if (section != null) { section.setVisible(show); }
}
}
function showhideTab(tabname,show)
{
if (Xrm.Page.ui.tabs.get(tabname))
Xrm.Page.ui.tabs.get(tabname).setVisible(show);
}
function setRequiredLevel(attributename,req_level)
{
if (Xrm.Page.getAttribute(attributename))
Xrm.Page.getAttribute(attributename).setRequiredLevel(req_level);
}
var xml_loaded=false;
var xmlPath = "../WebResources/";
var doc = new ActiveXObject("Microsoft.XMLDOM");
function LoadXmlWebResource(WebResource_name)
{
if (!xml_loaded)
{
doc.preserveWhiteSpace = true;
doc.async = false;
doc.load(xmlPath+WebResource_name);
xml_loaded=true;
}
}
El listado de métodos definidos el es siguiente:
- getValuegetValue(attributename): recoger el valor de un campo
- showhideAttribute(attributename,show): ocultar/mostrar campos
- showhideSection(tabname, sectionname, show): ocultar/mostrar secciones
- showhideTab(tabname,show) : ocultar/mostrar tabs (o pestañas)
- setRequiredLevel(attributename,req_level): para cambiar campos a nivel requerido, recomendado u opcional.
- LoadXmlWebResource(WebResource_name): para cargar un XML desde un WebResource


Suscribirse al RSS
No hay comentarios:
Publicar un comentario