2014-09-05 21 views
6

buduję kątową aplikację, która jest uruchomiona jako zasobu sieciowego na dynamikę 2013.Dynamics 2013 podmiotów z dostępem do strony trudno przejść z widokiem iframe oparte

aplikacja działa za pomocą przycisku, który jest dodawany do commandContainer użyciu Workbench wstążka który wtedy przycisk wywołuje Xrm.Internal.openDialog

Wszystko to działa dobrze, dopóki nie chcą rozpocząć korzystanie z podmiotami odsłonięte przez Xrm.Page.Data

Zasadniczo mój przycisk działa w kontekście głównej stronie dynamiki jednak Podmioty są wewnątrz iframe, który opiera na stronie, w której się znajduję, ma inny identyfikator i nazwę.

Używając prostego selektora, nie mogę pobrać jego zawartości i zacząć używać Jednostek.

#crmContentPanel zawsze zawiera kilka elementów pływających zaczynających się od # contentIFrame0 na #contentIFrame (n) i nigdy nie wiadomo, która iframe jest tą z Elementami w niej zawartymi.

Jaka jest najlepsza praktyka, powiązany przepływ pracy z tworzeniem aplikacji w tym środowisku? W jaki sposób mogę łatwo i niezawodnie uzyskać dostęp do właściwej ramki, która zawiera elementy strony głównej i pracować z nimi.

Być może skrypt znajduje się w niewłaściwym miejscu i musi zostać wprowadzony do głównego obszaru zawartości, aby miał bezpośredni dostęp do prawidłowego Xrm? Jak mogę to osiągnąć?

Co więcej, gdy w końcu uda mi się uzyskać dostęp do tych danych, w jaki sposób mogę łatwo przekazać te dane do mojej aplikacji kątowej, która działa w oknie dialogowym, ponieważ z dokumentacji, którą przeczytałem, dialog jest dozwolony tylko w jednym ciągu znaków zapytania i musi nazwać dane. To nie wystarczy, aby moja aplikacja zaczęła używać $routeParams. I nie sądzę, aby korzystanie z pamięci lokalnej lub sesji było przyjemną praktyką. Jakie jest prawidłowe podejście w tej sytuacji. Kod

próbki mojego przycisk skryptu:

function runSendSender() { 

    // Content Iframe Entity data: 
    var contentFrameXrm = $('#crmContentPanel') 
         .find("iframe#contentIFrame0...n")[0] 
         .contentWindow['Xrm']; 

    // even if above selector was consistent across pages 
    // I need to send over much more than this one Id :(
    var data = contentFrameXrm.Page.data.entity.getId(); 

    var src = "/WebResources/concep_/ConcepDynamicsApp/ConcepDynamicsApp.html?data=" + data; 
    var DialogOptions = new Xrm.DialogOptions(); 
    DialogOptions.width = 800; 
    DialogOptions.height = 500; 
    Xrm.Internal.openDialog(src, DialogOptions, null, null, CallbackFunction); 

    function CallbackFunction(returnValue) { } 
} 

trochę bardziej szczegółowo

Kiedy wpisz następujące polecenie w konsoli mogę czasami (losowo) odczytać tytuł formularza:

$('#crmContentPanel').find("iframe#contentIFrame0")[0].contentWindow['Xrm'].Page.ui.get_formTitle(); 

Jednak ten sam kod z powiązanej funkcji zasobu internetowego nie może uzyskać dostępu do elementów iframe i błędów:

Can not Cannot read property 'contentWindow' of undefined. 

Dlaczego element iframe nie jest dostępny za pośrednictwem skryptu zasobów i jak uzyskać dostęp do właściwego kontekstu i formularza tytuł/identyfikator.

+1

Nie masz dostępu do jednostek CRM za pośrednictwem XRM. Kiedy piszesz JavaScript na samym formularzu, używasz 'Xrm.Page.Data' do manipulowania danymi w formularzu dla tego obiektu. Twój Webresource musi użyć identyfikatora, który przekazujesz, aby załadować niezbędne dane (zwykle wykonywane przez OData) i kontynuować od tego miejsca. – Nicknow

+0

Cześć Nick, dziękuję, ale ten sam problem oznacza po prostu pobranie identyfikatora z Xrm, ponieważ skrypt działa w kontekście strony głównej, ale Xrm, który ma informacje o identyfikatorze formularza, znajduje się wewnątrz innego elementu iframe bez stałego identyfikatora na stronach w dynamika. Jak uzyskać spójny identyfikator? – XGreen

Odpowiedz

3

Identyfikator rekordu można wysłać do runSendSender jako parametr przez samą wstążkę. Wystarczy dodać odpowiednie CrmParameter (MSDN) do wywołania funkcji.

W twoim przypadku, wartość parametru będzie FirstPrimaryItemId („Zapewnia jeden identyfikator GUID jako ciąg dla rekordu oglądanym”).

Po tym, będziesz miał swoją funkcję zmienił się ten

function runSendSender(recordId) { ... } 

Trzymaj się z dala od elementów wewnętrznych: aby otworzyć zasób sieciowy w oknie dialogowym, powinieneś użyć the supported way (link zawiera informacje o przekazywaniu parametrów innym niż data do zasobu).

Xrm.Utility.openWebResource(webResourceName,webResourceData,width, height) 
5

Ja zazwyczaj łącznie następujące plik JavaScript w nagłówku niestandardowym WebResource że trzeba mieć dostęp do CRM/actions konkretnej informacji:

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

To daje dostęp do określonych informacji żaden podmiot- , na przykład Xrm.Page.context.getServerUrl() lub Xrm.Page.context.getUserId().

Ale jeśli dodano warstwę z własnym iFrame na górze strony standardowej jednostki, na pewno może uzyskać dostęp do informacji pod aktualnym kontekście stosując następującą budowę:

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

Uwaga prefiks window.parent.