如何使用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);
}
}
}
}
答案 0 :(得分:3)
没有受支持的方法从插件中从服务器回调客户端。我也没有意识到任何不受支持的方式。
我认为这个问题甚至没有意义。只有某种类型的CRUD操作时,插件才会触发。由GUI触发的任何CRUD操作都将以任何方式刷新实体。你可以通过javascript和Odata调用来执行更新,但是一旦插件完成,你就可以运行你想要运行的任何javascript。
答案 1 :(得分:2)
没有(合理的)方法可以做到这一点。
原因是插件是服务器大小执行的东西。它甚至不能假设有GUI。 (当然,我们知道通常情况下,服务器大小的代码无法直接与GUI交互。)
JavaScript是客户端代码,客户端假定服务器。这是(粗略地)为什么JS可以调用一个插件(虽然我不会这么说)但不是相反。
我从来不需要这样的操作,所以我很好奇你的任务是什么。您是在问纯粹的学术兴趣还是设计的一部分?也许有更好的方法来实现目标?