Salesforceの標準ページ(リストビュー or 詳細)からVisualforceページへ遷移させる方法と設定

Salesforceでは、標準オブジェクトやカスタムオブジェクトのリストビューまたは詳細画面から自分で作成したVisualForce画面に

遷移させることができ、この際に、リストビューで選択した複数レコードのIDを引き継いだり、詳細画面で表示されているオブジェクトのIDを取得したりすることができます。

このような場合、Salaesforce管理画面からカスタムのボタンを作成し、自分で作ったVisualForce画面を遷移先として選択することになるのですが、

「さっき作成したVisualForce画面が出ない!」ということがたまにあります。

こういう画面で、「コンテンツ」のところに何も出てこない場合ですね。

よくよく確認すれば理由があるのですが、忘れるとまた調査することになりそうなので、メモしておきます。

表示されるVisualForce画面は、コンストラクタの引数の型が決める

結論を先に言うと、ボタンから呼ばれる画面は、Visualforce画面で使用している拡張コントローラーのコンストラクタの引数の型が決定しています。

具体的には

リストビューから呼ばれるボタン(リストボタン)・・・ApexPages.StandardSetController

詳細画面から呼ばれるボタン(詳細ページボタン)・・・ApexPages.StandardController

です。

リストビューの場合は複数のオブジェクトのSetを渡せるようになっているとイメージすればいいですね。

リストビューページから呼ばれる場合

VisualForceページのヘッダ部分

<apex:page standardController="Account" extensions="myDetailControllerExtension" recordSetVar="accounts">

コントローラーのコンストラクタ部分

public myDetailControllerExtension(ApexPages.StandardController stdController) {
        List<Account> ssId = (List<Account>)controller.getSelected();
}

詳細ページから呼ばれる場合

VisualForceページのヘッダ部分

<apex:page standardController="Account" extensions="myControllerExtension">

コントローラーのコンストラクタ部分

public myControllerExtension(ApexPages.StandardSetController stdController) {
        this.acct = (Account)stdController.getRecord();
}