复合模板的最佳实践是什么?

Hus*_*pes 1 tridion tridion-2011

是否有与复合模板最佳实践相关的链接/博客/文档(适用于Tridion 2011 SP1)?

具体来说,我们想知道如何更有效地在页面模板中编写组件模板,而无需太多的硬编码.

Fra*_*len 11

开箱即用的例子

Tridion附带的默认Dreamweaver页面设计(DWT),呈现如下的组件演示:

<!-- TemplateBeginRepeat name="Components" -->
  <div>@@RenderComponentPresentation()@@</div>
<!-- TemplateEndRepeat -->
Run Code Online (Sandbox Code Playgroud)

这可能是你获得它的最简单方法.

拆分C#

然而,大多数实现很快就会需要更加真实的东西,它们采用两步法:

  1. 一个C#TBB,它将Component Presentations拆分成多个数组
  2. DWT TBB然后依次遍历每个阵列

步骤1中的拆分通常基于组件模板的名称完成.

var page = (Page)engine.GetObject(package.GetByName(Package.PageName));
var lists = new Dictionary<string, List<ComponentPresentation>>();

foreach (comm.ComponentPresentation cp in page.ComponentPresentations)
{
    var ct = cp.ComponentTemplate.Title.Replace(" ", "");
    if (!lists.ContainsKey(ct))
        lists.Add(ct, new List<ComponentPresentation>());
        lists[ct].Add(new ComponentPresentation(cp.Component.Id,
                                                cp.ComponentTemplate.Id));
    }

foreach (string token in lists.Keys)
{
    var item = package.CreateStringItem(ContentType.ComponentArray, 
                               ComponentPresentationList.ToXml(lists[token]));
    package.PushItem(token + "Components", item);
}
Run Code Online (Sandbox Code Playgroud)

上面的C#是Nuno Linhares提供的实现的简化版本

然后DWT依次遍历每个数组,将其放在页面HTML中的正确位置:

<div class='main'>
  <!-- TemplateBeginRepeat name="ArticleSummary" -->
    @@RenderComponentPresentation()@@
  <!-- TemplateEndRepeat -->
</div>

<byline>
  <!-- TemplateBeginRepeat name="SeeAlso" -->
    @@RenderComponentPresentation()@@
  <!-- TemplateEndRepeat -->
</byline>
Run Code Online (Sandbox Code Playgroud)

但是,基于组件模板的元数据字段拆分组件演示文稿的情况可能更为现实.这些分区规则似乎与实施者有时一样多,其中许多同样有效.

Dominic在这里给出了一个很好的实现示例:http://code.google.com/p/tridion-practice/wiki/PartitionComponentPresentations.在他的例子中,有一个简单的描述符语言来确定每个Component Presentation进入哪个分区.

在DWT中过滤

如果你不想编写任何C#TBB,你也可以通过使用TemplateBeginIf's 来完成相同的DWT

<!-- TemplateBeginRepeat name="Components" -->
  <!-- TemplateBeginIf cond="ComponentTemplate.Title=='Promo Content'" -->
    @@RenderComponentPresentation()@@
  <!-- TemplateEndIf -->
<!-- TemplateEndRepeat -->
Run Code Online (Sandbox Code Playgroud)

尽管这种方法非常好,但它确实会导致DWT中存在更多逻辑.如果这是你想要采用的路线,Tridion可以使用模板语言,使布局和逻辑的混合更加自然,例如Razor Mediator(Ram S也提到)和XSLT Mediator.