2017.05.23

検索テンプレートで使えるApexクラス拡張サンプル集

  • このエントリーをはてなブックマークに追加
  • follow us in feedly

検索画面を簡単に作成できる検索テンプレートですが、Apexクラス拡張を使用することで さらに便利に使うことができます。
本日は、Apex拡張コードのサンプルとともに、 検索テンプレートの一歩進んだ使い方をご提案したいと思います。

サンプル1 検索条件を自動的に設定する

たとえば、今日を含めて過去7日間に更新されたデータを検索したい場合、 検索テンプレートでは今日の日付と7日前の日付を条件に手動で設定する必要があります。
このように、ある程度固定の条件が決まっている(+αで手動の条件を設定したい)場合、 Apexクラス拡張を使用することで検索条件を自動設定することができます。

それではサンプルコードを見てみましょう。

public with sharing class DefaultConditionExtender extends SkyEditor2.Extender{
    SearchPage extension {get;set;}
    public DefaultConditionExtender(SearchPage ext){
        this.extension = ext;
    }

    // initメソッドをオーバーライドして検索条件に初期条件を設定する
    public override void init(){
        // 範囲指定条件の開始日をセット
        extension.Componet6_from.Date__c = Date.today() - 7;
        // 範囲指定条件の終了日をセット
        extension.Componet6_to.Date__c = Date.today();

        // 項目指定条件の演算子を設定
        extension.Component9_op = SkyEditor2.TextHolder('ge');
        // 項目指定条件の条件値を設定
        extension.Component9_val.Text__c = '10000';
    }
}

このサンプルコードでは、

  1. Component5というIDが付与された範囲指定の日付型条件に対して、 7日前から今日までという条件を設定する
  2. Component10というIDが付与された数値型の検索条件項目に対して、 10000以上という条件を設定する

という2つの処理をしています。

サンプル2 初回検索を自動で実行する

サンプル1で初期条件が設定できましたが、検索テンプレート画面の仕様では、画面を開いた際に検索が実行されません。
せっかく検索条件の初期値が設定できたのですから、今度は画面を開いた際に自動的に検索をする処理をご紹介します。

public with sharing class DefaultConditionExtender extends SkyEditor2.Extender{
    SearchPage extension {get;set;}
    public DefaultConditionExtender(SearchPage ext){
        this.extension = ext;
    }

    public override void init(){
        // 検索実行
        extension.doSearch();
    }
}

初回検索を実行するために必要なことは、オーバーライドしたinitメソッドの一番最後で、
ページコントローラーの「doSearch」メソッドを呼び出すだけです。
つまり、サンプル1のinitメソッドの一番最後に「extension.doSearch();」を1行追加してあげることで、

検索のデフォルト条件値の設定->検索

という一連の処理を実装できます。

サンプル3 検索結果からレコードを選択してPDFを保存する

ここまで検索テンプレートの検索に関わるカスタマイズをしてきましたが、 今度は検索結果に対して新しい処理を追加していきましょう。
今回は、検索結果レコードをチェックボックスで選択し、 選択されたレコードをPDFファイルとして各レコードの添付ファイルに保存するという処理をしてみたいと思います。

事前準備1 PDFページの作成

PDFファイルを添付ファイルに保存するために、事前にPDFとして保存したいページをSalesforceにデプロイしておきましょう。
この画面は、Salesforceレイアウトでも自由レイアウトでもどちらでも構いません。

事前準備2 検索テンプレート画面の設定変更

レコードを選択するためには、検索結果テーブルにチェックボックス列を表示しておく必要があります。 他のプロパティ設定によって設定内容が異なります。

  1. 行コピー・一括編集・選択削除のいずれかがONになっている場合
    追加の設定は不要です。
  2. 行コピー・一括編集・選択削除のすべてがOFFになっている場合
    データテーブルプロパティの「テーブル機能」セクションの中に、 「チェックボックス列表示」プロパティが表示されているはずですので、このプロパティをONにします。

また、PDF保存処理を実行するため、検索テンプレート画面にカスタムボタンを追加する必要があります。

事前準備が完了したら、実際のサンプルコードを見ていきましょう。

public with sharing class SavePDFToAttachmentExtender extends SkyEditor2.Extender{
    SearchPage extension {get;set;}

    public SavePDFToAttachmentExtender(SearchPage ext){
        this.extension = ext;
    }

    public PageReference savePdf(){
        List<Id> saveRecords = new List<Id>();
        for(Component3Item i: Component3.items){
            // 既に保存されている、かつチェックボックス列にチェックが入っているレコードのIDを
            // リストに追加する
            if(i.selected && i.record.Id != null){
                saveRecords.add(i.record.Id);
            }
        }

        if(saveRecords.size() > 0){
            String filename = DateTime.now().format('YYYY/mm/DD HH:mm:SS');

            List<Attachment> attachmentList = new List<Attachment>();
            for(Id i:saveRecords){
                try{
                    // orderSheetSampleは事前準備で作成したPDFページのページ名
                    PageReference pdf = Page.orderSheetSample;
                    // PageReferenceにIDパラメータを付与してコンテンツを取得する
                    pdf.getParameters().set("id",i);
                    Blob content = pdf.getContent();
                    // 取得したコンテンツで添付ファイルレコードを作成
                    Attachment attach = new Attachment();
                    attach.Name = filename;
                    attach.Body = pdf;
                    attach.ContentType = 'application/pdf';
                    attach.ParentId = i;
                    attachmentList.add(attach);
                }catch(Exception ex){}
            }
            try{
                insert attachmentList;
                SkyEditor2.Messages.addInfoMessage('PDFを保存しました。');
            }catch(DmlException ex){}
        }
        return null;
    }
}

データテーブルのレコード操作については、別の記事で解説しています。

ここでは、

  1. データテーブルのリストからチェックが付いているレコードのIDを抽出(selectedプロパティ)
  2. 1で抽出したIDをパラメータに付与して、PDFページの内容をgetContentメソッドで取得
  3. 取得したPDFコンテンツを添付ファイルオブジェクトに格納してレコード作成

の3つの操作を行っています。

おわりに

今回は、3種類のサンプルコードをご紹介しました。いかがだったでしょうか?
Apexクラス拡張を使用することで、今までできなかったページが作成できます。
Apexクラス拡張の詳しい説明については、こちらのリファレンスも参照してみてください。
皆さんもぜひ試してみてください。

1 件

関連する記事