2012-11-02 7 views
7

È possibile impostare il valore di un campo di metadati dinamicamente da un TBB? Oppure è possibile aggiungere dinamicamente un campo di metadati che non esiste necessariamente su uno schema da un TBB?SDL Tridion 2011: riempire o aggiungere dinamicamente un campo di metadati utilizzando un C# TBB

Il motivo per cui voglio farlo è che sto usando DD4T e voglio che il breadcrumb venga aggiunto automaticamente nel file xml DD4T.

Ho provato quanto segue:

public override void Transform(Engine engine, Package package) 
    { 
     Initialize(engine,package); 

     var page = GetPage(); 

     string output = page.OrganizationalItem.Title; 

     var parent = page.OrganizationalItem as StructureGroup; 
     while (parent != null) 
     { 
      output = GetLinkToStructureGroupIndexPage(parent) + Separator + output; 
      parent = parent.OrganizationalItem as StructureGroup; 
     } 

     // I tried this to dynamically add the field 
     //var metadata = page.Metadata.OwnerDocument.CreateElement("breadcrumb"); 
     //metadata.InnerText = output; 
     //page.Metadata.AppendChild(metadata); 

     //I tried this to dynamically set an existing field on the schema 
     foreach (XmlNode xml in page.Metadata) 
     { 
      Log.Debug("Metadata field:" +xml.Name); 
      if(xml.Name == "breadcrumb") 
      { 
       xml.InnerText = output;  
      } 
     } 

     package.PushItem(Package.PageName, package.CreateTridionItem(ContentType.Page, page)); 
    } 

Tuttavia, nessuno di questi metodi sembrano funzionare. È impossibile?

+1

Credo che dipende da come DD4T legge i dati. Se stanno leggendo la pagina/componente dal pacchetto, allora dovrebbe funzionare. Se in realtà lo stanno caricando dal motore, ignorerà qualsiasi modifica apportata all'oggetto pacchetto. –

+0

Buon punto Nuno. Guarderò la fonte di template DD4T per investigare. (Probabilmente hai notato che questo codice si basa sul tuo post sul blog: http://nunolinhares.blogspot.fr/2012/01/its-little-things-creating-page.html, grazie per questo) –

risposta

3

L'approccio più semplice è creare una classe template che implementa DD4T.Templates.Base.BasePageTemplate. In questa classe, si implementa il metodo TransformPage, che accetta la pagina DD4T come argomento. Puoi accedere alla 'pagina TCM' utilizzando il metodo GetTcmPage().

Esempio:

using TCM = Tridion.ContentManager.CommunicationManagement; 
    using Dynamic = DD4T.ContentModel; 

    public class MyTemplate : BasePageTemplate 
    { 
     protected override void TransformPage(Dynamic.Page page) 
     { 
      TCM.Page tcmPage = GetTcmPage(); 
      string breadCrumbs = GetBreadCrumbs (tcmPage); // TODO: implement GetBreadCrumbs 
      Field f = new Field(); 
      f.Name = "breadCrumbs"; 
      f.FieldType = FieldType.Text; 
      f.Values.Add(breadCrumbs); 
      page.MetadataFields.Add("breadCrumbs", f); 
     } 
    } 
5

DD4T ha classe di utilità FieldsBuilder con il metodo AddFields in cui è possibile inserire ulteriori metadati. DD4T ha un TBB che aggiorna i metadati dei componenti dai metadati delle cartelle e si chiama InheritMetadataComponent.

Si potrebbe dare un'occhiata a questo qui e si potrebbe implementare la stessa:

http://code.google.com/p/dynamic-delivery-4-tridion/source/browse/trunk/dotnet/DD4T.Templates/InheritMetadataComponent.cs

FieldsBuilder.AddFields(component.MetadataFields, tcmFields, 1, false, mergeAction, Manager);

3

page.MetadataFields.Add(name, field); dovrebbe funzionare se il vostro modello estende la DD4T.Templates.Base.BasePageTemplate

Si può anche prendere uno sguardo alla fonte della TBB Add inherited metadata to page in DD4T, che mostra anche un modo di aggiungere metadati che viene pubblicato per il broker.

Problemi correlati