I'm trying access the Xrm.Page.data object from within an HTML web resource that I have inserted onto a form in CRM 2011. However, depending on how I try to access the Xrm entity, I find that it is undefined or that Xrm.Page.data is null. The code for the web resource is as follows:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html>
<head>
<script type="text/javascript">
function OpenMyApp(e){
alert('Xrm defined: ' + (typeof Xrm != 'undefined'));
// The line above returns the string 'Xrm defined: false'
alert('window.top.opener.parent.Xrm defined: ' + (typeof window.top.opener.parent.Xrm != 'undefined'));
// The line above returns the string 'window.top.opener.parent.Xrm defined: true'
alert('frames[0].Xrm defined: ' + (typeof frames[0].Xrm != 'undefined'));
// the line above will actually throw an error and stop the script, because the frames collection is empty.
alert(window.top.opener.parent.Xrm.Page.data);
// the line above returns null.
// var myId = Xrm.Page.data.entity.attributes.get("new_field_i_want").getValue();
// The line above is what I would like to see work.
e.preventDefault();
}
</script>
</head>
<body>
<a onClick="OpenMyApp(event);" href="#">My Link</a>
</body>
</html>
I've accessed Xrm.Page.data successfully from within a JavaScript function that is part of a library that fires upon a form event (for instance, Form.Load). It's just when it's embedded in an HTML web resource on the form that I run into this problem. Can anyone explain what I'm doing wrong, and if there is actually a way to access Xrm.Page.data in that way that I would like to do?
Thank you.
Page is deprecated, parent. Xrm. Page will continue to work in case of HTML web resources embedded in forms as this is the only way to access the form context from the HTML web resource. Allows access to the global context without going through the form context.
The Client API form context (formContext) provides a reference to the form or to an item on the form, such as, a quick view control or a row in an editable grid, against which the current code is executed. Earlier, the global Xrm. Page object was used to represent a form or an item on the form.
Try to access Xrm using following syntax:
window.parent.Xrm.Page.getAttribute()...
window.parent.Xrm.Page.getControl()...
window.parent.Xrm.Page.context...
like
alert(window.parent.Xrm.Page.data.entity.attributes.get("new_field_i_want").getValue());
From your sample code.
This works for when you have a web resource that is loaded within an iframe/dialog. It gets access to the parent frame, then looks for all available frames, and checks which frame has
Xrm.Page.data != null
Code...
$.each(parent.window.frames, function(i,val){
if (parent.window.frames[i].Xrm.Page.data != null) {
parent.window.frames[i].Xrm.Page.data.entity.attributes.get('ownerid').setValue([{ id: '{' + sourceKey + '}', name: name, entityType: "systemuser" }]);
parent.window.frames[i].Xrm.Page.data.entity.save();
break;
}
});
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With