2016-12-02 3 views
3

Я добавил ресурс html в мою контактную форму, содержащую только небольшое изображение, чтобы разместить его рядом с полем контакта. Когда пользователь нажимает на него, он запускает функцию javascript, в которой я хочу получить значение определенного поля формы. Поле является атрибутом контактного объекта. Вот HTML веб Ressource:Dynamics CRM 365 - Не удается получить доступ к Xrm.Page.entity в веб-ресурсе HTML

<html> 
<head> 
    <style type="text/css"> 
     body 
     { 
     margin: 0; 
     padding: 0; 
     } 
    </style> 
    <script type="text/javascript"> 
     function call() { 
      var phoneNumber = window.parent.Xrm.Page.getAttribute("mobilephone").getValue(); 
     } 
    </script> 
<meta> 
</head> 
<body style="word-wrap: break-word;"> 
    <img onmouseover="this.style.cursor='pointer';" src="/webresources/new_/image/image.png" onclick="call()"> 
</body> 
</html> 

Я пытался также получить данные следующим образом:

window.parent.Xrm.Page.data.entity.attributes.get("telephone1").getValue() 

Но это не работает, либо: не могут читать объект пустых

Проблема заключается в том, что getAttribut возвращает null, несмотря на поле объекта, которое я хочу получить. Это всегда undefined У кого-то есть идея?

+0

Что-то не так, оба образца кода, которые вы предоставляете, должны работать нормально. Поместите оператор отладчика в свою функцию вызова, откройте инструменты разработчика в своем браузере и нажмите кнопку вызова. Затем, в инструментах dev, когда вы нажмете на отладчик, проверьте window.parent.location. Является ли значение, которое возвращает то, что вы ожидаете? Также проверьте window.parent.Xrm.Page. Он должен иметь метод getAttribute и свойство данных. Этот тип расследования может выявить некоторую ошибку. Кроме того, возникает ли ошибка во всех браузерах одинаково? – Polshgiant

ответ

1

GetGlobalContext function and ClientGlobalContext.js.aspx (client-side reference)

Используйте функцию GetGlobalContext при программировании с помощью веб-ресурсов , чтобы получить доступ к контекстной информации. Чтобы получить функцию GetGlobalContext на веб-ресурсе HTML, включите ссылку на ClientGlobalContext.js.aspx.

Вы можете использовать функцию GetGlobalContext, когда вы включаете ссылку на страницу ClientGlobalContext.js.aspx, расположенной в корневом каталоге веб- ресурсов.


Пара более предложений:

Webpage (HTML) web resources

Попробуйте сбросив window из window.parent.Xrm.Page.

Веб-ресурс HTML, добавленный в форму, не может использовать глобальные объекты, определенные , библиотекой JavaScript, загруженной в форму. Веб-ресурс HTML может взаимодействовать с объектами Xrm.Page или Xrm.Utility в форме по с использованием parent.Xrm.Page или parent.Xrm.Utility, но глобальные объекты , определенные сценариями форм, не будут доступны используя родителя. Вы загружаете любые библиотеки, которые необходимы веб-ресурсу HTML, в веб-ресурс HTML , поэтому они не зависят от сценариев, загружаемых в форму .

Use IFRAME and web resource controls on a form

Попробуйте передавая сигналы от формы сценария.

Для веб-ресурсов веб-страницы (HTML) используйте метод setSrc для непосредственного управления параметром querystring .

На странице HTML доступ к параметрам можно получить с помощью свойства window.location.search в JavaScript.

Sample: Pass multiple values to a web resource through the data parameter

+0

Большое спасибо за ваш ответ, но у меня есть доступ к Xrm.Page и даже к Xrm.Page.Context, но не к данным отображаемого объекта, такого как контакт ... –

+0

Argh, не заметил этой детали. –

+0

yep ... У вас есть идея? –

0

Если вы не можете принять решение Джеймс Вуд, который отлично попробовать:

1. Вы должны проверить, что ваш товар находится в IFRAME

Вы можете получить на основе приведенного ниже сценария:

Xrm.Page.ui.controls.get('id_iframe').getObject().onload= function() { 
    var element = Xrm.Page.ui.controls.get('id_iframe').getObject().contentWindow.document.getElementById('id_element_inside_iframe'); 
    console.log(element); 
}; 

Xrm.Page.ui.controls.get ('id_iframe'). GetObject(): возвращает объект HTML iFrame

2. У вас может быть событие, называемое проблемой.

Вы можете получить вдохновение от следующего сценария:

<HTML> 
    <BODY onload="SetupEvents()"> 
    <label id="myLabel" >Click me</label> 
    </BODY> 
    <SCRIPT> 
     function DoTheThing() { alert('thing was done'); } 
     function SetupEvents() { 
      addEvent(document.getElementById('myLabel'),'click', function() { DoTheThing(); }); 
     } 

     function addEvent(element, evnt, funct){ 
      if (element.attachEvent) 
      return element.attachEvent('on'+evnt, funct); 
      else 
      return element.addEventListener(evnt, funct, false); 
     } 
</SCRIPT> 
</HTML> 
+1

Веб-ресурс HTML, размещенный на форме, не помещается внутри элементов. Я только что создал веб-ресурс и поместил его в форму. Я сделал то же самое в Microsoft Dynamics 2015 (более конкретно, в Unified Service Desk), и он работает хорошо ... Но на Dynamics 365 не –

+1

Но после проверки DOM, похоже, что исходный код HTML добавлен в iFrame. Попробуем вам решение. –

+0

@HubertSolecki: Я не думаю, что будет иметь значение, разместите ли вы свой веб-ресурс HTML в iFrame или в управлении веб-ресурсами. В Dynamics CRM 2016/365 веб-ресурсы в большинстве случаев загружаются раньше, чем форма, с которой они интегрированы. Поэтому после присоединения функции к событию onload iFrame вам также необходимо установить источник. –

0

Я думаю, что это проблема Turbo Forms, поскольку Turbo Forms загружает Javascript параллельно и нагрузки ClientGlobalContext.js.aspx как один из последних Предметы. IFrames содержат событие OnReadyStateCompleted, я бы предложил добавить следующий код под этим событием.

function call() { 
      var phoneNumber = window.parent.Xrm.Page.getAttribute("mobilephone").getValue(); 
     } 

См рисунок ниже ReadyStateComplete

0

Допустим, что ваш webresource находится в корневом ярлыком ... то вы должны добавить ссылку ClientGlobalContext первый

<script src="ClientGlobalContext.js.aspx" type="text/javascript"></script> 

После этого, что вы должны быть в состоянии чтобы получить значение атрибута с помощью вашей функции, просто снимите первую часть "window"

<script type="text/javascript"> 
    function call() { 
     var phoneNumber = parent.Xrm.Page.getAttribute("mobilephone").getValue(); 
    } 
</script>