2012-11-02 22 views
7

Có thể đặt giá trị của trường siêu dữ liệu động từ TBB không? Hoặc là có thể tự động thêm một trường siêu dữ liệu không nhất thiết tồn tại trên một lược đồ từ một TBB?SDL Tridion 2011: Điền động hoặc thêm trường siêu dữ liệu bằng C# TBB

Lý do tôi muốn làm điều này là tôi đang sử dụng DD4T và tôi muốn có đường dẫn tự động được thêm vào DD4T xml.

Tôi đã thử những điều sau đây:

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

Tuy nhiên, không ai trong số những phương pháp này có vẻ làm việc. Điều này là không thể?

+1

Tôi đoán nó phụ thuộc vào cách DD4T đọc dữ liệu. Nếu họ đang đọc trang/thành phần từ gói, thì điều này sẽ có tác dụng. Nếu chúng thực sự đang tải nó từ Engine thì nó sẽ bỏ qua bất kỳ thay đổi nào bạn đã thực hiện đối với đối tượng gói. –

+0

Điểm tốt Nuno. Tôi sẽ xem xét nguồn mẫu DD4T để điều tra. (Bạn có thể nhận thấy mã này dựa trên bài đăng blog của bạn: http://nunolinhares.blogspot.fr/2012/01/its-little-things-creating-page.html, cảm ơn điều đó) –

Trả lời

3

Cách tiếp cận dễ nhất là tạo một lớp mẫu triển khai DD4T.Templates.Base.BasePageTemplate. Trong lớp đó, bạn thực hiện phương thức TransformPage, trong đó có một trang DD4T làm đối số của nó. Bạn có thể truy cập 'trang TCM' bằng phương thức GetTcmPage().

Ví dụ:

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 có lớp tiện ích FieldsBuilder với phương thức AddFields nơi bạn có thể thêm siêu dữ liệu bổ sung. DD4T có một TBB cập nhật siêu dữ liệu thành phần từ Siêu dữ liệu Thư mục và nó được gọi là InheritMetadataComponent.

Bạn có thể mất một cái nhìn lúc này đây và bạn có thể thực hiện giống nhau:

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); nên làm việc nếu mẫu của bạn mở rộng DD4T.Templates.Base.BasePageTemplate

Bạn cũng có thể tận xem mã nguồn của Add inherited metadata to page TBB trong DD4T, cũng hiển thị cách thêm siêu dữ liệu được xuất bản cho nhà môi giới.

Các vấn đề liên quan