7

TBBからメタデータフィールドの値を動的に設定することは可能ですか?または、TBBのスキーマに必ずしも存在しないメタデータフィールドを動的に追加することは可能ですか?

これを実行したい理由は、DD4Tを使用していて、ブレッドクラムをDD4Txmlに自動的に追加したいからです。

私は以下を試しました:

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

ただし、これらの方法はどちらも機能しないようです。これは不可能ですか?

4

3 に答える 3

5

DD4T には、追加のメタデータを挿入できるメソッドFieldsBuilderを持つユーティリティ クラスがあります。AddFieldsDD4T には、フォルダ メタデータからコンポーネント メタデータを更新する TBB があり、それは と呼ばれInheritMetadataComponentます。

ここでこれを見て、同じものを実装することができます:

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

于 2012-11-02T16:43:06.067 に答える
3

page.MetadataFields.Add(name, field);テンプレートがDD4T.Templates.Base.BasePageTemplate

DD4TAdd inherited metadata to pageのTBBのソースを見ることもできます。これは、ブローカーに発行されるメタデータを追加する方法も示しています。

于 2012-11-02T16:49:18.093 に答える
3

最も簡単な方法は、DD4T.Templates.Base.BasePageTemplate を実装するテンプレート クラスを作成することです。そのクラスでは、DD4T ページを引数として取るメソッド TransformPage を実装します。メソッド 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);
       }
    }
于 2012-11-03T22:21:56.793 に答える