web-dev-qa-db-fra.com

Comment obtenir formContext dans la commande du ruban de Dynamics 365 9.0

Dans Dynamics 365 9.0, il y avait un changement assez important concernant la façon d'accéder aux attributs et aux contrôles de formulaire: au lieu d'utiliser l'espace de noms Xrm.Page, nous devrions passer executionContext à une fonction et obtenir formContext à l'aide de la fonction getFormContext(). Cela fonctionne bien et je n’ai jamais eu de problème avec cette approche.

Cependant, je ne savais pas encore comment accéder correctement à formContext dans les fonctions appelées à partir du ruban. La documentation indique que cela devrait être très simple:

_ { https://docs.Microsoft.com/en-us/dynamics365/commerce-engagement/developer/customize-dev/pass-dynamics-365-data-page-parameter-ribbon-actions }

function myFunction(executionContext) {
    var formContext = executionContext.getFormContext();
    var focusFieldValue = formContext.ui.controls.get(PrimaryControlId).getAttribute().getValue();
}

Mais il ne dit pas comment passer executionContext à la fonction du ruban. Dans les fonctions normales, une case à cocher "définit le contexte d'exécution en tant que premier paramètre", mais qu'en est-il des fonctions du ruban? Il y a des paramètres que nous pouvons passer dans ces fonctions, mais ce sont simplement GUID des enregistrements sélectionnés, ou le type d'enregistrement sélectionné ou même une liste d'objets, mais je ne pouvais pas trouver dans la documentation, s'il existe un paramètre égal à executionContext. Quelqu'un a-t-il déjà résolu ce problème?

Je sais aussi que je peux utiliser Xrm.Page et que cela fonctionnera (pour le moment au moins ...), mais j'aimerais savoir comment cela peut être fait en utilisant les dernières directives de la version 9.0.

Mise à jour 1:

Conformément à la suggestion de Scott et à la { cet article }, j’ai passé PrimaryControl à ma commande Ribbon, mais malheureusement, l’argument est de type Mscrm.FormControlLite et n’a pas de fonction getAttribute ni d’autre fonction permettant d’accéder au formulaire ne vois rien d’utile). Quelques captures d'écran des outils de développement: enter image description here

Cela ressemble donc à une forme de représentation, mais n’est probablement pas lié à formContext (je suppose que si un ruban est appelé à partir d’une liste d’enregistrements, cet élément peut être de type grille ou quelque chose comme ça)

10
Pawel Gradecki

Selon https://docs.Microsoft.com/en-us/dynamics365/get-started/whats-new/customer-engagement/important-changes-coming#some-client-apis-are-deprecated vous le transmettez comme paramètre PrimaryControl.

enter image description here

Donc, si vous passez le PrimaryControl comme second paramètre à une fonction de commande comme celle-ci, vous pouvez utiliser

arguments[1].getAttribute(…)
9
Scott Durow

J'avais le même problème aussi. Ce que j’ai découvert c’est qu’il y avait une erreur dans Microsoft doco. Veuillez suivre ce que Scott a mentionné en passant le paramètre CRM à partir de l'action de commande du ruban . En fonction javascript, veuillez essayer ci-dessous pour obtenir le contexte du formulaire.

var formContext = primaryControl.getFormContext();

cela a résolu mon problème.

1
GK Patibandla

Après avoir passé le primaryControl comme suggéré par @ scott-durow, il est préférable de ne pas utiliser primaryControl.getFormContext () mais d'utiliser le primaryControl comme s'il s'agissait du formContext.

Selon la documentation (1/2/2019): https://docs.Microsoft.com/en-us/dynamics365/customer-engagement/developer/customize-dev/pass-dynamics-365-data-page- parameter-ribbon-actions # form-and-grid-context-in-ribbon-actions , vous devez effectuer des opérations sur le primaryControl comme s'il s'agissait du formContext.

function mySampleFunction(primaryControl) {
    var formContext = primaryControl;
    // Perform operations using the formContext object
}

Cependant, l’essentiel de l’exemple fourni est le suivant: // Effectuer des opérations en utilisant l’objet formContext étant la clé (aucune idée de la raison pour laquelle ils ont ajouté la ligne var formContext = primaryControl, imo, il aurait été plus clair si à la place, je viens de montrer un exemple: primaryControl.getAttribute ('xxxx');

Je soupçonne que le code primaryControl.getFormContext () a commencé à être utilisé car c’est ainsi que vous obtenez le formContext lorsque vous utilisez des formulaires ( https://docs.Microsoft.com/en-us/dynamics365/customer-engagement/developer/clientapi/clientapi -form-context # utilisant-the-formcontext-object-lieu-de-the-xrmpage-object ).

Le problème lié à l’utilisation de primaryControl.getFormContext () est qu’il fonctionne avec l’interface Web normale, mais rompt avec l’UCI. Mais si vous utilisez primaryControl comme s'il s'agissait du contexte de formulaire, cela fonctionne à la fois pour le client Web hérité et les interfaces uci.

Voici une fonction que j'utilise:

function getFormContext(executionContext) {
     var formContext = null;
     if (executionContext !== null) {
         if (typeof executionContext.getAttribute === 'function') {
             formContext = executionContext; //most likely called from the ribbon.
         } else if (typeof executionContext.getFormContext === 'function' 
                 && typeof(executionContext.getFormContext()).getAttribute === 'function') {
            formContext = executionContext.getFormContext(); // most likely called from the form via a handler
         } else {
            throw 'formContext was not found'; //you could do formContext = Xrm.Page; if you like.
        }
    }
    return formContext;
}
0
Raj Rao

Il existe un petit truc que vous pouvez faire pour ne pas avoir à passer le contrôle principal en tant que paramètre Crm avec l'utilitaire RibbonWorkbench, ou si cela avait été fait, cela ne fonctionnerait pas, car cela pourrait arriver si vous essayiez cela dans une maison. ruban-grille.

var context=Xrm.Utility.getGlobalContext();

J'espère que cela fonctionne pour vous ou pour quelqu'un d'autre.

0
Manuel Roldan