Bienvenue à Blogs CodeS-SourceS Identification | Inscription | Aide

Alternative au volet de navigation dans un formulaire Dynamics CRM 4.0 pour afficher un élément associé directement sur le formulaire

Problématique

Dans CRM tout est rangé dans des tiroirs, et ça ne plait pas toujours. En effet, dans un formulaire, tous les éléments associés à l’enregistrement en cours sont accessibles par le volet de navigation situé sur le côté gauche.
Par exemple, imaginons qu’un contact possède des biens qu’on veut pouvoir enregistrer dans Dynamics CRM. Il suffit pour cela de créer une entité personnalisé, que l’on appellerait Bien et d’associer celle-ci à l’entité Contact par une relation de type N-1. Le résultat est que tous les biens d’un contact sont accessibles par le menu Biens dans le volet gauche du formulaire de l’entité Contact.

image

Il faut donc au moins un clic pour accéder à la liste des biens du contact. Une fois la liste des biens affichée, l’utilisateur n’a plus évidemment de visibilité sur les informations générales du Contact (son adresse, son téléphone etc…)

image

Comment faire pour que l’utilisateur puisse avoir en un coup d’œil, à la fois la liste des biens du contact, à la fois les informations générales de celui-ci ?

Alternative

Une alternative à la présentation par défaut proposée par Dynamics CRM consiste à utiliser les iFrame pour afficher la liste d’un élément associé directement sur le formulaire. Cela permet de revenir à une approche plus “portail” où tous les éléments sont visibles dans une seule et même page.
Par exemple, pour voir d’un seul coup d’œil, les informations d’un contact et la liste de ses biens, vous pouvez remplacer le nœud dans le volet de navigation à gauche par une iFrame positionnée sur n’importe quel onglet du formulaire :

image

Le code

Pour ramener une liste d’éléments dans une iframe sur un formulaire, voici la procédure à suivre :

  • Utilisez les outils de développement de IE 8, ou si vous avez une version antérieure de IE, munissez vous d’une extension permettant de visualiser le modèle d’objets en mémoire d’une page html tel que l’Internet Explorer Developer Toolbar.
  • Pour faire apparaître la barre de menu lorsque vous visualisez un enregistrement contact, appuyez par exemple la combinaison de touches CTRL-N.

image

  • Une fois la barre de menu de IE visible, vous pouvez sélectionnez votre extension ou les outils de développement de IE 8 pour afficher le modèle d’objets en mémoire de la page en cours.
  • Retrouvez dans la hiérarchie des nœuds celui de l’entité associée qui vous intéresse. Par exemple, le nœud Biens correspond à la SubArea d’id nav_new_contact_new_bien ou new_contact_new_bien est le nom de la relation entre l’entité contact et l’entité new_bien.

image

  • Notez qu’il y a une procédure nommé loadArea sur l’évènement onclick de l’élément HTML.

image

C’est cette procédure justement qui affiche la liste dans le volet de droite lorsque l’utilisateur clique sur le nœud. Le code de cette procédure est situé dans le fichier Details.js que vous trouverez sous la structure de répertoire du site web CRM dans …\_static\_common\scripts :

image

Si vous éditez le source de la page HTML du formulaire, vous verrez qu’en effet ce fichier de script est chargé dans la page par une balise script :

image

En analysant la procédure loadArea, on constate que la page qui affiche la vue associée de l’élément enfant est une page nommée areas.aspx.

imageimage

En analysant complètement cette procédure, on peut donc retrouver l’url de la page qui s’affiche dans le volet droit du formulaire lorsque l’utilisateur clique sur le nœud dans le volet de navigation de gauche. C’est cette url qu’il suffit donc de reproduire dans une iFrame dessinée sur le formulaire pour basculer le nœud du volet de navigation directement sur le formulaire. Elle est du type :

areas.aspx?oId=<</span>Id de l'objet>&oType='objet>&security=<</span>info de securité>&tabSet=<</span>Nom du noeud>;
  • Créez maintenant une iFrame dans le formulaire de l’entité parent à l’emplacement souhaité. Elle doit avoir les caractéristiques suivantes :

image image

  • Ajoutez le script suivant dans le code de l’évènement onLoad du formulaire :

ATTENTION : n’oubliez pas de remplacer le nom IFRAME_Biens de l’iFrame dans cet exemple par le nom de votre iFrame à vous ! Remplacez également le nom de la SubArea (ici new_contact_new_bien) par celui de votre nœud à vous (que vous retrouvez en paramètre de l’appel à la fonction loadArea en réponse à l’évènement onclick sur l’élément HTML vu dans l’extension de IE)

