この文章は Salesforce 機械翻訳システムを使用して翻訳されました。詳細はこちらをご参照ください。
英語に切り替える

navigation メソッドの定義

カスタムコントローラの action メソッドは、データベース更新および他の計算を実行するほか、PageReference オブジェクトを返して、ユーザを別のページに移動することができます。

PageReference は、ページのインスタンス化への参照です。多数の属性の 1 つである PageReferences は URL、一連のクエリパラメータ名および値で構成されます。

カスタムコントローラまたはコントローラ拡張では、次のいずれかの方法で、PageReference を参照またはインスタンス化できます。
  • 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}