2012-04-21 5 views
6

Sto lavorando su TBB Dreamweaver in SDL Tridion 2011 SP1.Recupero dei valori di un componente collegato in Dreamweaver TBB - e renderlo SiteEditable

Non sono a conoscenza della gestione dei collegamenti dei componenti in TBB Dreamweaver.

Il mio nome componente è "A" che ha un collegamento con un altro componente "B".

Componente Una fonte ha questo aspetto:

<Content xmlns="Some UUID"> 
    <Name xlink:type="simple" xlink:href="tcm:184-1897" 
      xmlns:xlink="http://www.w3.org/1999/xlink" xlink:title="B"></Name> 
</Content> 

Componente B di origine è:

<Content xmlns="Some other UUID"> 
    <first>first field</first> 
    <second>second field</second> 
</Content> 

voglio scrivere un DWT TBB che possono accedere ai campi nella componente legata B da Component A

Desidero utilizzare il metodo di rendering RenderComponentField.

Devo aggiungere qualche estensione, potrò applicare SiteEdit su di esso.

Si prega di condividere le vostre opinioni su di esso.

Grazie.

risposta

6

Ci sono due questioni separate in questo argomento:

  1. Come accedere ai campi da un componente collegato in DWT?
  2. Come rendere i campi da un componente collegato modificabili in SiteEdit 2009?

Questa è la risposta alla domanda 1. Mi impegno a fornire una risposta separata per la domanda 2.

Nel gestione predefinita di Tridion di espressioni nei modelli DWT si ha accesso solo ai campi di componenti che sono nel pacchetto.Quindi, se vuoi accedere ai campi del componente B, dovrai scrivere un TBB C# che spinge quel componente nel pacchetto.

Un campione C# frammento:

var componentA = (Component) engine.GetObject(package.GetValue("Component.ID")); 
var fieldsA = new ItemFields(componentA.Content, componentA.Schema); 
var linkField = (ComponentLinkField) fieldsA["Name"]; 
var componentB = linkField.Value; 
var itemB = package.CreateTridionItem(ContentType.Component, componentB); 
package.PushItem("ComponentB", itemB); 

Se si mette questo in un C# frammento TBB e cadere nella tua CT prima del DWT, è possibile farlo nel vostro DWT:

@@[email protected]@ 

In alternativa è possibile utilizzare Nuno di Dreamweaver Get eXtension (DGX) di accedere a tali campi senza scrivere una TBB:

@@Get("Fields.Name.first")@@"/> 

L'unico svantaggio di usare il DGX è che dovrai installarlo su ogni server Tridion. Dopodiché, è disponibile un mucchio di funzionalità estese nei tuoi DWT.

+0

Grazie mille per informazioni – Patan

-2

Non è possibile leggere i campi da B utilizzando i modelli standard di Dreamweaver. Dovrai scrivere un TBB C# per estrarre il componente collegato e inserirlo nel pacchetto come tipo Componente. È quindi possibile utilizzare la sintassi DWT per leggere i campi da quel componente. Ad esempio: @@ linkedComponent.Fields.first @@

Siteedit è problematico su questa e diverse versioni utilizzano diverse sintassi e funzionalità. Ho paura con l'ultima versione non è possibile modificare tali campi ...

+1

SiteEdit 2009 SP2 (e versioni successive) PU edit modificare i campi sotto forma di componenti collegati purché vengano contrassegnati correttamente. Fornirò un esempio in una risposta separata. –

2

Se si utilizza SiteEdit 2009 è possibile, solo un po 'più difficile di quello che sarebbe con i campi dei componenti principali. SiteEdit funziona avvolgendo i campi del contenuto con markup JSON. Non c'è motivo per cui non è possibile rilevare se l'obiettivo di pubblicazione è in fase di staging e scrivere da solo questo JSON.

In alternativa, Will Price ha sviluppato alcuni blocchi di costruzione del modello per aiutare con SiteEdit che sono disponibili here.

Questi sono accompagnati da una guida here, in particolare la sezione su embedded components sarà utile.

5

L'inclusione dei campi di un componente collegato può essere modificata in SiteEdit 2009 SP2. Il front-end di SiteEdit funziona in base allo SiteEdit command language incorporato nel codice HTML che viene restituito dal server di gestione temporanea.

Quindi diciamo che si dispone di un singolo componente in là:

<div class="cp"> 
    <!-- Start SiteEdit Component Presentation: {"ID" : "cp_1", 
     "ComponentID" : "tcm:12-549", "ComponentTemplateID" : "tcm:12-568-32", 
     "ComponentVersion" : 5, "IsQueryBased" : false } --> 
    <label>Title: </label> 
    <span> 
     <!-- Start SiteEdit Component Field: {"ID": "cf_1", 
      "XPath": "tcm:Content/custom:Content/custom:Title", 
      "IsMultiValued":false} --> 
     Tips for getting insurance when you have a pre-existing condition 
    </span> 
</div> 

Quei Start SiteEdit commenti in ci sono comandi che il codice HTML dà a SiteEdit e si può vedere come segnano la Presentazione dei componenti e il campo del titolo.

