SDL Tridion 2011: динамически заполнять или добавлять поле метаданных, используя C# TBB
Можно ли динамически устанавливать значение поля метаданных из 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));
}
Однако ни один из этих методов не работает. Это невозможно?
3 ответа
Самый простой подход - создать шаблонный класс, который реализует DD4T.Templates.Base.BasePageTemplate. В этом классе вы реализуете метод TransformPage, который принимает страницу DD4T в качестве аргумента. Вы можете получить доступ к странице TCM, используя метод GetTcmPage().
Пример:
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 имеет служебный класс FieldsBuilder
с AddFields
метод, в котором вы можете ввести дополнительные метаданные. DD4T имеет TBB, который обновляет метаданные компонента из метаданных папки, и он называется InheritMetadataComponent
,
Вы можете взглянуть на это здесь и реализовать то же самое:
FieldsBuilder.AddFields(component.MetadataFields, tcmFields, 1, false, mergeAction, Manager);
page.MetadataFields.Add(name, field);
должно работать, если ваш шаблон расширяет DD4T.Templates.Base.BasePageTemplate
Вы также можете взглянуть на источник Add inherited metadata to page
TBB в DD4T, который также показывает способ добавления метаданных, которые публикуются в брокере.