Gemeinsame Nutzung von Visualforce-Seiten in Salesforce Classic und Lightning Experience
Lernziele
- Auflisten von zwei Vorteilen der gemeinsamen Nutzung von Seiten in Salesforce Classic in Lightning Experience
- Beschreiben des Unterschieds zwischen dem vom Benutzer gewünschten Benutzeroberflächenkontext und dem tatsächlichen
- Beschreiben von drei unterschiedlichen Möglichkeiten zum Testen und Ermitteln des aktuell vom Benutzer verwendeten Benutzeroberflächenkontexts
Gemeinsame Nutzung von Visualforce-Seiten in Salesforce Classic und Lightning Experience
Es ist natürlich dennoch vollkommen verständlich, wenn eine geringfügig oder erheblich andere Verhaltensweise oder Gestaltung wünschenswert ist, die vom Kontext der Benutzeroberfläche abhängt, in dem die Seite ausgeführt wird. In dieser Lektion sehen wir uns mehrere Möglichkeiten an, Seiten zu erstellen, die korrekt in allen Benutzeroberflächen funktionieren. Außerdem erfahren Sie, wie Ihr Code Änderungen in bestimmten Kontexten bewirkt und erkennt.
Erkennen und Reagieren auf den Benutzeroberflächenkontext in Visualforce-Markup
- Theme1: Veraltetes Salesforce-Thema
- Theme2: Benutzeroberflächenthema Salesforce Classic 2005
- Theme3: Benutzeroberflächenthema Salesforce Classic 2010
- Theme4d: Salesforce-Thema "Modernes 'Lightning Experience'"
- Theme4t: Thema "Mobile Salesforce-Anwendung"
- Theme4u: Thema "Lightning-Konsole"
- PortalDefault: Thema "Salesforce-Kundenportal"
- Webstore: Thema "Salesforce AppExchange"
<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>
Über die Grundlagen hinaus
Hierbei handelt es sich um eine eher ungewöhnliche Nutzung von <apex:variable>, da wir am Wert, den die Variable erstellt, gar nicht interessiert sind. Wir möchten lediglich eine Komponente, die selbst keine eigene Ausgabe darstellt, um die Komponente <apex:stylesheet> einzukapseln. Stellen Sie sich das am besten vor, als würde die Variable <apex:variable> ihr Attribut "rendered" der Komponente <apex:stylesheet> "leihen".
Zum Glück ist uns die Variable selbst egal, denn durch das Einkapseln eines Elements in die Komponente <apex:variable> wird die Variable überhaupt nicht erstellt! Funktion oder Fehler? Nennen wir es mal... undefiniertes Verhalten und verwenden wir die Variable uiTheme ganz einfach nirgendwo sonst.
Erkennen und Reagieren auf den Benutzeroberflächenkontext in JavaScript
Um zu erkennen, was der Benutzer in JavaScript sieht, verwenden wir eine ähnliche Methode wie beim Ermitteln des aktuellen Benutzeroberflächenkontexts in Visualforce. Rufen Sie die globale Variable UITheme.getUITheme() auf, um einen Wert zurückzugeben, der das aktuelle Benutzeroberflächenthema angibt.
Hier prüft der Code, ob der aktuelle Benutzeroberflächenkontext das Lightning Experience-Thema ist.
function isLightningDesktop() { return UITheme.getUITheme === "Theme4d"; }
Festlegen des Benutzeroberflächenkontexts in 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: Veraltetes Salesforce-Thema
- Theme2: Benutzeroberflächenthema Salesforce Classic 2005
- Theme3: Benutzeroberflächenthema Salesforce Classic 2010
- Theme4d: Salesforce-Thema "Modernes 'Lightning Experience'"
- Theme4t: Thema "Mobile Salesforce-Anwendung"
- Theme4u: Thema "Lightning-Konsole"
- PortalDefault: Thema "Salesforce-Kundenportal"
- Webstore: Thema "Salesforce AppExchange"
Die Nutzung dieser Methoden in serverseitigem Steuerfeldcode ist eher selten. Jedenfalls im Vergleich zur Angabe verschiedener Visualforce-Markup- oder JavaScript-Codes. Eine bewährte Methode lautet, dass Ihr Steuerfeld- und Steuerfelderweiterungs-Code in Bezug auf den UX-Kontext neutral ist. Lassen Sie Ihren Front-End-Code, egal ob Visualforce oder JavaScript, die Unterschiede zwischen den Benutzeroberflächen behandeln.
Abfragen nach Lightning Experience über SOQL- und API-Zugriff
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>
Es wird nicht empfohlen, die Lightning Experience-Voreinstellung des Benutzers direkt abzufragen. Das Ergebnis gibt die derzeit eingestellte Voreinstellung des Benutzers zurück, nicht die tatsächlich angezeigte Benutzeroberfläche. Es gibt mehrere Bedingungen, bei denen der Voreinstellungswert nicht unbedingt mit der tatsächlich verwendeten Benutzeroberfläche übereinstimmt. Verwenden Sie $User.UIThemeDisplayed oder UserInfo.getUiThemeDisplayed(), um die in der aktuellen Anforderung tatsächlich bereitgestellte Benutzeroberfläche zu ermitteln.