関連リストで選択したレコードに対しまとめて処理を行う方法について、備忘録として基本的な実装を残したいと思います。
構成
- リストボタン
- Visualforce
- Apex
リストボタンを関連リストに設置し、Visualforce + Apex で作成した画面を呼び出します。
実装例
処理のイメージです。
コードはこんな感じ。
Visualforce では、standardController と recordSetVar を記述することで、標準リストコントローラが使えます。その結果 {!selected} で選択したレコードを取得できます。
extensions で コントローラ拡張を指定し、さらに独自のカスタマイズができるようになります。
<apex:page standardController="Contact" recordSetVar="contacts" extensions="UpdateContacts">
<apex:form>
<apex:pageBlock title="以下の取引先責任者について処理を実行します">
<apex:pageBlockButtons location="top">
<apex:commandButton value="実行" action="{!execute}"/>
<apex:commandButton value="キャンセル" action="{!cancel}"/>
</apex:pageBlockButtons>
<apex:pageBlockTable value="{!selected}" var="contact">
<apex:column value="{!contact.name}"/>
</apex:pageBlockTable>
</apex:pageBlock>
</apex:form>
</apex:page>
コントローラ拡張では、コンストラクタで StandardSetController を引数に取ります。その結果、標準リストコントローラのメソッドを利用できます。例えば、getSelected() で選択したレコードを取得することができます。
public with sharing class UpdateContacts {
public ApexPages.StandardSetController controller;
List<Contact> selectedContactList;
public UpdateContacts(ApexPages.StandardSetController controller){
this.controller = controller;
this.selectedContactList = controller.getSelected();
}
public PageReference execute(){
for(Contact contact : selectedContactList){
// レコードの値を書き換えたり、別のレコードを作成したりする
}
PageReference pageRef = controller.cancel(); // 元のリストビューページを取得
pageRef.setRedirect(true);
return pageRef;
}
}
リストボタンの作成はこんな感じ。
コメント