2

CRM2011のプラグインを使用して適切なWebリソースからJavaScript関数を実行するにはどうすればよいですか。

インターネットで情報が見つかりませんでした。ほとんどのリソースでは、JSからプラグインをトリガーする方法について説明していますが、その逆ではありません。

これがJSコードです。メモを説明フィールドにコピーしています。保存をクリックしたとき。説明フィールドにデータが正しく表示されていることがわかります。ただし、[保存]を押してフォームを閉じてもう一度開くと、説明フィールドは空になります。その理由は、JSが安全なイベントの後に実行されたためだと思いましたが、後のテストでそれが誤りであることが判明しました。データが保存されない原因となるこのJSコードのエラーを誰かが指摘できますか?または、関連するエンティティからデータを取得してフォームのフィールドに書き込むプラグインを作成する方法を提案します。ありがとう

ここに画像の説明を入力してください

function copyNotes()
 {
// CLEAR DESCRIPTION FIELD
alert("JS");
    Xrm.Page.getAttribute("description").setValue('');
// GET ID OF THE CASE AND CLEAN IT AND GET URL for oData stuff
//THEN CALL RETRIEVE FUNCTION
    var caseID = Xrm.Page.data.entity.getId();
    caseID = caseID.replace('{', '').replace('}', '');
    var oDataPath = Xrm.Page.context.getServerUrl() + "/xrmservices/2011/organizationdata.svc";
    ODataPath = Xrm.Page.context.getServerUrl() + "/XRMServices/2011/OrganizationData.svc";
    retrieveRecord(caseID);
}
// CREATE AN HTTP REQUEST AND SEND IT
function retrieveRecord(Id) {

var retrieveReq = new XMLHttpRequest();
retrieveReq.open("GET", ODataPath + "/AnnotationSet?$filter=ObjectId/Id" + " eq (guid'" + Id + "')", true);

retrieveReq.setRequestHeader("Accept", "application/json");
retrieveReq.setRequestHeader("Content-Type", "application/json; charset=utf-8");
retrieveReq.onreadystatechange = function() {
// THIS HANDLES A CALLBACK 
        retrieveReqCallBack(this);
    };
    retrieveReq.send();
}

function retrieveReqCallBack(retrieveReq) {
    if (retrieveReq.readyState == 4 /* complete */  )
 {
        if (retrieveReq.status == 200) {
            //Success
            var retrieved = this.parent.JSON.parse(retrieveReq.responseText).d;
// ITERATE THROUGH THE NOTES FOR THIS CASE
            for (var i = 0; i < retrieved.results.length; i++) {
// IF IS AN EMPTY FIELD ADD 'case details:'
                if (Xrm.Page.getAttribute("description").getValue() == null || Xrm.Page.getAttribute("description").getValue() == 'null') {
                    Xrm.Page.getAttribute("description").setValue('Case details:');
                }
                // BOF PARSE DATE
                var date = retrieved.results[i].CreatedOn;
                date = new Date(parseInt(date.replace("/Date(", "").replace(")/", ""), 10));
                // EOF PARSE DATE
                var newtext = "--------------------\r\n" + "Created by: " + retrieved.results[i].CreatedBy.Name + " - " + date + "\r\n" + retrieved.results[i].NoteText + "\r\n--------------------\r\n";
                var text = Xrm.Page.getAttribute("description").getValue() + "\r\n" + newtext;
                Xrm.Page.getAttribute("description").setValue(text);
            }
        }
    }

}
4

2 に答える 2

3

プラグイン内からサーバーからクライアントにコールバックするためのサポートされている方法はありません。また、サポートされていない方法についても認識していません。

この質問は意味がないと思います。プラグインは、ある種のCRUD操作があった場合にのみトリガーされます。GUIによってトリガーされたCRUD操作は、いずれにしてもエンティティの更新になります。javascriptとOdata呼び出しを介して更新を実行できますが、プラグインが終了すると、実行したいjavascriptを実行できます。

于 2013-03-25T03:17:26.687 に答える
2

それを行う(合理的な)方法はありません。

その理由は、プラグインがサーバーサイズで実行されるものであるという事実です。GUIがあるとは限りません。(もちろん、存在することはわかっていますが、一般的に、サーバーサイズのコードはGUIと直接対話できません)。

JavaScriptはクライアント側のコードであり、クライアントはサーバーを想定しています。これが(大まかに)JSがプラグインを呼び出すことができる理由です(私はそのようにはしませんが)が、その逆はできません。

私はそのような操作を必要としたことがないので、あなたの仕事が何であるかについて興味があります。あなたは純粋で学術的な興味を求めていますか、それともデザインの一部ですか?おそらくあなたの目標を達成するためのより良い方法がありますか?

于 2013-03-25T06:01:56.737 に答える