2012-05-10 13 views
20

Attualmente sto implementando la funzionalità in Tridion 2009 SP1 in cui l'utente è in grado di utilizzare un filtro che a sua volta interroga il broker per i criteri di corrispondenza e restituisce le presentazioni di componenti alla pagina. Ogni elemento restituito contiene un collegamento componente.Tridion Component Link non risolvente nella presentazione di componenti dinamici

Originariamente i CP dinamici erano archiviati nel DB del broker come frammenti HTML ma si è scoperto che durante l'archiviazione dei CP in questo modo, Tridion eliminerebbe il collegamento del componente dal contenuto e lascerebbe uno spazio vuoto nel codice HTML.

Ho quindi cambiato l'impostazione in modo che i CP dinamici siano ora memorizzati sul filestore come controlli ascx. Quando si utilizza questa impostazione, <tridion:ComponentLink ... /> viene memorizzato correttamente nel file ascx.

Tuttavia, quando vengo a visualizzare i risultati sullo schermo, il collegamento del componente non viene risolto e mi rimane il <tridion:ComponentLink ... /> nella mia origine risultante.

Attualmente, sto utilizzando il metodo GetComponentPresentation per restituire il contenuto del CP che viene poi aggiunto a un elenco prima di essere associato a un ripetitore per la visualizzazione.

codice Riassunti è qui sotto:

ComponentPresentationFactory CPFactory = new ComponentPresentationFactory(); 
List<string> componentPresentations = new List<string>(); 

for (int i = 0; i < tbl.Rows.Count; i++) 
{ 
    ComponentPresentation cp = CPFactory.GetComponentPresentation(
              tbl.Rows[i][0].ToString(), 
              strComponentTemplate.ToString()); 

    if (cp != null) 
    { 
     componentPresentations.Add(cp.Content); 
    } 
} 

Questa lista è il limite al ripetitore nel solito modo:

rptOffer.DataSource = componentPresentations; 
rptOffer.DataBind(); 

Qualcuno sa come posso forzare la componente link da risolvere e perché la funzione GetComponentPresentation non fa questo per me?

C'è qualcosa che dovrei fare in modo diverso o semplicemente non è possibile nel modo in cui sto implementando questo?

Ho confermato che il tagprefix tridion è registrato correttamente nel web.config.

Sono abbastanza nuovo per Tridion quindi qualsiasi aiuto è molto apprezzato!

UPDATE

ho tentato di implementare il suggerimento di Volontà come sembra che la soluzione più appropriata per il mio scenario, ma io sto ricevendo un errore di (abbastanza insipido) quando si tenta di utilizzare il suggerimento di Will con la mia codice qui sotto:

ComponentPresentationAssembler cpa = new ComponentPresentationAssembler("tcm:35-62652-64"); 
string content = cpa.GetContent(tbl.Rows[i][0].ToString(), strComponentTemplate.ToString()); 

in realtà ci sono due errori che si verificano (apparentemente) in modo casuale, ma sempre alla chiamata cpa.GetContent(...). Gli errori sono:

Exception occurred during configuration callback 
OR 
com.tridion.dcp.ComponentPresentationFactory 

Non riesco a capire perché l'errore cambia tra le volte che eseguo il codice. L'errore cambia anche se non vengono apportate modifiche al codice.

Qualcuno sa cosa mi manca qui? Supponevo che sarebbe stato un problema con la connettività allo storage Broker ecc., Ma poi mi sono ricordato che quella parte stava funzionando mentre stavo usando la classe ComponentPresentationFactory.

Se aiuta, il DCP che è memorizzato l'archivio file come ascx contiene il seguente codice HTML:

<div class="content-list-item offer redesign noImage"> 
<h2><span>Mike Offer 01/06 - 10/06 &amp; 20/06 - 10/07</span> Exp May 20th</h2> 
<div class="content-list-item-text"> 
    <p>Body Text</p> 
    <div class="input-btn burgundy"> 
     <tridion:ComponentLink runat="server" PageURI="tcm:0-0-0" ComponentURI="tcm:35-31685" TemplateURI="tcm:0-0-0" AddAnchor="false" LinkText="Button Text&lt;span class=&#34;rm&#34;&gt;: Button Text&lt;/span&gt;" LinkAttributes=" alt=&#34;Button Text&#34; target=&#34;_self&#34; " TextOnFail="true"/>  
    </div> 
     <p>Sub Title</p> 
