2012-11-02 5 views
7

TBBからメタデータフィールドの値を動的に設定することはできますか?または、TBBのスキーマに必ずしも存在しないメタデータフィールドを動的に追加することは可能ですか?SDL Tridion 2011:C#TBBを使用してメタデータフィールドを動的に入力または追加する

私はこれをやりたいのですが、私はDD4Tを使用しているので、ブレッドクラムを自動的にDD4T XMLに追加したいのです。

私は次のことを試してみました:

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

はしかし、これらの方法のいずれも動作するようです。これは不可能ですか?

+1

私はそれがDD4Tがデータを読み込む方法によって異なりますね。彼らがパッケージからページ/コンポーネントを読んでいるなら、これはうまくいったはずです。実際にエンジンからロードしている場合、パッケージオブジェクトに加えた変更はすべて無視されます。 –

+0

良い点ヌノ。 DD4Tのテンプレートソースを調べて調査します。 (あなたはおそらくこのコードがあなたのブログの投稿に基づいていることに気づいたでしょう:http://nunolinhares.blogspot.fr/2012/01/its-little-things-creating-page.html、それに感謝します) –

答えて

3

最も簡単な方法は、DD4T.Templates.Base.BasePageTemplateを実装するテンプレートクラスを作成することです。そのクラスでは、TransformPageメソッドを実装します。このメソッドは、DD4Tページを引数として取ります。 GetTcmPage()メソッドを使用して 'TCMページ'にアクセスできます。

例:

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には、追加のメタデータを挿入できるユーティリティFieldsBuilderAddFieldsメソッドがあります。 DD4Tには、フォルダメタデータからコンポーネントメタデータを更新するTBBがあり、InheritMetadataComponentと呼ばれます。あなたがここにこれを見てとることができ、あなたが同じことを実現することができ

:あなたのテンプレートはあなたがも取ることができDD4T.Templates.Base.BasePageTemplate

を拡張する場合

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);は動作するはずです TBBのソースをDD4Tに見ると、メタデータを追加する方法も示されます。ブローカーに公開されます。

関連する問題