Classic と Lightning Experience 間での Visualforce ページの共有
学習の目的
Classic と Lightning Experience 間の Visualforce ページの共有
とはいえ、ページを実行しているユーザーエクスペリエンスコンテキストに応じて動作やスタイル設定をわずかに、あるいは大幅に変えたいと思う状況も当然ながら存在します。この単元では、すべてのユーザーエクスペリエンスで正しく機能するページを作成するさまざまな方法と、コードで特定のコンテキストを検出して変更する方法を見ていきます。
Visualforce マークアップでのユーザーエクスペリエンスコンテキストの検出と対応
- Theme1 — 古い Salesforce テーマ
- Theme2 — Salesforce Classic 2005 ユーザーインターフェースのテーマ
- Theme3 — Salesforce Classic 2010 ユーザーインターフェースのテーマ
- Theme4d — 最新の「Lightning Experience」 Salesforce のテーマ
- Theme4t — Salesforce モバイルアプリケーションのテーマ
- Theme4u — Lightning コンソールのテーマ
- PortalDefault — Salesforce カスタマーポータルのテーマ
- Webstore — 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>
高度な操作
これは、作成された変数の値を使用しないため、<apex:variable> の使用方法としては普通ではありません。他にも、独自の出力を表示しないコンポーネントであれば、<apex:stylesheet> コンポーネントをラップできます。この方法は、<apex:variable> が、ラップされている <apex:stylesheet> コンポーネントにその rendered 属性を「貸している」ようなものだと考えてください。
<apex:variable> コンポーネントで他のコンポーネントをラップする場合、変数そのものは使用しないことをお勧めします。変数は実際には作成されないからです! これは機能なのか、それともバグなのか? とりあえず未定義の動作と呼びましょう。そして他の場所で uiTheme 変数を使用するのは避けてください。
JavaScript でのユーザーエクスペリエンスコンテキストの検出と応答
ユーザーに表示されている内容を JavaScript で検出するには、Visualforce で現在のユーザーエクスペリエンスコンテキストを検出するのと似た方法を使用します。UITheme.getUITheme() グローバル変数をコールして、現在のユーザーインターフェーステーマを識別する値を返します。
次のコードは、現在のユーザーエクスペリエンスコンテキストが Lightning Experience テーマかどうかを確認します。
function isLightningDesktop() { return UITheme.getUITheme === "Theme4d"; }
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 — 古い Salesforce テーマ
- Theme2 — Salesforce Classic 2005 ユーザーインターフェースのテーマ
- Theme3 — Salesforce Classic 2010 ユーザーインターフェースのテーマ
- Theme4d — 最新の「Lightning Experience」 Salesforce のテーマ
- Theme4t — Salesforce モバイルアプリケーションのテーマ
- Theme4u — Lightning コンソールのテーマ
- PortalDefault — Salesforce カスタマーポータルのテーマ
- Webstore — Salesforce AppExchange のテーマ
これらのメソッドをサーバー側のコントローラーコードで使用することはまれで、異なる Visualforce マークアップまたは JavaScript コードを提供する方が一般的です。コントローラーおよびコントローラー拡張コードは UX コンテキストに関して中立にすることがベストプラクティスです。ユーザーインターフェースの違いは、Visualforce であっても JavaScript であってもフロントエンドコードで処理することをお勧めします。
SOQL および API アクセスを使用した Lightning Experience のクエリ
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>
ユーザーの Lightning Experience の選好を直接照会することはお勧めしません。結果からわかるのはユーザーが現在選好する設定で、画面上の実際のユーザーエクスペリエンスではありません。いくつかの使用事例では、実際に行われているユーザーエクスペリエンスが選好値に反映されない場合があります。現在の要求で実際に行われているユーザーエクスペリエンスを判別するには、$User.UIThemeDisplayed または UserInfo.getUiThemeDisplayed() を使用します。