</div> 
<div class="offers-list">   
    <ul> 
     <li>Offer ends: 20 May 2012</li> 
     <li>Offer available at all hotels</li> 
    </ul> 
</div>       
<div class="back-to-top"> 
    <a href="#content">Back to top</a> 
</div> 

UPDATE 2

Grazie a Ryan, I' Ho scoperto che i miei file DCP (ASCX) non venivano pubblicati all'interno della cartella dell'applicazione all'interno della cartella wwwroot che ha risolto il problema emettendo il tag <tridion:ComponentLink ... /> direttamente all'origine. È ora in fase di rendering, ma il collegamento non è ancora stato risolto. I tag <a ... /> non vengono emessi. È qui che si spera che arriverà l'Assembler, una volta che riuscirò a farlo funzionare.

ho implementato più la registrazione e il controllo e avere più informazioni sull'errore che suggerisce che io possa mancare un file JAR o di avere la versione corretta:

Exception Details: Java.Lang.ClassNotFoundException: com.tridion.dcp.ComponentPresentationFactory 

L'interessante questo è, quando uso la classe ComponentPresentationFactory, funziona (senza risolvere il collegamento interno) ma non appena utilizzo l'Assembler, genera l'errore sopra riportato.

Ho anche tentato di aggiungere la pagina al costruttore come suggerito da Alvin ma l'output è lo stesso.

+0

Ehi Mike, Benvenuti a Tridion. Riesci a nascondere abbastanza bene la tua novità. :-) Scoprirai che molti membri della community di Tridion sono molto utili. Se non lo hai già fatto, ti preghiamo di impegnarti nella nostra proposta Tridion su area51: http://area51.stackexchange.com/proposals/38335/tridion?referrer=lav544jo87qNn9xqeeO2NA2 –

+0

Il problema è con CPFactory - usa invece CPAssembler, come Will mostra nella sua risposta –

+0

Sull'errore .getContent(), ogni possibilità è correlata a più server di presentazione e/o alla presentazione dei componenti che in realtà non viene pubblicata quando si esegue il codice? –

risposta

11

Come discusso già, al fine di risolvere il problema è necessario utilizzare la classe ComponentPresentationAssembler, non la classe ComponentPresentationFactory, ma è necessario assicurarsi che si utilizza la classe ComponentPresentationAssembler all'interno del Tridion.ContentDelivery.WAI namespace:

Tridion.ContentDelivery.WAI.ComponentPresentationAssembler presentationAssembler = new Tridion.ContentDelivery.WAI.ComponentPresentationAssembler("tcm:5-44410-64",this.Page); 
Response.Write(presentationAssembler.GetContent("tcm:5-62700", "tcm:5-62627-32")); 

è inoltre necessario garantire:

  • I file ASCX vengono pubblicate nel file system Questo si trova nel cd_bro file ker_conf.xml all'interno della sezione <Bindings> ad es. <Binding Name="ASPComponentPresentation" Class="com.tridion.broker.componentpresentations.FSASCXComponentPresentationHome"/>

  • I file ASCX sono pubblicati all'interno dell'applicazione Web .Net. Questo è impostato nel file cd_broker_conf.xml all'interno della sezione <Publications> ad es.

    <Publication Id="5" DocumentRoot="C:/Inetpub/wwwroot/website1" DataRoot="C:/Inetpub/wwwroot/website1/dcp"> 
        <Dcp> 
         <Asp Location="C:/Inetpub/wwwroot/website1/dcp"/> 
        </Dcp> 
    </Publication> 
    

essere consapevoli del fatto che le posizioni che vedete sopra sono case sensitive

+0

Cheers Ryan, Ho segnato la risposta di Will come risposta accettata perché aveva ragione con l'uso di ComponentPresentationAssembler ma era molto utile avere l'elenco delle cose necessarie per assicurarsi che tutto fosse a posto lavoro. Saluti! –

+0

In realtà, ripensandoci, penso che la tua risposta sia in realtà la ragione per cui sono riuscito a risolverlo. Si scopre che l'errore che stavo ottenendo riguardo a ClassNotFoundException (vedere Aggiornamento 2) era dovuto al fatto che stavo usando lo spazio dei nomi sbagliato per ComponentPresentationAssembler. Passando allo spazio dei nomi Tridion.ContentDelivery.WAI risolto questo problema e mi ha permesso di ottenere il funzionamento del codice completamente. Mi scuso per aver perso quella parte importante quando si trattava di contrassegnare le risposte corrette. –

