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(); }