2017.05.23

Apexクラス拡張を使ってSkyVisualEditorを強化しよう

みなさん、こんにちは。 今回は、Apexクラス拡張機能を使ったページのカスタマイズについて説明したいと思います。

Apexクラス拡張機能とは

SkyVisualEditorで生成されるページを、Apexクラスを記述することで一部拡張することができる機能です。 標準で提供されている機能では実現できないような処理を行うことが可能です。

使用例

  • 保存前に独自の値チェックを行いたい
    例:データテーブルに1件以上レコードが登録されていないと保存できないようにする
  • 項目に特定の値を自動でセットしたい
    例:日付型項目に今日の日付を自動で挿入したい
  • データテーブルの行追加時に主オブジェクトの値をセットしたい
  • 検索テンプレート/カスタムルックアップテンプレートで検索条件の初期値をセットしたい
  • カスタムボタンで独自のApex処理を走らせたい
  • 処理に時間のかかるSkyOnDemandのHTTPトリガーを起動したい
    SkyOnDemandの連携ボタンが標準で提供されていますが、1回の処理に時間がかかる(10秒以上)場合処理がタイムアウトしてしまうため、Apexクラス経由で処理しなければならない場合があります。

Apexクラス拡張機能を使ってみる

それでは、Apexクラス拡張を使用してページを拡張してみましょう。
今回は、保存前にデータテーブルの空行を自動削除する機能を作成したいと思います。

Apexクラス拡張を作成する方法は2つあります。

  • SkyVisualEditor Studioからページと一緒にデプロイする
  • 組織にデプロイ済みのApexクラスを指定する

今回は、1つ目の「SkyVisualEditor Studioからページと一緒にデプロイする」方法で作成します。

目次
1.Apexクラスの準備
2.コード編集
 2-1.前準備
 2-2.削除対象の抽出
 2-3.削除処理
3.動作の確認

1.Apexクラスの準備


スタジオ画面のページプロパティに「Apexクラス拡張」というメニューがあります。 そこから、「Studioで直接編集」ボタンを押します。


すると、拡張Apexクラス編集ダイアログが開きます。 ここでは、拡張クラスを記述するための最低限のコードが自動生成されています。

これで拡張クラスの作成準備は完了です。続いて、コードを編集して機能を追加していきましょう。

2.コードを編集する

ここから、データテーブルに追加された空行を削除するための作業に移っていきます。
ページのクラス名やコンポーネントIDによって記述するためのコードが変わりますので、 適宜読み替えてください。
今回の設定では、ページ名として「ExtendedApexClassSample」という名前を設定しており、 ページプロパティの「Apexクラス名」の編集するチェックをOFFにしています。

2-1.前準備

まず、ページのコントローラをプロパティとして拡張クラス内に保持します。(4行目,10行目)
さらに、保存ボタンが押された後、実際の保存処理の前に割り込み処理を追加するため、preSaveメソッドを実装します。

global with sharing class ExtendedApexClassSampleExtender extends SkyEditor2.Extender{

    // ページのコントローラを保持するプロパティ
    ExtendedApexClassSample extension {get; set;}

    // コンストラクタ
    // 引数でページのコントローラクラス型を受け取ります
    public ExtendedApexClassSampleExtender(ExtendedApexClassSample extension){
      // 引数で受け取ったコンストラクタをプロパティにセットする
      this.extension = extension;
    }

    // 保存前処理
    public override void preSave(){

    }
}

続いて、実際の割り込み処理をpreSaveメソッドに記述していきます。

2-2.削除対象の抽出

データテーブルのリストを取得します。
SkyVisualEditorでは、テーブルのリストを実現するためのクラスと、各レコードを表現するためのアイテムクラスが自動生成されます。
自動生成されたクラスは、ページのコントローラクラスの内部クラスとして、
データテーブルコンポーネントの「ID」プロパティの値をクラス名として生成されます。
たとえば、データテーブルのIDに「DataTable1」と設定されている場合、
テーブルクラス:DataTable1
アイテムクラス:DataTable1Item
という名前で生成されます。
各クラスは内部クラスなので、「[ページのコントローラ名].[テーブルクラス]」のような形で使用します。
また、テーブルクラスのインスタンスは、クラス名と同じ名前の変数に格納されています。

