2013-03-25 77 views
2

如何使用CRM2011中的插件從適當的web資源運行JavaScript函數。crm2011插件調用js函數

我在因特網上找不到任何信息。大多數資源描述瞭如何從JS觸發插件,但不是相反的。

這裏是JS代碼taht複製筆記到說明字段。 單擊保存時。您可以看到數據正確顯示在說明字段中。但是,如果按保存並關閉並再次打開表單,說明字段將爲空。 我認爲這是因爲JS在安全事件後執行,但後來的測試表明它是錯誤的。有人能指出這個JS代碼中的錯誤導致數據沒有保存嗎? 或者給出一個建議如何編寫一個從相關實體中檢索數據並將其寫入表單中的字段的插件。感謝名單

enter image description here

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); 
      } 
     } 
    } 

} 
+0

你想要完成一個插件需要從服務器更新客戶端上的JavaScript? – Daryl 2013-03-25 03:19:09

+0

插件需要運行js web資源中的一個函數。問題是我需要讓這個函數在onSave事件之前運行,我不知道如何,我認爲這是不可能的。我唯一能想到的就是編寫一個可以運行JS腳本的插件。否則,我覺得我必須在插件中複製js函數的行爲。 – Alexey 2013-03-25 03:35:56

+0

爲什麼你的JavaScript不能在窗體的OnSave事件中運行? – Daryl 2013-03-25 03:42:55

回答

3

有從服務器從插件中調用返回給客戶端沒有支持的方法。我也不知道有任何不支持的方式。

我不認爲這個問題更有意義。當某種類型的CRUD操作發生時插件的唯一觸發器。任何由GUI觸發的CRUD操作都將導致實體刷新。你可以通過javascript和Odata調用來執行更新,但是一旦插件完成,你可以運行任何你想運行的JavaScript。

+0

好的。謝謝。這就是爲什麼我找不到任何東西 – Alexey 2013-03-25 03:37:31

2

沒有(合理)的方式來做到這一點。

原因是插件是服務器大小執行的事情。它甚至不能假設有一個GUI。 (當然,我們知道但通常情況下,服務器大小的代碼不能直接與GUI進行交互)。

JavaScript是客戶端代碼,客戶端承擔服務器。這(大致)是爲什麼JS可以調用一個插件(儘管我不會這麼說),但不是相反。

我從來沒有需要這樣的操作,所以我很好奇你的任務是什麼。你是在問純粹的學術興趣還是它是設計的一部分?也許有更好的方法來實現你的目標?

+0

我有一個表格。在這個表格中,我有一個部分,用戶可以添加一個註釋(註釋)。我有一個已經寫好的JS。這個JS的一個功能是將一些參數從筆記複製到這個表單上的另一個字段。我不想接觸這個JS,並且在C#和絕對的新手中,我試圖寫一個觸發JS的插件會更容易,編寫一個插件來訪問實體複製數據並將其插入到不同的地方。這就是爲什麼我問這個解決方案。但現在我看到我必須在插件中做所有事情 – Alexey 2013-03-26 00:34:53

+0

@AlexeyOmelchenko我真的在挖掘你的想法。你和我的同事瑞克德一樣務實,我對這個財產非常尊重。我真的希望能夠做你的建議。可悲的是,我不認爲這是事實。永遠不要低於這些痕跡,因爲這對顧客來說是最便宜的方式。 +1。 – 2013-03-26 00:45:13

+0

另外,請檢查其中一個答覆作爲答案。這不是你想要的答案,但不是那麼少,**是答案。可以推斷,你應該通過@Daryl查看回復,因爲他的回覆時間快了三個小時。達恩德州人! :) – 2013-03-26 00:49:44