Suivez votre progression
Accueil Trailhead
Accueil Trailhead

Gestion de la navigation

Objectifs de formation

Une fois cette unité terminée, vous pourrez :
  • Décrire les trois mécanismes « classiques » de Visualforce pour contrôler la navigation d’une page à l’autre.
  • Décrire, parmi ces techniques, celles qui ne fonctionnent pas dans Lightning Experience.
  • Mentionner au moins trois événements de navigation de Lightning Experience et comment les envoyer.

Gestion de la navigation

Le flux et la navigation constituent à plusieurs titres le cœur du développement de l'application. Visualforce offre de nombreuses possibilités d’ajouter des éléments de navigation et de guider un flux d’application. Lightning Experience ajoute ses propres mécanismes, éléments de navigation et flux d'application pour agir là où vont les utilisateurs au cours de leur utilisation de Salesforce.

La bonne nouvelle est que votre navigation Visualforce « classique » fonctionne toujours. La meilleure nouvelle est que vos pages Visualforce peuvent aussi profiter des nouveaux mécanismes de Lightning Experience.

Avant d’aborder les détails de la navigation de Visualforce et son développement afin qu’elle fonctionne dans Salesforce Classic et Lightning Experience, parlons de la navigation en général. Qu'entend-on exactement par « navigation »?

La première chose à laquelle on peut penser en parlant de navigation, ce sont les éléments de l'interface utilisateur affichés à l'écran. Vous cliquez sur un élément et quelque chose se produit. Par exemple, vous cliquez sur l'élément Compte dans le menu de navigation et vous arrivez sur la page d'accueil de l'objet Comptes. Vous cliquez sur le bouton Nouveau et un formulaire de saisie d'enregistrement apparaît. Vous choisissez une action personnalisée dans un menu d'actions rapides et un processus personnalisé démarre. et ainsi de suite. Ces boutons et éléments de menu sont des éléments de navigation.

L’apparence du système de navigation, c’est-à-dire l’interface utilisateur de Lightning Experience, est très différente de ce que proposait Salesforce Classic. Nous ne nous y attarderons pas ici, mais vous souhaiterez probablement vous familiariser avec ce qui a changé lorsque vous basculerez entre ces deux expériences utilisateur. Vous pourrez en savoir plus à ce sujet dans Trailhead, dans l'unité Navigation dans Lightning Experience et configuration.

Il existe une autre sorte de navigation, moins visible : il s'agit de la partie « il se passe quelque chose ». En arrière-plan, Salesforce décide de ce qu'il va se passer lorsque vous sélectionnez un élément dans un menu ou quand vous cliquez sur un lien ou un bouton. La plupart des éléments de navigation sont déjà intégrés à Salesforce alors que d’autres aspects sont personnalisables, comme le remplacement d’actions avec des pages Visualforce. Toutefois, l'intégralité de la navigation est gérée par du code rédigé par Salesforce.

Il y a ensuite la navigation dans vos applications : ces dernières utilisent votre code pour contrôler le flux de l'application. Lorsque votre action personnalisée ouvre un formulaire et que l'utilisateur clique sur Enregistrer, où allez-vous ? Lorsque votre code actuel décide de l'endroit où l'utilisateur doit aller par la suite et qu'il l'y envoie. Nous allons parler de tout ceci dans cette unité.

Navigation Visualforce classique

La navigation Visualforce « classique » peut être résumée par « ce qui se produit à la fin de la méthode d’une action ». Les méthodes d’action renvoient un objet PageReference avec les détails de navigation de l’utilisateur. L’infrastructure Visualforce gère alors les détails de renvoi de la bonne réponse au navigateur de l’utilisateur. La bonne nouvelle est que tout ceci fonctionne toujours.

Souvenez-vous également que le contrôleur standard renvoie un objet PageReference à partir de ses méthodes d’action. Ainsi, votre navigation actuelle, que vous utilisiez le contrôleur standard ou un code de contrôleur personnalisé, continue à fonctionner normalement.

Navigation Visualforce moderne

Bon, si la navigation Visualforce classique fonctionne, pourquoi parlons-nous de cela ? De quoi parlons-nous d'ailleurs ? Nous avons un mot à vous dire. Juste un mot. Vous écoutez bien ? … « JavaScript. »

JavaScript est promis à un grand avenir, et c'est maintenant. De nombreux développeurs de Visualforce utilisent beaucoup JavaScript dans leurs applications et la tendance est à la hausse. Visualforce classique fonctionne et continuera à fonctionner pour longtemps. Mais, à mesure que les développeurs adoptent des fonctionnalités de Visualforce, telles que les objets distants et JavaScript Remoting, le comportement de nombreuses applications migre du côté serveur, où l’objet PageReference constitue la règle, vers le navigateur et vers JavaScript, où il n’existe rien de comparable à PageReference.

Dans l'univers Lightning Experience (et l’application Salesforce), des règles et des outils permettent d'élaborer une navigation en JavaScript. Nous reviendrons dans un instant sur ces règles qui concernent essentiellement ce qu'il ne faut pas faire. Mais parlons tout d'abord de la bonne manière de faire les choses.