+2

A meno che non sbaglio altrimenti, dovrai assicurarti di avere una licenza per usare la funzionalità WAI. Solo un appunto ... Non vorrei che nessuno lo implementasse e poi scopri che non hanno le licenze necessarie per Tridion! –

9

Si sta caricando il contenuto della presentazione del componente dinamico come una stringa anziché eseguire la stringa come ad esempio un controllo utente.

per risolvere il problema è possibile utilizzare 1 di 2 soluzioni:

1) utilizzare un Regex su cp.Content per elaborare i collegamenti tramite l'API Tridion.

2) È possibile pubblicare il contenuto dinamico per il file system come controlli utente e caricare questo controllo sul vostro controllo della pagina/utente, eseguendo così

using (var cpf = new ComponentPresentationFactory(publicationId)) 
{ 
    var cp = cpf.GetComponentPresentation(componentId, componentTemplateId); 
    fileLocation = cp.FileLocation; 
} 

if (!String.IsNullOrEmpty(fileLocation)) 
{ 
    var crtl = this.LoadControl(MapPathReverse(fileLocation)); 
    phldControls.Controls.Add(crtl); 
} 
+1

-1 perché Tridion ha il supporto immediato per farlo con ComponentPresentationAssembler –

+3

Grazie Dominic. Non ero a conoscenza di ComponentPresentationAssembler. Si impara qualcosa di nuovo ogni giorno. –

10

risposta di Marco copre già la parte più importante per la versione di Tridion: è necessario pubblicare i file ASCX su disco in modo che i controlli tridion:CompontentLink siano eseguiti da ASP.NET.

Tridion 2011 ha introdotto REL come soluzione alternativa per questo. Quando si usa REL, si pubblicano nuovamente i frammenti HTML e lo tcdl:ComponentLink verrà memorizzato così come è nel database (quindi non trasformato in tridion:ComponentLink durante la distribuzione). Quindi, quando si recupera il contenuto (tramite il ComponentPresentationTransformer o tramite il nuovo servizio Web OData di Content Delivery), il tcdl:ComponentLink (e altri tag tcdl:*) verrà risolto e si otterrà il risultato desiderato.

18

Per eseguire un DCP, piuttosto che ottenere il contenuto pubblicato, è necessario utilizzare la classe ComponentPresentationAssembler, non la classe ComponentPresentationFactory.

Un semplice esempio di seguito:

ComponentPresentationAssembler cpa = 
    new ComponentPresentationAssembler("tcm:69-6212-64",this.Page); 
Response.Write(cpa.GetContent("tcm:69-2882", "tcm:69-6339-32")); 

Si noti che se si sta pubblicando un sacco (vale a dire centinaia) di presentazioni dei componenti (e la loro pubblicazione frequente), la sua non è una buona idea di utilizzare ascx - si può ottenere alcuni problemi di prestazioni con ASP.Batch NETTO che ricompila la cartella che li contiene tutti o che avvia il riavvio dell'applicazione.

È più sicuro pubblicarli come frammenti (X) HTML nel database e pubblicare i collegamenti come indicato da Mark.

Come menzionato da Frank nel 2011 SP1, è possibile utilizzare REL per eseguire questa operazione di post-elaborazione. Vedere this article per ulteriori informazioni

+0

Roba buona volontà. Vedo che non hai ancora aderito alla nostra proposta per ottenere un'area StackExchange specifica per Tridion. Si prega di seguire questo link e considerarlo: http://area51.stackexchange.com/proposals/38335/tridion?referrer=lav544jo87qNn9xqeeO2NA2 –

+0

Grazie per tali informazioni @Will. Ho tentato di farlo ma ora ricevo un errore quando provo a recuperare il DCP.Ho aggiunto i miei dettagli di errore al post. Qualche idea? –

+0

Ah, la classica spiegazione di CP Assembler vs Factory (con la nuova bontà di REL), bello! @ MikePercival - Sospetto che la differenza negli errori sia stata che hai catturato CP Null nel tuo primo esempio. Se rimuovi il controllo, ricevi lo stesso errore sullo stesso set di ID di componente? –

Problemi correlati