【问题标题】:What are the best practices in compound templating?复合模板的最佳实践是什么?
【发布时间】:2012-08-19 20:24:19
【问题描述】:

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

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

【问题讨论】:

  • 请更详细地解释您要做什么。您使用的是 DWT、C# 还是 XSLT 等。请分享您尝试过或想要替换的任何代码。
  • 我们正在从 Tridion 5.3 升级到 2011 SP1。在 Tridion 5.3 中,我们所有的 CT 和 PT 都在 VBScript 中,现在我们正在将它们转换为复合模板。(同时使用 .NET 程序集和 DWT 代码)简而言之,我们必须进行新的复合模板设置。我们想知道在模块化模板中这样做的有效方法是什么。例如:我们可以将元数据模式附加到每个 CT,其中包含 CT 将在页面上显示的部分,并相应地将其写在 PT 中。我们想知道更多这样的方式。
  • 您显然已经非常了解您想要完成的工作以及您想要如何完成它。将该部分作为元数据中的一个字段听起来是一种很好的方法。那么您对此有何疑问?
  • 与其将部分作为元数据字段,我建议最好利用复合模板的优势,并创建多个具有相同模板构建块实现但名称不同的组件模板在页面中表明他们的目的。当内容编辑者查看页面中的组件表示时,这对内容编辑器来说更加透明。换句话说,指定 CP 的位置是页面合成活动的一部分,而不是创建 CT 的一部分。要更改位置,您应该更改页面,而不是组件模板。

标签: tridion tridion-2011


【解决方案1】:

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

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

【讨论】:

  • 嗨 Ram,谢谢,但我们目前没有使用 Razor 模板。
  • 如果您能提供更多关于您使用的语言/方法的详细信息,那就太好了。网页布局设计的行/列方法也在实践中。您可以在下面的链接tridiondeveloper.com/creating-column-layouts-using-sdl-tridion 中获得简要介绍
  • Razor 引擎从 VBScript 升级比使用 DWT 更容易。它是 ASP.NET MVC 中包含的标准视图引擎,易于查找代码示例,并且 Tridion Razxor Mediaotr 构建在官方 Microsoft Razor 引擎之上。我强烈建议安装它并试一试 1-2 天。这将有足够的时间移植您的 CT、PT 和 TBB 的 1。从谷歌代码检查文档和维基。
【解决方案2】:

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

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

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

【讨论】:

    【解决方案3】:

    开箱即用示例

    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,您也可以使用 TemplateBeginIf's 在 DWT 中完成相同的操作

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-06-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多