var CRMFORMTYPE_CREATE =1;
var CRMFORMTYPE_UPDATE = 2;
var CRMFORMTYPE_READONLY = 3;
var CRMFORMTYPE_DISABLED = 4;
var CRMFORMTYPE_BULKEDIT = 6;
var CRMFORMTYPE_QUICKCREATE =5 ;

crmForm.all.IFRAME_Biens.src = GetFrameSource('new_contact_new_bien');
 function GetFrameSource(tabSet)
 {
  var oId = crmForm.ObjectId;
  var oType = crmForm.ObjectTypeCode;
  var security = crmFormSubmit.crmFormSubmitSecurity.value;
  var uri ="";
  
  if (crmForm.ObjectId != null) 
 {
   var oId = crmForm.ObjectId;
   var oType = crmForm.ObjectTypeCode;
   var security = crmFormSubmit.crmFormSubmitSecurity.value;
   var url = "areas.aspx?oId=" + oId + "&oType=" + oType + "&security=" + security + "&tabSet=" + tabSet;
   uri = url;
  }
  else 
  {
   uri = "about:blank";
  }
  switch (crmForm.FormType)
  {  
   case CRMFORMTYPE_UPDATE:  
   case CRMFORMTYPE_READONLY:
   case CRMFORMTYPE_DISABLED:
    return uri;  
   break;
   case CRMFORMTYPE_BULKEDIT:
   case CRMFORMTYPE_QUICKCREATE:
   case CRMFORMTYPE_CREATE:
    return "about:blank";
   break;
   default:
   break;
  }
}

Le switch à la fin de la procédure permet d’envisager tous les modes possible d’un formulaire Dynamics CRM. Par exemple, lorsque l’utilisateur créé un nouveau contact, la liste doit apparaître vide. C’est seulement une fois le contact sauvegardé qu’il est alors possible de lui associer des biens.

  • Sauvegardez les changements, n’oubliez pas de cocher l’activation de l’évènement onLoad et publiez l’entité.
  • Pour faire disparaître le nœud de l’élément associé dans le volet gauche de navigation du formulaire, il suffit de sélectionner Ne pas afficher dans la liste des option d’affichage dans l’écran de définition de la relation 1-N entre les deux entités.

    image

Et voilà ! Votre liste est opérationnelle dans le formulaire !

Cas particulier d’un élément associé par une relation N-N native

Attention au cas des relations N-N native pour laquelle il y a une petite subtilité. Par exemple, un contact peut être membre de plusieurs clubs de sport (où club de sport serait défini en tant qu’entité personnalisée), ceux-ci ayant également plusieurs contacts membres. Une simple relation N-N native suffit donc à la mise en place d’une telle relation entre les entités contact et new_clubdesport. Sauf que, dans ce cas, l’affichage de la liste des clubs fait intervenir un paramètre supplémentaire appelé roleOrd.

En effet, vous savez qu’en base de données, toute relation N-N entre deux tables nécessitent la mise en place d’une table intermédiaire rapatriant la clé de chacune des tables impliquées dans la relation. Cette table existe bel et bien dans CRM lorsque vous tirez une relation N-N native entre deux entités, mais elle n’est pas visible et se comporte comme une table intrinsèque.

Cela veut dire que lorsqu’un utilisateur clique sur le nœud Clubs de sport dans le volet gauche d’un formulaire Contact, en théorie, c’est une liste des éléments de cette table intermédiaire qui devrait apparaître dans le volet droit. Or, Dynamics CRM fait bien les choses puisqu’il affiche directement la liste des clubs de sport dont le contact est membre.

Si on scrute le modèle objets de la page HTML en mémoire, on s’aperçoit que la fonction loadArea récupère un second paramètre :

image

Notez au passage que le nom de la SubArea (dans l’exemple areanew_new_clubdesport_contact) est toujours celui de la relation, mais préfixé par le mot area.

Le second paramètre est \x26roleOrd\x3d2. Que signifie-t-il ? 
\x est le caractère d’échappement utilisé en javascript pour exprimer le code hexadecimal qui suit. 26 est le caractère “&” et 3d est le signe “=”. Cela donne donc la chaîne &roleOrd=2. roleOrd est donc en fait un Nième paramètre de l’url de la page areas.aspx qui constitue la source de l’iFrame de notre formulaire. En fait, si on se positionne sur l’entité Contact, par ce paramètre on indique qu’on veut voir le niveau 2 de la relation avec la table Club, c’est-à-dire la liste des clubs. Le niveau 1 représenterait la liste des éléments de la table intrinsèque…

  • Jetez un œil dans le fichier Details.js. Vous constatez que le second paramètre passé à la fonction loadArea (appelé sParams) est concaténé à l’url à la suite des autres paramètres (oId, oType, security et tabSet) :

