Blog
ブログ

2020年08月28日

第15回社内勉強会

 7月31日、第15回目の勉強会が開催されました。
今回のテーマはどちらもsalesforceがらみのテーマ、「RemoteActionのケース」と、「SFDX Falcon」です。今回も大変勉強になりました。

RemoteActionのケース

 RemoteActionとは、Visualforceページから直接ApexコントローラへのAJAX要求を行うことができるツールです。
 RemoteActionを使用することで、コントローラからページを切り離して非同期アクションを実行したり、ページ全体を再読み込みせずにページ上でタスクを実行したりできます。さらに、ビューステートの問題の軽減にも役立ちます。
 コールを実行するたびに必要なデータのみを確実に渡せるため、RemoteActionは、きわめて効率よくコントローラをコールし、データをページから渡すことができる機能だといえます。

Remote Actionの追加方法

①Visualforceページへの追加
 VisualforceページでRemoteActionを使用するには、要求をJavaScript関数コールとして追加します。
 リモートメソッドコールは同期して実行されますが、応答が返されるのを待機しません。応答が返されると、コールバック関数は非同期で応答を処理します。

②Apexでのメソッドの宣言
 ほとんどすべてのApexメソッドをRemoteActionとしてコールできますが、メソッドはいくつかの簡単なルールに準拠している必要があります。

1.コントローラでは、Apexのメソッド宣言は、@RemoteActionアノテーションを先頭に付加する必要があります。
2.Apexの@RemoteActionメソッドはstaticで、かつglobalまたはpublicのいずれかである必要があります。
3.メソッドでは、引数として、Apex プリミティブ、コレクション、型指定されたsObject、汎用sObject、ユーザ定義Apexクラスおよびインターフェースを取ることができます。汎用sObjectでは、実際の型を特定するためにIDまたはsobjectTypeの値を指定する必要があります。インターフェースパラメータでは、実際の型を特定するためにapexTypeを指定する必要があります。
4.メソッドでは、Apexプリミティブ、sObject、コレクション、ユーザ定義されたApexクラスおよび列挙、SaveResult、UpsertResult、DeleteResult、SelectOption、またはPageReferenceを返すことができます。
5.RemoteAction に使用されるメソッドは、名前とパラメータ数によって一意に識別される必要があります。オーバーロードは不可能です。
たとえば、上記のメソッドでは、一緒に getItemId(Integer productNumber) メソッドを持つことはできません。代わりに、異なる名前で複数のメソッドを宣言します。
• getItemIdFromName(String objectName)
• getItemIdFromProductNumber(Integer productNumber)

③リモートメソッドと継承
 継承されるメソッドであるApexコントローラでリモートアクションをコールできます。@RemoteActionメソッドが検索またはコールされる場合、Visualforceではページコントローラの継承階層を調べ、コントローラの上位階層のクラス内で @RemoteAction メソッドを検索します。

リモート応答の処理

 リモートメソッドコールに対する応答をリモートメソッドのコールバック関数で非同期に処理します。このコールバック関数は、次のパラメータを受け取ります。
• リモートコールの状況を表すeventオブジェクト
• リモートApexメソッドによって返されるresultオブジェクト。
 関数は返されるデータに基づいてページの情報およびユーザインターフェース要素を更新できます。
 eventオブジェクトは、リモートコールの成功または失敗に対応するうえで役立つ値を提供します。

Remote Action VS Action Function

 Remote Actionと似たような機能を提供するものに、Action Functionがあります。Action Functionは、「apex:actionFunction」コンポーネントを使うことで利用することができます。
 通常、「apex:actionFunction」 の方が使いやすく、必要なコードも少なくなります。一方、JavaScript では、より高度な柔軟性を提供できます。

 この 2 つの具体的な相違点の一部を次に示します。
「apex:actionFunction」タグ
1.ユーザが再表示対象を指定できる
2.フォームを送信する
3.JavaScript の記述は不要

RemoteAction
1.ユーザがパラメータを渡すことができる
2.コールバックを提供する
3.一部の JavaScript を記述する必要がある

制限および考慮事項

・RemoteActionコールには、API制限は適用されませんが、RemoteActionを使用するVisualforceページには、すべての標準Visualforceの制限が適用されます。
・デフォルトでは、リモートコールの応答は、30秒以内に返される必要があります。これを超えると、コールはタイムアウトになります。要求の完了にこれ以上の時間を必要とする場合は、長いタイムアウトを120秒以内で設定します。
・要求の最大サイズは、ヘッダーを含み4MBです。
・リモートコールの応答の最大サイズは15MBです。

 RemoteActionは自分もちょうど業務で使っていたところでした。業務中は締め切りに追われなかなか体系的に学ぶ機会がないので、今回の発表をみて、自分も体系的に理解できるように頑張ろうと思いました。

SFDX Falcon


 続いては、SFDX Falconに関する発表です。
 SFDX Falconとは、Salesforceのパッケージ開発の利便性を高めるプラグインとしてSalesforce本社が開発した、SalesforceCLIのPluiginです。具体的には、パッケージ開発の流れを自動化するプラグインです。



 SFDX Falconには2種類の機能があります。
・AppExchange package kit
SFDX でのISV パッケージ開発をしやすくするためのツールおよびテンプレート

・AppExchange Demo kit
パッケージを含むデモ組織を簡単に作成するためのキット

AppExchange package kit

 CircleCIというCIツールを利用して、パッケージの開発環境作成、パッケージ環境へのデプロイ、ベータパッケージの作成まで自動化のテンプレートを自動で作成してくれます。ユーザはSalesforce Devhuv環境、package環境を用意しSalesforceCLIでログインをしておくことで、残りはSFDX Falconで対話式に必要な情報を入力するだけでひな形が完成します。
 このひな形で開発を行い、Githubにpushする事でCircleCIが走り、状況に合わせた自動化を行ってくれます。

AppExchange Demo kit

 パッケージ開発が完了した後に簡単にデモ組織が作成できるようになります。
 パッケージによってはインストールした後に追加で設定が必要だったり、テストユーザやテストレコードなどが必要になってくると思います。
 必要なものは用意する必要がありますが、一度このdemo kitの中で定義してしまうことで恒久的に同じデモ組織を作成することが出来ます。
 この機能も事前にDevhub組織にログインしておけばコマンドを打つことでデモ組織を作成してくれます。

注意点

・Windowsはサポートされていません。パス関係がLinux前提なのでWindowsだと参照エラーになります。
・Windowsで使用したい場合はSFDX FalconのインストールされたソースをWindowsのパス用に書き換える必要があります。


 Salesforceにはこんな便利なツールがあるんですね。関連知識を充実させて、自分も早く使いこなせるようになりたいと思いました。

このページの先頭へ