首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >SDL Tridion 2011:使用C# TBB动态填充或添加元数据字段

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

Stack Overflow用户
提问于 2012-11-03 00:25:56
回答 3查看 1.2K关注 0票数 7

是否可以从TBB动态设置元数据字段的值?或者,是否可以动态添加一个元数据字段,该字段不一定存在于来自TBB的模式中?

我之所以要这样做,是因为我使用的是DD4T,并且我希望将面包屑自动添加到DD4T xml中。

我尝试过以下几种方法:

代码语言:javascript
复制
    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));
    }

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

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2012-11-04 06:21:57

最简单的方法是创建一个实现DD4T.Templates.Base.BasePageTemplate的模板类。在该类中,您将实现方法TransformPage,该方法接受一个DD4T页面作为其参数。您可以使用GetTcmPage()方法访问“中医药页面”。

示例:

代码语言:javascript
复制
    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);
       }
    }
票数 3
EN

Stack Overflow用户

发布于 2012-11-03 00:43:06

DD4T具有带有AddFields方法的实用程序类FieldsBuilder,您可以在其中注入其他元数据。DD4T有一个名为InheritMetadataComponent的TBB,它可以从文件夹元数据更新组件元数据。

你可以在这里看一看,你可以实现相同的:

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

票数 5
EN

Stack Overflow用户

发布于 2012-11-03 00:49:18

如果您的模板扩展了DD4T.Templates.Base.BasePageTemplate,则page.MetadataFields.Add(name, field);应该可以工作

您还可以在DD4T中查看Add inherited metadata to page TBB的源代码,它还显示了一种添加元数据的方法,这些元数据将发布到代理。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13199288

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档