ナビゲーションの管理
学習の目的
ナビゲーションの管理
嬉しいことに、「従来」の Visualforce ナビゲーションも引き続き機能します。さらに嬉しいことは、Visualforce ページで Lightning Experience の新しいメカニズムを利用できます。
Lightning Experience のナビゲーション
ナビゲーションと言って最初に思い浮かぶのが、画面のユーザーインターフェース要素です。何かをクリックすると、何かが行われます。たとえば、ナビゲーションメニューの [取引先] 項目をクリックすると、取引先オブジェクトのホームページに移動します。[新規] ボタンをクリックすれば、レコード入力フォームが表示されます。クイックアクションメニューからカスタムアクションを選択すれば、カスタムプロセスが起動します。他にもいろいろあります。こうしたボタンやメニュー項目がナビゲーション要素です。
ナビゲーションシステムである Lightning Experience のユーザーインターフェースの設計は、Salesforce Classic と大きく異なります。ここではその違いに言及しませんが、この 2 つのユーザーエクスペリエンスを切り替えたときに要素の配置がどのように異なるのかを把握していることが望まれます。配置の違いの詳細については、この Trailhead の「Lightning Experience のナビゲーションと設定」の単元で学習できます。
これほど明白ではないもう 1 つのナビゲーションが、上記の「何かが行われる」の部分です。メニューの項目が選択されたり、リンクやボタンがクリックされたときに、バックグラウンドで Salesforce が何を行うかを決定します。このナビゲーションのほとんどは Salesforce に組み込まれていますが、アクションの Visualforce ページでの上書きなど、カスタマイズ可能なものもあります。いずれにしろ、このナビゲーションはすべて Salesforce で記述されるコードで管理されます。
コードの記述後各自のアプリケーションでナビゲーションが可能になり、アプリケーションが各自のコードを使用してアプリケーションフローを制御します。カスタムアクションで開かれたフォームでユーザーが保存をクリックすると、どこに移動するのでしょうか。実行中のコードがユーザーの次の移動先を決定し、その場所に誘導します。この単元では、この動作について説明します。
従来の Visualforce ナビゲーション
ご存知のように、標準コントローラーもそのアクションメソッドから PageReference を返します。そのため、既存のナビゲーションは、標準コントローラーを使用している場合でも独自のカスタムコントローラーコードを使用している場合でも、引き続き意図したとおり機能します。
最新の Visualforce ナビゲーション
JavaScript には洋々たる未来があります。そして今がその未来なのです。Visualforce 開発者の多くが各自のアプリケーションに JavaScript を多用しており、その利用は今なお増大しています。従来の Visualforce は機能しており、今後も長らく機能し続けるでしょう。ただし、開発者がリモートオブジェクトや JavaScript Remoting といった Visualforce の機能を採用するにつれ、アプリケーションの動作が、PageReference をルールとするサーバー側から、PageReference など存在しないブラウザーや JavaScript に移行することが増えています。
Lightning Experience (および Salesforce アプリケーション) の世界には、JavaScript でナビゲーションを作成するうえでのルールやツールが存在します。ここでは、そのルール (大半が「してはならないこと」ですが) について簡単に説明します。最初にすべきことから説明します。
Lightning Experience では、イベントを使用してナビゲーションを管理します。ナビゲーションイベントフレームワークは、プログラムによるナビゲーションを簡単に作成できるようにする多数の関数を備えた JavaScript ユーティリティオブジェクトとして使用できます。Visualforce ページを Lightning Experience で実行すると、そのページに sforce.one オブジェクトが自動的に追加されます。このオブジェクトには、関数がコールされたときにナビゲーションイベントをトリガーする関数が多数あります。これらの関数を使用するには、ページの JavaScript コードから直接コールするか、コールをクリック (または他の) ハンドラーとしてページの要素に追加します。
重要
sforce.one オブジェクトは、Salesforce Classic では使用できません。このオブジェクトを使用するコードは、最初に sforce.one の有無をテストする必要があります。
関数 | 説明 |
---|---|
back([refresh ]) | sforce.one 履歴に保存されている、以前の状態に移動します。ブラウザーの [戻る] ボタンをクリックするのと同じです。 |
navigateToSObject(recordId [, view ]) | recordId で指定した sObject レコードに移動します。 |
navigateToURL(url [, isredirect ]) | 指定した URL に移動します。 |
navigateToFeed(subjectId, type ) | subjectId で絞り込んだ、指定した type のフィードに移動します。 |
navigateToFeedItemDetail(feedItemId ) | 特定のフィード項目 feedItemId と関連付けられたコメントに移動します。 |
navigateToRelatedList(relatedListId, parentRecordId ) | parentRecordId の関連リストに移動します。 |
navigateToList(listViewId, listViewName, scope ) | listViewId (表示されるリストビューの ID) で指定されたリストビューに移動します。 |
createRecord(entityName [, recordTypeId ]) | 指定した entityName (「Account」や「MyObject__c」など) の新しいレコードを作成するページを開きます。 |
editRecord(recordId ) | recordId で指定したレコードを編集するページを開きます。 |
これらの関数の使用方法と、その関数が受け入れるパラメーターについての詳細は、この単元のリソースにある「sforce.one オブジェクトを使用したナビゲーションとメッセージング」を参照してください。
ナビゲーションの問題とその修正方法
window.location を直接設定しない
これだけ言えば大丈夫でしょうか。この理由は簡単です。Lightning Experience では、ページに設定する window.location がないためです。Visualforce の「コンテナ」や、iframe でラップされること、Lightning Experience が単一ページアプリケーション (SPA) であることなどはすでに説明しましたが、この点も追記しておく必要があります。Visualforce の iframe は window.location 値に直接アクセスできず、したがってこの値を設定することができません。コードがこの設定に依存している場合、そのコードは壊れます。つまり、window.location を設定してナビゲーションを起動するアクションによって、意図する移動先へのナビゲーションが停止します。
この制限を回避する方法があるにはあるのですが、実行しないほうがよいでしょう。というのも、sforce.one のナビゲーション関数を迂回すれば、Lightning Experience ナビゲーションスタックでナビゲーションイベントが追跡されなくなるためです。このスタックには、[戻る] ボタンなどリダイレクトに関する便利な機能が揃っています。Lightning Experience (および特に Salesforce アプリケーション) の多くの機能は、すべてのナビゲーションイベントを含むスタックに依存しています。このスタックは正しく使用する価値があります。
Salesforce Classic の問題
気を付ける点がもう 1 つあります。残念ながら、ページを Salesforce Classic で実行するときは、sforce.one ユーティリティオブジェクトを使用できません。そのため、window.location を使用する必要があります。嬉しいことに、Salesforce Classic では window.location を使用できます。けれども、悲しいことに、この制限のためにコードに if ブロックを追加する必要があります。こうした複雑性に対処するユーティリティメソッドでナビゲーション関数をラップすることを検討します。そうすれば、メインのナビゲーションロジックがわかりやすいものになります。
静的 URL
- Visualforce のマークアップで、{!URLFOR($Action.Contact.Edit, recordId)} を使用する。
- JavaScript で、navigateToSObject(recordId) を使用する。
リソース
- Trailhead: Lightning Experience のナビゲーションと設定
- Trailhead: Lightning Experience のカスタマイズ: カスタムボタンとカスタムリンクの作成
- Visualforce 開発者ガイド: PageReference クラス
- Visualforce 開発者ガイド: $Action を使用した action メソッドへの動的参照
- Salesforce モバイルアプリケーション開発者ガイド: sforce.one オブジェクトを使用したナビゲーションとメッセージング