开箱即用示例
Tridion 附带的默认 Dreamweaver 页面设计 (DWT) 呈现组件表示如下:
<!-- TemplateBeginRepeat name="Components" -->
<div>@@RenderComponentPresentation()@@</div>
<!-- TemplateEndRepeat -->
这可能是你能得到它的最简单的方法。
在 C# 中分割
然而,大多数实现很快就会需要一些更现实的东西,并且它们采用两步法:
- 一个将组件表示拆分为多个数组的 C# TBB
- 一个 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,您也可以使用 TemplateBeginIf's 在 DWT 中完成相同的操作
<!-- TemplateBeginRepeat name="Components" -->
<!-- TemplateBeginIf cond="ComponentTemplate.Title=='Promo Content'" -->
@@RenderComponentPresentation()@@
<!-- TemplateEndIf -->
<!-- TemplateEndRepeat -->
虽然这工作得非常好,但它确实会导致您的 DWT 中包含更多逻辑。如果这是您希望采用的方法,那么 Tridion 可以使用模板语言,使这种布局和逻辑的组合更加自然,例如 Razor Mediator(Ram S 也提到过)和 XSLT Mediator。