2012-11-02 16 views
7

Czy możliwe jest dynamiczne ustawianie wartości pola metadanych z bloku TBB? Czy możliwe jest dynamiczne dodawanie pola metadanych niekoniecznie istniejącego na schemacie z bloku TBB?SDL Tridion 2011: Dynamiczne wypełnianie lub dodawanie pola metadanych przy użyciu C# TBB

Powodem, dla którego chcę to zrobić, jest to, że używam DD4T i chcę, aby ścieżka nawigacyjna była automatycznie dodawana do xml DD4T.

Próbowałem następujące:

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

Jednak żadna z tych metod wydają się działać. Czy to niemożliwe?

+1

Myślę, że to zależy od tego jak DD4T odczytuje dane. Jeśli czytają stronę/komponent z paczki, powinno to zadziałać. Jeśli faktycznie ładują go z silnika, zignoruje wszelkie zmiany dokonane w obiekcie pakietu. –

+0

Dobry punkt Nuno. Spojrzę na źródło szablonu DD4T, aby zbadać. (Prawdopodobnie zauważyłeś, że ten kod jest oparty na twoim blogu: http://nunolinhares.blogspot.fr/2012/01/its-little-things-creating-page.html, dzięki za to) –

Odpowiedz

3

Najprostszym sposobem jest utworzenie klasy szablonu, która implementuje DD4T.Templates.Base.BasePageTemplate. W tej klasie implementujesz metodę TransformPage, która jako argument przyjmuje stronę DD4T. Możesz uzyskać dostęp do "strony TCM" za pomocą metody GetTcmPage().

Przykład:

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 ma klasę użyteczności FieldsBuilder z metodą AddFields, w której można wprowadzić dodatkowe metadane. DD4T ma TBB, który aktualizuje metadane składników z metadanych folderów i nazywa się InheritMetadataComponent.

Można spojrzeć na to tutaj i można wdrożyć takie same:

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); powinno działać, jeśli szablon rozszerza DD4T.Templates.Base.BasePageTemplate

Można także wziąć Spojrzenie na źródło Add inherited metadata to page TBB w DD4T, które pokazuje również sposób dodawania metadanych, które zostanie opublikowany w brokerze.

Powiązane problemy