データテーブルのリストは、テーブルクラスのitemsという名前の変数が保持しています。
今回のサンプルでは、「extension.DataTable1.items」で取得できます。(5行目)
ここで取得できる値は、実際の値ではなく、アイテムクラス型になっています。
実際のレコードは、アイテムクラスのrecordという名前のプロパティが保持しています。(7行目)

// 削除の対象となるレコードを格納するリストを作成
List<ExtendedApexClassSample.DataTable1Item> removeList = new List<ExtendedApexClassSample.DataTable1Item>();

// テーブルのリストを検証
for(ExtendedApexClassSample.DataTable1Item item : extension.DataTable1.items){
    // Name項目が空だった場合に削除
    if(String.isBlank(item.record.Name)){
        removeList.add(item); 
    } 
}

2-3.削除処理

最後に、実際の削除処理を記述します。
Itemクラスのremoveメソッドを使用すると、該当のレコードを削除できます。

for(ExtendedApexClassSample.DataTable1Item item : removeList){
  // レコード削除
  item.remove();
}

最終的に拡張クラスは、下記のようになります。

global with sharing class ExtendedApexClassSampleExtender extends SkyEditor2.Extender{

    // ページのコントローラを保持するプロパティ
    ExtendedApexClassSample extension {get; set;}

    // コンストラクタの引数でページのコントローラクラス型を受け取ります
    public ExtendedApexClassSampleExtender(ExtendedApexClassSample extension){
        this.extension = extension;
    }
    
    public override void preSave(){
        // 削除の対象となるレコードを格納するリストを作成
        List<ExtendedApexClassSample.DataTable1Item> removeList = new List<ExtendedApexClassSample.DataTable1Item>();

        // テーブルのリストを検証
        for(ExtendedApexClassSample.DataTable1Item item : extension.DataTable1.items){
            // Name項目が空だった場合に削除
            if(String.isBlank(item.record.Name)){
                removeList.add(item); 
            }
        }
        for(ExtendedApexClassSample.DataTable1Item item : removeList){
            // レコード削除
            item.remove();
        }
    }
}

3.デプロイをして画面の動きを確認する

今回作った拡張クラスを基に、取引先と取引先責任者の一括登録ページを作成しました。
データテーブルの初期追加行数指定機能で、ページを開いた時点で10件のレコードが生成されていますが、
本来であれば10件全て入力するか、未入力の行を削除しないと保存ができません。

しかし今回作成したページでは、取引先責任者の姓と名が入力されていないレコードを保存前処理で削除しているため、
このまま保存ボタンを押すと、入力済みの2レコードのみ保存されます。

実際にこの画面を作成したものを用意しましたので、
↓のリンクからダウンロードして、ぜひお試しください。
ExtendedApexClassSample.sve
ファイルの使用方法はこちらをご覧ください。

Apexクラス拡張を使う上での注意点

使い方によっては、大変便利なApexクラス拡張ですが、活用するためにはある程度のApex開発技術が必要になります。
クラス拡張を使用する際に注意しなければならない点をまとめてみました。

  • Apexクラスを記述するカスタマイズになるため、ある程度のプログラミング能力が必要になります。
  • ガバナ制限やセキュリティの注意事項等、Force.comプラットフォームの制約を正しく理解している必要があります。
  • Apexクラスの開発をするため、標準機能のみを使用した開発と比べると開発効率がやや下がります。
  • Apexクラス拡張で記述されたコードについては、製品サポートの対象外となります。

さいごに

Apexクラス拡張を使用することで、SkyVisualEditorに足りなかった機能を独自に追加することができます。
今回は保存前の処理を追加しましたが、他にもさまざまな使用方法があります。
ユーザーマニュアルに詳細が記載されているので、詳い使い方はマニュアルをご覧ください(326ページ)。
製品マニュアルはこちら

コーディングが必要になってしまいますが、
「画面構成をドラッグ&ドロップで簡単に作成+独自の処理をApexクラス拡張で作成」
とすることで、全て手作りするよりも早く・簡単に必要な画面が構築できます。

今後は、拡張クラスのサンプルや活用例等もご紹介できればと思っていますのでお楽しみに。

1 件
     
  • banner
  • banner

関連する記事