navigation メソッドの定義
カスタムコントローラーの action メソッドは、データベース更新および他の計算を実行するほか、PageReference オブジェクトを返して、ユーザーを別のページに移動することができます。
PageReference は、ページのインスタンス化への参照です。多数の属性の 1 つである PageReferences は URL、一連のクエリパラメーター名および値で構成されます。
カスタムコントローラーまたはコントローラー拡張では、次のいずれかの方法で、PageReference を参照またはインスタンス化できます。
-
1Page.existingPageName組織ですでに保存している Visualforce ページの PageReference を参照します。このプラットフォームはこのようにページを参照することで、コントローラーまたはコントローラー拡張が指定されたページの有無に依存することを認識し、コントローラーまたは拡張が存在する間はページが削除されないようにします。
-
1PageReference pageRef = new PageReference('partialURL');Lightning プラットフォームでホストされる任意のページに PageReference を作成します。たとえば、'partialURL' を '/apex/HelloWorld' に設定すると、http://MyDomainName--PackageName.vf.force.com/apex/HelloWorld にある Visualforce ページを参照します。同様に、'partialURL' を '/' + 'recordID' に設定すると、指定したレコードの詳細ページを参照します。
この構文は、PageReference はコンパイル時ではなく、実行時に構成されるため、Page.existingPageName のページ以外の Visualforce ページの参照にはお推めしません。実行時の参照は、参照整合性システムには使用できません。したがって、プラットフォームはこのコントローラーまたはコントローラー拡張機能が指定されたページの有無に依存することを認識しないため、ユーザーによるページの削除を防ぐためにエラーメッセージを表示しません。
-
1PageReference pageRef = new PageReference('fullURL');外部 URL の PageReference を作成します。次に例を示します。
1PageReference pageRef = new PageReference('http://www.google.com');
この例では、ユーザーが [保存] をクリックした後に、そのユーザーを新しい URL にリダイレクトすることを想定します。これを行うには、まず次の URL に移動し、クイック修正を使用して mySecondPage という 2 つ目のページを作成します。
1https://MyDomainName--PackageName.vf.force.com/apex/mySecondPageそれから、mySecondPage に次のマークアップを追加します。簡略化のために、チュートリアルの最初の方で定義した次の標準コントローラーベースのページを使用します。
1<apex:page standardController="Account">
2 Hello {!$User.FirstName}!
3 <p>You are viewing the {!account.name} account.</p>
4</apex:page>ここで、action メソッドの定義で作成した元のページに戻り、取引先 id クエリパラメーターを URL に指定していることを確認します。新しく作成した「mySecondPage」ページに PageReference を返すように、コントローラーの save メソッドを編集します。
1public class MyController {
2
3 Account account;
4
5 public PageReference save() {
6 update account;
7 PageReference secondPage = Page.mySecondPage;
8 secondPage.setRedirect(true);
9 return secondPage;
10 }
11
12 public String getName() {
13 return 'MyController';
14 }
15
16 public Account getAccount() {
17 if(account == null)
18 account = [select id, name, site from Account
19 where id = :ApexPages.currentPage().getParameters().get('id')];
20 return account;
21 }
22}上記のコードでは、PageReference の redirect 属性は true に設定されています。この属性が設定されていない場合、PageReference はブラウザーに返されますが、移動は発生せず、元のページの URL のままになります。移動先の URL を変更する場合は、redirect 属性を設定する必要があります。
ここでページをテストする場合、[新規取引先名を保存] をクリックすると mySecondPage に移動しますが、データのコンテキストは失われるため、{!account.name} で使用できる値はありません。これは、リダイレクトが発生したときにコントローラーがコンテキストの状態をクリアするからです。そのため、PageReference のパラメーターの対応付けで id クエリ文字列パラメーターをリセットする必要があります。
1public class MyUpdatedController {
2
3 Account account;
4
5 public PageReference save() {
6 update account;
7 PageReference secondPage = Page.mySecondPage;
8 secondPage.setRedirect(true);
9 secondPage.getParameters().put('id',account.id);
10 return secondPage;
11 }
12
13 public String getName() {
14 return 'MyController';
15 }
16
17 public Account getAccount() {
18 if(account == null)
19 account = [select id, name, site from Account
20 where id = :ApexPages.currentPage().getParameters().get('id')];
21 return account;
22 }
23}