2014-09-05 17 views
6

sto costruendo un'applicazione angolare che è in esecuzione come una risorsa web su Dynamics 2013.Dynamics 2013 Accesso Pagina entità è difficile da accedere con vista iframe basato

l'applicazione viene eseguita mediante un pulsante, che si aggiunge alla commandContainer utilizzando banco di lavoro del nastro che poi quel bottone chiama un Xrm.Internal.openDialog

Tutto questo funziona bene fino a quando ho voglia di iniziare a utilizzare le entità esposte da Xrm.Page.Data

Fondamentalmente le mie corse pulsante nel contesto della pagina principale delle dinamiche tuttavia le entità sono dentro un iframe che ha base sulla pagina in cui mi trovo ha un ID e un nome diversi.

Quindi, utilizzando un semplice selettore non riesco a ottenere il suo contenuto Finestra e iniziare a utilizzare le Entità.

#crmContentPanel ha sempre pochi iframe in esso a partire da # contentIFrame0 a #contentIFrame (n) e non posso mai sapere quale iframe è quello con Entità in esso.

Qual è la migliore pratica, flusso di lavoro associato con lo sviluppo di applicazioni in questo ambiente? Come posso accedere facilmente e in modo affidabile al frame corretto che contiene le entità della pagina principale e lavorare con loro.

Forse lo script si trova nella posizione sbagliata e deve essere immesso nell'area del contenuto principale in modo che abbia accesso diretto al Xrm corretto? Come posso ottenerlo?

Inoltre, una volta che riesco ad accedere a questi dati, come posso passare facilmente questi dati alla mia applicazione angolare che viene eseguita nella finestra di dialogo come dalla documentazione che ho letto che la finestra di dialogo è consentita solo 1 stringa di query param e deve si chiamano dati. Non sarebbe sufficiente che la mia applicazione inizi a utilizzare $routeParams. E non penso che l'uso di archiviazione locale o di sessione sia una buona pratica. Qual è l'approccio corretto in questa situazione. Codice

Campione del mio script pulsante:

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

Qualche dettaglio in più

Quando digito quanto segue nella console posso volte (in modo casuale) leggere il titolo del modulo:

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

Ma lo stesso codice dalla funzione di risorsa Web associata non può accedere all'iframe e agli errori:

Can not Cannot read property 'contentWindow' of undefined. 

Perché l'iframe non è accessibile tramite lo script di risorsa e in che modo è possibile accedere al contesto e al titolo/id corretto.

+1

Non è possibile accedere alle entità CRM tramite XRM. Quando scrivi JavaScript su un modulo stesso, usi 'Xrm.Page.Data' per manipolare i dati sul modulo per quell'entità. Il tuo Webresource deve utilizzare l'id che stai trasmettendo per caricare i dati necessari (di solito fatto tramite OData) e procedere da lì. – Nicknow

+0

Ciao Nick, grazie, ma lo stesso problema sta nel recuperare l'ID da Xrm mentre lo script viene eseguito nel contesto della pagina principale, ma l'Xrm con le informazioni di identificazione del modulo si trova all'interno di un altro iframe senza id fissa nelle pagine in dinamica. Come ottengo l'id in modo coerente? – XGreen

risposta

3

L'ID del record può essere inviato a runSendSender come parametro dal nastro stesso. Basta aggiungere l'appropriato CrmParameter (MSDN) alla chiamata di funzione.

Nel tuo caso, il valore del parametro sarebbe FirstPrimaryItemId ("Fornisce un identificatore GUID come una stringa per il record visualizzato.")

Dopo di che, avrete la vostra funzione ha cambiato come questo

function runSendSender(recordId) { ... } 

Inoltre, stare fuori dagli interni: per aprire una risorsa Web in una finestra di dialogo, è necessario utilizzare the supported way (il collegamento fornisce informazioni sulla trasmissione di parametri diversi da data alla risorsa).

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

Sono di solito compreso seguente file JavaScript per l'intestazione della WebResource personalizzato che devono avere un accesso al CRM specifiche azioni/informazioni:

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

Questo dà accesso ad alcune informazioni specifiche nessuno-entità come ad esempio Xrm.Page.context.getServerUrl() o Xrm.Page.context.getUserId().

Ma se si è aggiunto strato con il proprio iFrame in cima alla pagina di entità standard, è sicuramente possibile accedere alle informazioni sotto il vostro contesto corrente utilizzando seguente costruzione:

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

Nota il prefisso window.parent.