2012-11-02 5 views
7

Kann der Wert eines Metadatenfelds dynamisch von einer TBB aus festgelegt werden? Oder ist es möglich, ein Metadatenfeld dynamisch hinzuzufügen, das nicht unbedingt in einem Schema von einer TBB existiert?SDL Tridion 2011: Dynamisches Füllen oder Hinzufügen eines Metadatenfelds mit einem C# TBB

Der Grund, warum ich das tun möchte, ist, dass ich DD4T benutze und ich möchte, dass der Breadcrumb automatisch in das DD4T XML eingefügt wird.

Ich habe versucht, die folgenden:

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

scheinen jedoch keine dieser Methoden zu arbeiten. Ist das unmöglich?

+1

Ich denke, es hängt davon ab, wie DD4T die Daten liest. Wenn sie die Seite/Komponente aus dem Paket lesen, sollte das funktionieren. Wenn sie es tatsächlich von der Engine laden, ignoriert es alle Änderungen, die Sie am Paketobjekt vorgenommen haben. –

+0

Guter Punkt Nuno. Ich werde die zu untersuchende DD4T-Vorlagenquelle betrachten. (Sie haben wahrscheinlich bemerkt, dass dieser Code auf Ihrem Blog-Beitrag basiert: http://nunolinhares.blogspot.fr/2012/01/its-little-things-creating-page.html, vielen Dank dafür) –

Antwort

3

Der einfachste Ansatz besteht darin, eine Vorlagenklasse zu erstellen, die DD4T.Templates.Base.BasePageTemplate implementiert. In dieser Klasse implementieren Sie die Methode TransformPage, die eine DD4T-Seite als Argument verwendet. Sie können die 'TCM-Seite' mit der Methode GetTcmPage() aufrufen.

Beispiel:

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 verfügt über die Dienstprogrammklasse FieldsBuilder mit der Methode AddFields, in die Sie zusätzliche Metadaten einfügen können. DD4T verfügt über eine TBB, die Komponentenmetadaten aus Ordnermetadaten aktualisiert, und es heißt InheritMetadataComponent.

Sie konnten einen Blick auf diese hier nehmen und man konnte die gleiche implementieren:

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); sollte funktionieren, wenn Sie Ihre Vorlage die Sie DD4T.Templates.Base.BasePageTemplate

erstreckt sich auch nehmen ein Blick auf die Quelle der Add inherited metadata to page TBB in DD4T, die auch eine Möglichkeit zum Hinzufügen von Metadaten zeigt, die wird zum Broker veröffentlicht.

Verwandte Themen