1

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

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

4

3 回答 3

11

开箱即用的示例

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

<!-- TemplateBeginRepeat name="Components" -->
  <div>@@RenderComponentPresentation()@@</div>
<!-- TemplateEndRepeat -->

这可能是你能得到它的最简单的方法。

在 C# 中拆分

然而,大多数实现很快就会需要一些更现实的东西,并且它们采用两步方法:

  1. 将组件表示拆分为多个数组的 C# TBB
  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);
}

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

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

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

<byline>
  <!-- TemplateBeginRepeat name="SeeAlso" -->
    @@RenderComponentPresentation()@@
  <!-- TemplateEndRepeat -->
</byline>

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

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

DWT 中的过滤

如果您不想编写任何 C# TBB,您也可以在 DWT 中使用TemplateBeginIf's完成相同的操作

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

尽管这工作得很好,但它确实会导致 DWT 中有更多的逻辑。如果这是您希望采用的方法,那么 Tridion 可以使用模板语言,使这种布局和逻辑的组合更加自然,例如Razor Mediator(Ram S 也提到过)和XSLT Mediator

于 2012-08-24T12:55:39.497 回答
4

如果您使用 Razor,下面的链接可能会有用

http://blog.building-blocks.com/razor-templating-sdl-tridion-2011

于 2012-08-24T11:00:22.880 回答
3

如何在页面上输出组件表示内容的高级概念对于复合模板和老式 VBScript 模板非常相似。

一种方法是使用 .NET 编写一个 TBB,它获取页面上的所有组件表示 (CP),并将它们分组到不同的组件表示集合中,然后可以通过使用每个页面区域的 DWT 页面布局对其进行迭代.

您编写的用于对 CP 进行分组的 TBB 可以使用您想要定义组的任何标准。就我个人而言,我使用组件模板 (CT) 上的元数据来为某些页面区域标记它们,但您同样可以使用 CT 或模式名称,或组件中的其他值,或存储组件的文件夹上的元数据。

于 2012-08-24T12:31:20.797 回答