image

  • Modifiez donc la fonction GetFrameSource dans le code de réponse à l’évènement onLoad du formulaire de l’entité parente pour inclure ce nouveau paramètre. Cela donne :

var CRMFORMTYPE_CREATE =1;
var CRMFORMTYPE_UPDATE = 2;
var CRMFORMTYPE_READONLY = 3;
var CRMFORMTYPE_DISABLED = 4;
var CRMFORMTYPE_BULKEDIT = 6;
var CRMFORMTYPE_QUICKCREATE =5 ;

crmForm.all.IFRAME_Biens.src = GetFrameSource('new_contact_new_bien');
//A ajouter : le second paramètre que vous pouvez récupérer dans le modèle objet de la page HTML
crmForm.all.IFRAME_Clubs.src = GetFrameSource('areanew_new_clubdesport_contact','\x26roleOrd\x3d2');
 //A ajouter : le paramètre roleOrd dans la fonction
 function GetFrameSource(tabSet, roleOrd)
 {
  var oId = crmForm.ObjectId;
  var oType = crmForm.ObjectTypeCode;
  var security = crmFormSubmit.crmFormSubmitSecurity.value;
  var uri ="";
  
  if (crmForm.ObjectId != null) 
 {
   var oId = crmForm.ObjectId;
   var oType = crmForm.ObjectTypeCode;
   var security = crmFormSubmit.crmFormSubmitSecurity.value;
   var url = "areas.aspx?oId=" + oId + "&oType=" + oType + "&security=" + security + "&tabSet=" + tabSet;
   //A ajouter : traitement du paramètre optionnel roleOrd
   var roleOrdParamMissing = (typeof(roleOrd) == "undefined") || (roleOrd == null);
   if (!roleOrdParamMissing) {
       //Si le paramètre est présent, concaténez le à la suite de l'url
       url += roleOrd;
   }
   uri = url;
  }
  else 
  {
   uri = "about:blank";
  }
  switch (crmForm.FormType)
  {  
   case CRMFORMTYPE_UPDATE:  
   case CRMFORMTYPE_READONLY:
   case CRMFORMTYPE_DISABLED:
    return uri;  
   break;
   case CRMFORMTYPE_BULKEDIT:
   case CRMFORMTYPE_QUICKCREATE:
   case CRMFORMTYPE_CREATE:
    return "about:blank";
   break;
   default:
   break;
  }
}

et à l’exécution :

image

Ce post vous a plu ? Ajoutez le dans vos favoris pour ne pas perdre de temps à le retrouver le jour où vous en aurez besoin :
Posted: mardi 15 décembre 2009 13:51 par bianca
Classé sous :

Commentaires

Pas de commentaires

Les commentaires anonymes sont désactivés

Les 10 derniers blogs postés

- Merci par Blog de Jérémy Jeanson le 10-01-2019, 20:47

- Office 365: Script PowerShell pour auditer l’usage des Office Groups de votre tenant par Blog Technique de Romelard Fabrice le 04-26-2019, 11:02

- Office 365: Script PowerShell pour auditer l’usage de Microsoft Teams de votre tenant par Blog Technique de Romelard Fabrice le 04-26-2019, 10:39

- Office 365: Script PowerShell pour auditer l’usage de OneDrive for Business de votre tenant par Blog Technique de Romelard Fabrice le 04-25-2019, 15:13

- Office 365: Script PowerShell pour auditer l’usage de SharePoint Online de votre tenant par Blog Technique de Romelard Fabrice le 02-27-2019, 13:39

- Office 365: Script PowerShell pour auditer l’usage d’Exchange Online de votre tenant par Blog Technique de Romelard Fabrice le 02-25-2019, 15:07

- Office 365: Script PowerShell pour auditer le contenu de son Office 365 Stream Portal par Blog Technique de Romelard Fabrice le 02-21-2019, 17:56

- Office 365: Script PowerShell pour auditer le contenu de son Office 365 Video Portal par Blog Technique de Romelard Fabrice le 02-18-2019, 18:56

- Office 365: Script PowerShell pour extraire les Audit Log basés sur des filtres fournis par Blog Technique de Romelard Fabrice le 01-28-2019, 16:13

- SharePoint Online: Script PowerShell pour désactiver l’Option IRM des sites SPO non autorisés par Blog Technique de Romelard Fabrice le 12-14-2018, 13:01