Partage des pages Visualforce entre Classic et Lightning Experience
Objectifs de formation
- Mentionner deux avantages du partage de pages entre Salesforce Classic et Lightning Experience.
- Expliquer la différence entre le contexte d'interface utilisateur demandé par l'utilisateur et celui dans lequel l'utilisateur se trouve réellement.
- Décrire trois méthodes différentes pour tester et identifier le contexte d'interface utilisateur actuel de l'utilisateur.
Partage de pages Visualforce entre Classic et Lightning Experience
Il est néanmoins tout à fait raisonnable de souhaiter un affichage ou un fonctionnement légèrement ou très différent selon le contexte de l'expérience utilisateur dans lequel la page est exécutée. Dans cette unité, nous allons examiner plusieurs méthodes pour créer des pages qui fonctionnent correctement dans toutes les expériences utilisateur, et comment votre code peut détecter et apporter des modifications dans des contextes spécifiques.
Détecter le contexte d’expérience utilisateur dans le marquage Visualforce et y répondre
- Theme1 : thème Salesforce obsolète
- Theme2 : thème d’interface utilisateur Salesforce Classic 2005
- Theme3 : thème d’interface utilisateur Salesforce Classic 2010
- Theme4d : thème moderne Salesforce « Lightning Experience »
- Theme4t : thème de l’application mobile Salesforce
- Theme4u : thème de Lightning Console
- PortalDefault : thème du portail client Salesforce
- Webstore : thème AppExchange Salesforce
<apex:outputText value="This is Salesforce Classic." rendered="{! $User.UIThemeDisplayed() == 'Theme3' }"/>
<apex:outputPanel rendered="{! $User.UIThemeDisplayed == 'Theme3' }"> <apex:outputText value="This is Salesforce Classic."/> <apex:outputText value="These are multiple components wrapped by an outputPanel."/> </apex:outputPanel> <apex:outputPanel rendered="{! $User.UIThemeDisplayed == 'Theme4d' }"> <apex:outputText value="Everything is simpler in Lightning Experience."/> </apex:outputPanel>
<apex:page standardController="Account"> <!-- Salesforce Classic "Aloha" theme --> <apex:variable var="uiTheme" value="classic2010Theme" rendered="{!$User.UIThemeDisplayed == 'Theme3'}"> <apex:stylesheet value="{!URLFOR($Resource.AppStyles, 'classic-styling.css')}" /> </apex:variable> <!-- Lightning Desktop theme --> <apex:variable var="uiTheme" value="lightningDesktop" rendered="{!$User.UIThemeDisplayed == 'Theme4d'}"> <apex:stylesheet value="{!URLFOR($Resource.AppStyles, 'lightning-styling.css')}" /> </apex:variable> <!-- Salesforce mobile theme --> <apex:variable var="uiTheme" value="SalesforceApp" rendered="{!$User.UIThemeDisplayed == 'Theme4t'}"> <apex:stylesheet value="{!URLFOR($Resource.AppStyles, 'mobile-styling.css')}" /> </apex:variable> <!-- Rest of your page --> <p> Value of $User.UIThemeDisplayed: {! $User.UIThemeDisplayed } </p> </apex:page>
Au-delà des concepts de base
Il s’agit d’une façon inhabituelle d’utiliser <apex:variable>, car la valeur de la variable créée n’est pas réellement intéressante. Nous voulons simplement un composant qui ne renvoie pas de sortie tout seul dans le but d’inclure le composant <apex:stylesheet>. C’est comme si le composant <apex:variable> « prêtait » son attribut rendered au composant <apex:stylesheet> inclus.
C’est une chance que la variable en elle-même ne nous importe pas, car une autre particularité de l’enveloppement du composant <apex:variable> autour d’un autre élément est que la variable n’est pas véritablement créée ! Fonctionnalité ou bogue ? Disons que c’est un comportement indéfini, et évitons d’utiliser la variable uiTheme ailleurs.
Détecter le contexte d'expérience utilisateur dans JavaScript et y répondre
Pour détecter ce que voit l’utilisateur en JavaScript, nous utilisons une méthode similaire à celle employée pour déterminer le contexte d'expérience de l’utilisateur actuel dans Visualforce. Appelez la variable globale UITheme.getUITheme() pour retourner une valeur qui identifie le thème d’interface de l’utilisateur actif.
Ici, le code vérifie si le contexte d’expérience de l’utilisateur actuel est le thème Lightning Experience.
function isLightningDesktop() { return UITheme.getUITheme === "Theme4d"; }
Définition du contexte d'expérience utilisateur dans Apex
public with sharing class ForceUIExtension { // Empty constructor, required for Visualforce controller extension public ForceUIExtension(ApexPages.StandardController controller) { } // Simple accessors for the System.UserInfo theme methods public String getContextUserUiTheme() { return UserInfo.getUiTheme(); } public String getContextUserUiThemeDisplayed() { return UserInfo.getUiThemeDisplayed(); } }
- Theme1 : thème Salesforce obsolète
- Theme2 : thème d’interface utilisateur Salesforce Classic 2005
- Theme3 : thème d’interface utilisateur Salesforce Classic 2010
- Theme4d : thème moderne Salesforce « Lightning Experience »
- Theme4t : thème de l’application mobile Salesforce
- Theme4u : thème de Lightning Console
- PortalDefault : thème du portail client Salesforce
- Webstore : thème AppExchange Salesforce
L’utilisation de ces méthodes dans le code du contrôleur côté serveur doit être limitée, du moins par comparaison avec la fourniture d’un marquage Visualforce ou d’un code JavaScript différent. Il est recommandé que le code de votre contrôleur et de votre extension de contrôleur soit neutre en matière de contexte d'expérience utilisateur. Laissez votre code frontal, qu’il s’agisse de Visualforce ou de JavaScript, gérer les différences d’interface utilisateur.
Effectuer des requêtes pour Lightning Experience grâce à SOQL et à des accès à l'API
SELECT UserPreferencesLightningExperiencePreferred FROM User WHERE Id = 'CurrentUserId'
<apex:page> <script src="/soap/ajax/36.0/connection.js" type="text/javascript"></script> <script type="text/javascript"> // Query for the preference value sforce.connection.sessionId = '{! $Api.Session_ID }'; var uiPrefQuery = "SELECT Id, UserPreferencesLightningExperiencePreferred " + "FROM User WHERE Id = '{! $User.Id }'"; var userThemePreferenceResult = sforce.connection.query(uiPrefQuery); // Display the returned result on the page document.addEventListener('DOMContentLoaded', function(event){ document.getElementById('userThemePreferenceResult').innerHTML = userThemePreferenceResult; }); </script> <h1>userThemePreferenceResult (JSON)</h1> <pre><span id="userThemePreferenceResult"/></pre> </apex:page>
Effectuer une requête directement pour la préférence de l'utilisateur concernant Lightning Experience est déconseillé. Le résultat indique les paramètres de préférence actuels de l'utilisateur, mais pas l'expérience utilisateur affichée sur l'écran. Il existe plusieurs cas d'utilisation où la valeur de préférence pourrait ne pas refléter l'expérience utilisateur en cours. Pour déterminer l’expérience utilisateur réelle en cours dans la demande actuelle, utilisez $User.UIThemeDisplayed ou UserInfo.getUiThemeDisplayed().