Compartilhar páginas do Visualforce entre os ambientes Classic e Lightning Experience
Objetivos de aprendizagem
- Citar dois benefícios do compartilhamento de páginas entre o Salesforce Classic e o Lightning Experience.
- Descrever a diferença entre o contexto de interface de usuário solicitado pelo usuário e o contexto de interface de usuário em que o usuário realmente está.
- Descrever três maneiras diferentes de testar e determinar o contexto de interface de usuário do usuário atual.
Como compartilhar páginas do Visualforce entre os ambientes Classic e Lightning Experience
No entanto, é perfeitamente razoável querer um comportamento ligeira ou significativamente diferente ou um estilo que seja baseado no contexto da experiência de usuário em que a página é executada. Nesta unidade, veremos diversas formas de criar páginas que funcionem corretamente em todas as experiências de usuário e como seu código pode detectar e fazer alterações para contextos específicos.
Detectar o contexto da experiência de usuário na marcação Visualforce e responder ao mesmo
- Theme1 – Tema obsoleto do Salesforce
- Theme2 – Tema da interface de usuário do Salesforce Classic 2005
- Theme3 – Tema da interface de usuário do Salesforce Classic 2010
- Theme4d – Tema do Salesforce “Lightning Experience” moderno
- Theme4t – Tema do aplicativo móvel Salesforce
- Theme4u – Tema de console do Lightning
- PortalDefault – Tema do Portal de clientes do Salesforce
- Webstore – Tema do 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>
Ir além das noções básicas
Esta é uma maneira incomum de usar <apex:variable>, pois, na verdade, não estamos interessados no valor da variável criada. O que queremos é apenas um componente que não renderize nenhuma saída própria para encapsular o componente <apex:stylesheet>. Você pode pensar nisso como um “empréstimo” de <apex:variable>, de seu atributo rendered, ao componente <apex:stylesheet> encapsulado.
O fato de não estarmos interessados na própria variável é uma boa coisa, pois outro aspecto incomum de se usar o componente <apex:variable> para encapsular outra coisa é que a variável não é criada de fato! Recurso ou bug? Vamos chamá-lo apenas de... comportamento indefinido e evitar usar a variável uiTheme em outros lugares.
Detectando o contexto da experiência de usuário no JavaScript e respondendo ao mesmo
Para detectar o que o usuário vê no JavaScript, usamos um método similar para determinar o contexto da experiência do usuário atual no Visualforce. Chame a variável global UITheme.getUITheme() para retornar um valor que identifique o tema da interface do usuário atual.
Aqui o código verifica se o contexto da experiência do usuário atual é o tema do Lightning Experience.
function isLightningDesktop() { return UITheme.getUITheme === "Theme4d"; }
Determinando o contexto da experiência de usuário no 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 – Tema obsoleto do Salesforce
- Theme2 – Tema da interface de usuário do Salesforce Classic 2005
- Theme3 – Tema da interface de usuário do Salesforce Classic 2010
- Theme4d – Tema do Salesforce “Lightning Experience” moderno
- Theme4t – Tema do aplicativo móvel Salesforce
- Theme4u – Tema de console do Lightning
- PortalDefault – Tema do Portal de clientes do Salesforce
- Webstore – Tema do Salesforce AppExchange
Usar estes métodos no código do controlador do lado do servidor deve ser raro, pelo menos em comparação a fornecer uma marcação Visualforce ou código JavaScript diferente. Recomenda-se que o código do seu controlador e extensão do controlador seja neutro em termos de contexto UX. Deixe que seu código front-end, quer no Visualforce quer no JavaScript, lide com as diferenças de interface de usuário.
Consultando no Lightning Experience via SOQL e API Access
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>
Não recomendamos consultar a preferência de Lightning Experience do usuário de forma direta. O resultado diz qual é a configuração preferida atual do usuário, e não qual experiência de usuário realmente está em sua tela. Há vários casos de uso em que o valor de preferência pode não refletir a experiência de usuário que realmente está sendo fornecida. Para determinar a experiência de usuário real que é fornecida na solicitação atual, utilize $User.UIThemeDisplayed ou UserInfo.getUiThemeDisplayed().