Lightning Experience gère la navigation grâce à des événements. Le système des événements de navigation est disponible en tant qu'objet utilitaire JavaScript, qui offre de nombreuses fonctions qui simplifient la création d'une navigation par programmation. L’objet sforce.one est automatiquement ajouté aux pages Visualforce lorsqu’elles sont exécutées dans Lightning Experience. Cet objet offre de nombreuses fonctions qui déclenchent les événements de navigation lorsque ces fonctions sont appelées. Pour les utiliser, vous pouvez les appeler directement depuis le code JavaScript de votre page ou lier les appels en tant que gestionnaires de clics (ou autres) à des éléments de la page.

Important :

Important :

L’objet sforce.one n’est pas disponible dans Salesforce Classic. Tout code utilisant cet objet doit tout d’abord tester l’existence de sforce.one.

L’objet sforce.one offre les fonctions suivantes. Référencer la fonction en utilisant la notation pointée à partir de l’objet sforce.one. Par exemple : sforce.one.navigateToSObject(...).
Fonction Description
back([refresh]) Accède au dernier état enregistré dans l’historique de sforce.one. Cela équivaut à cliquer sur le bouton Précédent dans un navigateur.
navigateToSObject(recordId,​[view]) Accède à un enregistrement sObject spécifié par recordId.
navigateToURL(url,​[isredirect]) Accède à l'URL spécifiée.
navigateToFeed(subjectId, type) Accède au fil du type spécifié selon l’objet subjectId.
navigateToFeedItemDetail(feedItemId) Accède à l'élément du fil spécifique, feedItemId, ainsi qu'à tout commentaire associé.
navigateToRelatedList(relatedListId, parentRecordId) Accède à une liste associée pour parentRecordId.
navigateToList(listViewId, listViewName, scope) Accède à la vue de liste spécifiée par listViewId, qui correspond à l'ID de la vue de liste à afficher.
createRecord(entityName,​[recordTypeId]) Ouvre la page de création d'un enregistrement pour le nom entityApiName spécifié, par exemple « Account » ou « MyObject__c ».
editRecord(recordId) Ouvre la page de modification de l’enregistrement spécifié par recordId.

Pour en savoir plus sur l’utilisation de ces fonctions et sur les paramètres qu’elles acceptent, consultez Navigation et Messagerie avec l’objet sforce.one dans les ressources de cette unité.

La première règle de la navigation Visualforce dans JavaScript est : ne définissez pas directement window.location. La seconde règle de la navigation Visualforce dans JavaScript est : ne définissez pas directement window.location.

Ne définissez pas directement window.location

OK, à part ces répétitions et la référence cinématographique, de quoi parle-t-on ? C'est assez simple. Dans Lightning Experience, votre page n’a pas de window.location à définir ! Souvenez-vous de nos précédentes discussions sur le « conteneur » Visualforce, situé dans un iframe et où Lightning Experience est une sorte de club de sport. (SPA, application web monopage.) C'est l'une des choses qui en découlent. L’iframe Visualforce n’a pas d’accès direct à la valeur window.location, vous ne pouvez donc pas la définir. Si votre code dépend de cette définition, il rencontrera un problème. En effet, les actions qui déclenchent la navigation en définissant window.location s’arrêteront simplement de naviguer, où que vous souhaitiez accéder.

Il existe bien un moyen de contourner cette restriction, mais nous vous conseillons de ne pas l'utiliser. En effet, si vous évitez les fonctions de navigation dans sforce.one, vos événements de navigation ne seront pas enregistrés dans la pile de navigation de Lightning Experience. Cette dernière offre des fonctionnalités utiles comme des boutons Précédent qui prennent en compte les redirections et outils similaires. De nombreuses fonctionnalités de Lightning Experience (notamment dans l’application Salesforce) dépendent de cette pile contenant tous les événements de navigation. Il vaut donc la peine de vous assurer que vous l'utilisez correctement.

Le problème Salesforce Classic

Oui, il y a donc cette petite… chose. Malheureusement, l’objet utilitaire sforce.one n’est pas disponible lorsque vos pages sont exécutées dans Salesforce Classic. Dans ce cas de figure, vous devez utiliser window.location. Bonne nouvelle, dans Salesforce Classic, window.location est disponible. Mauvaise nouvelle, cette limite signifie que vous devrez ajouter un triste bloc if à votre code. Pensez à placer vos fonctions de navigation dans des méthodes utilitaires qui traitent cette complexité afin que votre logique de navigation principale puisse être simple.

URL statiques

N'utilisez pas d'URL statiques pour des ressources Salesforce. Autrement dit, si vous devez ajouter un lien pour modifier un enregistrement de contact, ne le créez pas en construisant une chaîne avec un modèle statique comme link = ’/’ + accountId + ’/e’. Cela fonctionnera dans certains contextes, mais pas dans d'autres. Essayez plutôt l'une de ces approches :
  • Dans le balisage Visualforce, utilisez {!URLFOR($Action.Contact.Edit, recordId)}
  • Dans JavaScript, utilisez navigateToSObject(recordId)
Il s'agit d'actions et de fonctions pour visualiser, créer, modifier, etc. Utilisez-les plutôt que des chaînes d'URL.