ナビゲーションの管理
学習の目的
この単元を完了すると、次のことができるようになります。
- あるページから別のページへの移動を制御する「従来」の Visualforce の 3 つのメカニズムについて説明する。
- これらのメカニズムのうち Lightning Experience ではどれが機能しないかを説明する。
- Lightning Experience のナビゲーションイベントを 3 つ以上挙げ、その送信方法を説明する。
ナビゲーションの管理
アプリケーションフローやナビゲーションは、多くの点でアプリケーション設計の中核となるものです。Visualforce には、ナビゲーション要素を追加したり、アプリケーションフローを方向付けたりする多数の方法が用意されています。Lightning Experience には、独自のアプリケーションフローやナビゲーション要素、そしてユーザーが Salesforce を使用中にどこに移動するかを左右するメカニズムが追加されています。
嬉しいことに、「従来」の Visualforce ナビゲーションも引き続き機能します。さらに嬉しいことは、Visualforce ページで Lightning Experience の新しいメカニズムを利用できます。
Lightning Experience のナビゲーション
Visualforce ナビゲーションと、Salesforce Classic および Lightning Experience で機能するよう作成する方法の詳細に進む前に、ナビゲーションというものについて少々説明しておきます。「ナビゲーション」とは実際のところ何を意味するのでしょうか。
ナビゲーションと言って最初に思い浮かぶのが、画面のユーザーインターフェース要素です。何かをクリックすると、何かが行われます。たとえば、ナビゲーションメニューの [取引先] 項目をクリックすると、取引先オブジェクトのホームページに移動します。[New (新規)] ボタンをクリックすれば、レコード入力フォームが表示されます。クイックアクションメニューからカスタムアクションを選択すれば、カスタムプロセスが起動します。他にもいろいろあります。こうしたボタンやメニュー項目がナビゲーション要素です。
ナビゲーションシステムである Lightning Experience のユーザーインターフェースの設計は、Salesforce Classic と大きく異なります。ここではその違いに言及しませんが、この 2 つのユーザーエクスペリエンスを切り替えたときに要素の配置がどのように異なるのかを把握していることが望まれます。配置の違いの詳細については、この Trailhead の「Lightning Experience のナビゲーションと設定」の単元で学習できます。
これほど明白ではないもう 1 つのナビゲーションが、上記の「何かが行われる」の部分です。メニューの項目が選択されたり、リンクやボタンがクリックされたときに、バックグラウンドで Salesforce が何を行うかを決定します。このナビゲーションのほとんどは Salesforce に組み込まれていますが、アクションの Visualforce ページでの上書きなど、カスタマイズ可能なものもあります。いずれにしろ、このナビゲーションはすべて Salesforce で記述されるコードで管理されます。
コードの記述後各自のアプリケーションでナビゲーションが可能になり、アプリケーションが各自のコードを使用してアプリケーションフローを制御します。カスタムアクションで開かれたフォームでユーザーが保存をクリックすると、どこに移動するのでしょうか。実行中のコードがユーザーの次の移動先を決定し、その場所に誘導します。この単元では、この動作について説明します。
従来の Visualforce ナビゲーション
「従来」の Visualforce ナビゲーションとは、突き詰めれば「アクションメソッドの終了時にどうなるか」ということです。アクションメソッドがユーザーの移動先となる場所の詳細を示す PageReference オブジェクトを返すと、Visualforce フレームワークが正しい応答をユーザーのブラウザーに送信する細かな処理を行います。そして、嬉しいことにこのすべてが引き続き機能します。
ご存知のように、標準コントローラーもそのアクションメソッドから PageReference を返します。そのため、既存のナビゲーションは、標準コントローラーを使用している場合でも独自のカスタムコントローラーコードを使用している場合でも、引き続き意図したとおり機能します。
最新の Visualforce ナビゲーション
従来の Visualforce ナビゲーションが機能するならば、なぜ最新のナビゲーションについて話す必要があるのかと疑問に思うかもしれません。簡潔に答えましょう。たった一言、その理由は …「JavaScript」です。
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 の有無をテストする必要があります。
sforce.one オブジェクトには次の関数があります。sforce.one オブジェクトからドット表記を使用して関数を参照します。たとえば、sforce.one.navigateToSObject(...) です。
関数 |
説明 |
---|---|
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 オブジェクトを使用したナビゲーションとメッセージング」を参照してください。
ナビゲーションの問題とその修正方法
JavaScript で Visualforce ナビゲーションを作成するときに何よりも大切なことは、window.location を直接設定しないことです。JavaScript で Visualforce ナビゲーションを作成するときに次に大切なことは、window.location を直接設定しないことです。
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
Salesforce リソースへの静的 URL は使用しないでください。つまり、取引先責任者レコードを編集するリンクを追加する場合、link = '/' + accountId + '/e' のような静的パターンを使用して文字列を作成する方法でリンクを作成しないでください。この方法はうまくいく場合もあれば、うまくいかない場合もあります。代わりに、次のいずれかの方法を実行します。
- Visualforce のマークアップで、{!URLFOR($Action.Contact.Edit, recordId)} を使用する。
- JavaScript で、navigateToSObject(recordId) を使用する。
表示、作成、編集などを行うアクションや関数が用意されているため、URL 文字列ではなく、こうしたアクションや関数を使用します。
リソース
- Trailhead: Lightning Experience のナビゲーションと設定
- Trailhead: Lightning Experience のカスタマイズ: カスタムボタンとカスタムリンクの作成
- Visualforce 開発者ガイド: PageReference クラス
- Visualforce 開発者ガイド: $Action を使用した action メソッドへの動的参照
- Salesforce モバイルアプリケーション開発者ガイド: sforce.one オブジェクトを使用したナビゲーションとメッセージング