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