tyoshikawa1106のブログ

- Force.com Developer Blog -

SFDC:RemoteActionと標準ページへのVF埋め込み

標準ページへ埋め込むVisualforceページ開発でRemoteActionを利用するときの注意点です。RemoteActionの書き方はこんな感じです。

<apex:page standardController="Account" extensions="VFMessageController" showHeader="false">
    <div id="vf-page">
        <div id="vf-message" style="padding: 5px;"></div>
    </div>
    <script type="text/javascript">
        (function(){
            "use strict";
            
            // 初期処理
            function init() {
                
                VFMessageController.getMessage(function(result, event) {
                    if(event.status) {
                        console.log(result);
                        document.getElementById('vf-message').innerHTML = result;
                    } else {
                        alert(event.message);
                    }
                });
            }
            
            init();
        })();
    </script>
</apex:page>
public with sharing class VFMessageController {
    
    public VFMessageController(ApexPages.StandardController stdController) {
        
    }
    
    @RemoteAction
    public static String getMessage() {
        return 'VF Message!!';
    }
}


これでエラーもなく正常に実行されることを確認できます。
f:id:tyoshikawa1106:20160225231143p:plain


これをこのまま標準ページに埋め込んでみます。
f:id:tyoshikawa1106:20160225232035p:plain


単体では正常に表示されたVFページですが標準ページに埋め込むと・・・
f:id:tyoshikawa1106:20160225232150p:plain


このようにエラーになってしまいます。

Javascript proxies were not generated for controller VFMessageController: may not use public remoted methods inside an iframe.


標準ページに埋め込むVFではRemoteActionは利用できないのかと思ったりしたのですが、原因はpublic宣言にありました。このような使い方をする場合は、publicではなくglobalと宣言する必要があるみたいです。

global with sharing class VFMessageController {
    
    global VFMessageController(ApexPages.StandardController stdController) {
        
    }
    
    @RemoteAction
    global static String getMessage() {
        return 'VF Message!!';
    }
}


これで先程のエラーが解決して無事に表示されるようになりました。
f:id:tyoshikawa1106:20160225232541p:plain


今回、RemoteActionの戻り値はただのString型変数ですが、自作のWrapperクラスの場合はそちらもglobalの宣言にする必要がありました。


以上、RemoteActionと標準ページへのVF埋め込みについてです。