SDL Tridion 2011:使用C#TBB动态填充或添加元数据字段

SDL Tridion 2011:使用C#TBB动态填充或添加元数据字段,tridion,dd4t,Tridion,Dd4t,是否可以从TBB动态设置元数据字段的值?或者,是否可以动态添加一个元数据字段,该字段不一定存在于来自TBB的模式上 我之所以要这样做,是因为我使用的是DD4T,我想让面包屑自动添加到DD4T xml中 我尝试了以下方法: public override void Transform(Engine engine, Package package) { Initialize(engine,package); var page = GetPage();

是否可以从TBB动态设置元数据字段的值?或者,是否可以动态添加一个元数据字段,该字段不一定存在于来自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));
    }

然而,这两种方法似乎都不起作用。这是不可能的吗?

DD4T具有实用程序类
FieldsBuilder
AddFields
方法,您可以在其中插入额外的元数据。DD4T有一个TBB,它从文件夹元数据中更新组件元数据,称为
inheriteMetadataComponent

您可以在这里查看一下,并可以实现相同的功能:


FieldsBuilder.AddFields(component.MetadataFields,tcmFields,1,false,mergeAction,Manager)页面.元数据字段.添加(名称,字段)DD4T.Templates.Base.BasePageTemplate


您还可以查看中的
将继承的元数据添加到页面
TBB的源代码,它还显示了添加发布到代理的元数据的方法。

最简单的方法是创建一个实现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);
       }
    }

我想这取决于DD4T如何读取数据。如果他们正在从包中读取页面/组件,那么这应该是有效的。如果他们实际上是从引擎加载的,那么它将忽略您对包对象所做的任何更改。我将研究DD4T模板源代码。(您可能注意到此代码基于您的博客帖子:,谢谢)