Se si esegue il rendering campi di una componente legata, è necessario avere anche un corrispondente comando di presentazione dei componenti in questo modo:

<div class="cp"> 
    <!-- Start SiteEdit Component Presentation: {"ID" : "cp_1", 
     "ComponentID": "tcm:12-54", "ComponentTemplateID": "tcm:12-56-32", 
     "ComponentVersion" : 5, "IsQueryBased" : false } --> 
    <label>Title: </label> 
    <span> 
     <!-- Start SiteEdit Component Field: {"ID": "cf_1", 
      "XPath": "tcm:Content/custom:Content/custom:Title", 
      "IsMultiValued":false} --> 
     Tips for getting insurance when you have a pre-existing condition 
    </span> 
    <br /> 
    <div class="cp"> 
     <!-- Start SiteEdit Component Presentation: {"ID" : "cp_2", 
      "ComponentID": "tcm:12-85", "ComponentTemplateID": "tcm:12-60-32", 
      "ComponentVersion" : 2, "IsQueryBased" : true } --> 
     <label>Byline: </label> 
     <span> 
      <!-- Start SiteEdit Component Field: {"ID": "cf_2", 
       "XPath": "tcm:Metadata/custom:Metadata/custom:ByLine", 
       "IsMultiValued":false} --> 
      "It's a huge problem, because ..." says one expert. 
     </span> 
     <br /> 
     <label>Copyright: </label> 
     <span> 
      <!-- Start SiteEdit Component Field: {"ID": "cf_3", 
       "XPath": "tcm:Metadata/custom:Metadata/custom:Copyright", 
       "IsMultiValued":false} --> 
      Getty Images 
     </span> 
    </div> 
</div> 

L'ora ci sono due Start SiteEdit Component Presentation comandi, uno per il componente esterno e uno per il componente collegato. Una cosa importante da notare qui è che la proprietà IsQueryBased della Presentazione del componente nidificata deve essere impostata su true. Questo dice al frontend di SiteEdit che la Presentazione del componente non dovrebbe essere presente nell'XML della pagina che recupera da Tridion.

Per il frontend di SiteEdit non importa come i comandi vengono inseriti nell'HTML.

Più comune è per le persone chiamare RenderComponentPresentation e RenderComponentField, che indica le parti corrispondenti. Ma purtroppo la funzione RenderComponentField può essere utilizzata solo per rendere i campi dalla cosiddetta "contesto Componente", che sembra in questo modo:

Item component = _package.GetByType(ContentType.Component); 

Questo significa che in un unico DWT tutte le chiamate al RenderComponentField lavoreranno lo stesso contesto Componente. Quindi non è mai possibile chiamare RenderComponentField in un singolo DWT per eseguire il rendering di campi da due componenti diversi.

Hai due opzioni per risolvere questo:

  1. chiamata RenderComponentPresentation per la componente legata
  2. rendere il Start SiteEdit Component Presentation e Start SiteEdit Component Field comandi se stessi nella DWT

opzione 1 è il più pulito di separazione si può ottenere: dal momento che si stanno eseguendo il rendering di campi da un altro componente, si esegue essenzialmente il rendering di un'altra presentazione del componente. Se si divide il layout per i campi collegati in una DWT separata e costruire una TAC in giro che, è possibile rendere in questo modo nella tua DWT principale:

@@RenderComponentPresentation(Component.Fields.Name, "tcm:1-2-32")@@ 

Walter spiegato meglio nel suo article on Tridion templating:

Poiché lo scopo di questo modello di Dreamweaver è limitato alla visualizzazione dei campi del componente corrente, è necessario un ulteriore passaggio utilizzando la funzione RenderComponentPresentation. È necessario passare l'URI TCM del componente multimediale a questa funzione, insieme all'URI TCM di un altro modello di Dreamweaver.

Anche se non portano a più TA e modelli Web dinamici, quei modelli Web dinamici sarà molto più semplice in quanto è ora possibile utilizzare RenderComponentField in loro come al solito.

L'opzione 2 significa solo che stai trasmettendo i commenti HTML con i comandi SiteEdit nel tuo DWT. Poiché lo standard command language è documentato come parte dell'API (vedi link sopra) ci sono poche probabilità che cambierà nelle future versioni di SiteEdit 2009.

Scusate per la lunga storia, vi è capitato di attivare un caso d'uso complicato qui . Spero che abbia senso.

+0

Grandi informazioni .. Molto utile. – Patan

+0

Frank, hai menzionato "il cosiddetto componente di contesto", era una sua definizione: _package.GetByType (ContentType.Component); ? In altre parole: è l'elemento del pacchetto più in alto del tipo Componente chiamato "componente del contesto"? (..e come risultato è soggetto al comportamento menzionato) – esteewhy

+0

Il nome "componente del contesto" è solo qualcosa che ho usato qui per rendere chiaro il comportamento. Non è un termine che SDL ha codificato ovunque per indicare specificamente ciò che ho usato qui. –

Problemi correlati