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

时间:2012-08-24 09:23:56

标签: tridion tridion-2011

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

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

3 个答案:

答案 0 :(得分:11)

开箱即用的示例

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

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

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

在C#

中拆分

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

  1. 将组件演示文稿拆分为多个数组的C#TBB
  2. DWT TBB然后依次遍历这些数组中的每一个
  3. 步骤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。在他的例子中,有一个简单的描述符语言来确定每个Component Presentation进入哪个分区。

    在DWT中过滤

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

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

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

答案 1 :(得分:4)

如果你使用下面的Razor链接可能有用

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

答案 2 :(得分:3)

如何在页面上输出组件表示内容的高级概念与复合模板和旧学校VBScript模板非常相似。

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

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