エンジニアの谷隈です。
Spring'14からパイロットリリースされている新機能「Visualforce Remote Objects」を試してみました。
「Visualforce Remote Objects」というのはVisualforce上からJavaScript経由でセールスフォース上のオブジェクトデータを操作(取得・作成・更新・削除)する仕組みです。
APIコール数を消費しない、Apexコードの実装が不要といった特長があります。
今回はこの機能のうちデータ取得についての検証を行いました。
○使い方
「Visualforce Remote Objects」を使用する際の大まかな手順は次の2ステップになります。
まずはイメージを掴むための、簡単なサンプルから。
コード例:Visualforce
<apex:remoteObjects > <apex:remoteObjectModel name="Test__c" fields="Id, Name, DateField__c, DateTimeField__c, CreatedDate"/> </apex:remoteObjects>
「Visualforce Remote Objects」でオブジェクトのデータを操作する場合には、どのオブジェクトのどのフィールドを使用するかどうかをapexタグで宣言する必要があります。
上のコードはVisualforceページにTest__cオブジェクトを取得するためのタグを記載したコード例です。
Test__cオブジェクトのId, Name, DateField__c, DateTimeField__c, CreatedDateフィールドへの使用を宣言しています。
コード例 JavaScript
var som = new SObjectModel.Test__c(); som.retrieve({limit:22}, function(err, records){ // データ取得後の処理 });
JavaScript側のコードは、apexタグにより生成されたモデルを利用してデータの操作を行います。
データの取得には「retrieve」functionを使用します。
retriveには第1引数に取得条件、第2引数に取得したデータを処理するコールバックfunctionを渡します。
実際にはこの後、画面に表示するための処理が必要になりますがSF上からデータを取得するという部分はこれだけです。
○apexタグについての詳細
サンプルはミニマムな例でしたが、「Visualforce Remote Objects」のapexタグにはいくつかオプションがあります。
ここでは指定できるオプションについて見ていきたいと思います。
・apex:remoteObjectsの属性
属性 | 説明 |
---|---|
jsNamespace | タグにより生成されるJavaScriptの名前空間を指定できます。省略時はSObjectModelになります。 |
id | 他のapexタグと同じです。 |
rendered | 他のapexタグと同じです。 |
・apex:remoteObjectModelの属性
属性 | 説明 |
---|---|
name | 利用するオブジェクトのAPI参照名を指定します。(必須) |
jsShorthand | 利用するオブジェクトのJavaScriptコード上での名前を指定します。省略時はnameと同じになります。 |
fields | 利用するフィールドのAPI参照名をカンマ区切りで指定します。ここで指定しない場合はapex:remoteObjectFieldタグで利用するフィールドを指定します。 |
id | 他のapexタグと同じです。 |
rendered | 他のapexタグと同じです。 |
・apex:remoteObjectFieldの属性
属性 | 説明 |
---|---|
name | 利用するフィールドのAPI参照名を指定します。(必須) |
jsShorthand | 利用するフィールドのJavaScriptコード上での名前を指定します。省略時はnameと同じになります。 |
id | 他のapexタグと同じです。 |
rendered | 他のapexタグと同じです。 |
各タグのドキュメントは下記です。
apex:remoteObjects
http://www.salesforce.com/us/developer/docs/pages/Content/pages_compref_remoteObjects.htm
apex:remoteObjectModel
http://www.salesforce.com/us/developer/docs/pages/Content/pages_compref_remoteObjectModel.htm
apex:remoteObjectField
http://www.salesforce.com/us/developer/docs/pages/Content/pages_compref_remoteObjectField.htm
○JavaScriptコードについての詳細
「Visualforce Remote Objects」利用時のJavaScriptコードの基本的な流れは次の2ステップです。
1. apexタグにより生成されたモデルのオブジェクトを生成
2. 生成したオブジェクトのメソッドを呼び出す。
データの取得にはapexタグで生成されたモデルのretrieve functionを使います。
Retrieving Records with Remote Objects
https://www.salesforce.com/us/developer/docs/pages/Content/pages_remote_objects_using_retrieve.htm
retieve function
retrieve functionは検索条件と取得結果を処理するコールバックfunctionの2つの引数を受け取ります。
RemoteObjectModel.retrieve({criteria}, callback_function)
・retieve functionの第1引数
第1引数にはデータを取得する条件をオブジェクトに格納して指定します。
プロパティ | 説明 |
---|---|
limit | データ取得件数を指定します。省略時は20で最大が100です。 |
offset | データを取得する際に何件目から取得するかを指定します。省略時は1です。 |
Where | データの取得条件を指定します。現在はeq,lt,gt,like,and,orが指定できます。 |
※limitに100以上の値を指定した場合の動きについて
エラーにはなりませんが100件までしかデータを取得できませんでした。
※Where条件の指定イメージ
{ limit: 100, where: { or: { DateField__c: {gt: new Date(2014,05,01)}, Name : {like: '田中%'} } } }
Where条件の指定は上のような形式で記述します。
ちなみにドキュメントで利用可能な比較条件にnotが無かったのが気になったので、ダメ元で試してみましたがやはりnot条件は利用できない様です。
Format and Options for Remote Objects Query Criteria
http://www.salesforce.com/us/developer/docs/pages/Content/pages_remote_objects_using_retrieve_query_object.htm
・retieve functionの第2引数
第2引数には取得した結果を処理するコールバックfunctionを指定します。
function callback(error, results, event) { // ... }
コールバックfunctionの引数
引数 | 説明 |
---|---|
error | エラーメッセージが格納されます。正常終了時はnullです。 |
result | 取得結果レコードがモデルオブジェクトの配列で返されます。 |
event | DML操作の詳細情報が格納されます。 |
※コールバックfunctionの第3引数について
コールバックfunctionの第3引数には処理結果がJavaScriptのオブジェクトとして格納されます。
retrieve()の結果を確認したところ次のものが格納されていました。
(statusCode, type, tid, ref, action, method, result, status)
ドキュメントには通常は第1,第2引数でエラーチェックを行い、第3引数はデバッグもしくは細かいエラー管理用として使用するとの記載があるのみで詳細には触れられていなかったので通常利用は想定されていないのかもしれません。
Remote Objects Callback Functions
http://www.salesforce.com/us/developer/docs/pages/Content/pages_remote_objects_callback_functions.htm
・モデルオブジェクトのフィールドへのアクセス
取得した結果レコードのオブジェクトのフィールド値へのアクセスはget() / set() functionを利用します。
var name = obj.get('Name'); obj.set('Name', name);
また、日付型、日付/日時型については共にJavaScriptのDateに変換された形で取得することができます。(タイムゾーンはローカルです。)
・オブジェクト権限と項目レベルセキュリティ
オブジェクト、項目レベルどちらの場合も権限がなければ呼び出し結果はエラーになります。
項目レベルセキュリティについてはその項目だけ取得できないという動きではないので注意が必要です。
Visualforce Remote Objects
http://www.salesforce.com/us/developer/docs/pages/Content/pages_remote_objects.htm
・その他制限事項
基本的にVisualforceの制限事項はすべて適用されます。
また、地図情報は取得できません。取得しようとしても何事もなかったのかのように無視されます。
Limitations of Remote Objects
http://www.salesforce.com/us/developer/docs/pages/Content/pages_remote_objects_limitations.htm