関連リストで選択したレコードをまとめて処理【Visualforce + Apex】

photo of clouds Apex
Photo by Tadas Lisauskas on Pexels.com

関連リストで選択したレコードに対しまとめて処理を行う方法について、備忘録として基本的な実装を残したいと思います。

構成

  • リストボタン
  • 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;
    }
}

リストボタンの作成はこんな感じ。

コメント

タイトルとURLをコピーしました