【问题标题】:How to handle nested repeating regions in Dreamweaver TBBs in SDL Tridion 2011 SP1如何在 SDL Tridion 2011 SP1 中处理 Dreamweaver TBB 中的嵌套重复区域
【发布时间】:2012-05-05 18:40:51
【问题描述】:

我正在 SDL Tridion 2011 SP1 中处理 DWT TBB。

我有一个多值的嵌入字段“body”。在这个嵌入字段中,我还有一个简单的文本字段“值”,它又是多值的。

要呈现“值”字段,我必须使用两个重复循环。

但我无法区分两个循环的 Indeces。

我写的如下。

<!-- TemplateBeginRepeat name="Component.Fields.body" -->
    <!-- TemplateBeginRepeat name="Component.Fields.body[${TemplateRepeatIndex}].value" -->
    <div>@@RenderComponentField("Fields.body[${TemplateRepeatIndex}].value", TemplateRepeatIndex)@@ </div>
    <!-- TemplateEndRepeat -->
<!-- TemplateEndRepeat -->

我无法呈现这些字段。

任何人都可以帮助如何处理 DWT TBB 中的多个嵌套区域。

谢谢。

【问题讨论】:

  • 您的问题在于,正如 Neil 所说,您试图使用 TemplateRepeatIndex 访问当前字段。我将在单独的答案中编写一个最小示例(因为它允许我包含格式)。

标签: tridion


【解决方案1】:

Tridion practice page that Neil referred to 是一个很好的参考。但是该页面显示了如何对所有嵌入字段进行通用迭代。如果您知道字段名称,事情会变得容易一些。在您的情况下,这就是您的 DWT 所需的全部内容:

<!-- TemplateBeginRepeat name="body" -->
    <!-- TemplateBeginRepeat name="Field.value" -->
        <div>@@RenderComponentField(FieldPath+".value", 
                                               TemplateRepeatIndex)@@ </div>
    <!-- TemplateEndRepeat -->
<!-- TemplateEndRepeat -->

一行一行:

  1. 迭代组件的body 字段的值
  2. 遍历 body 可嵌入架构的 value 子字段的值
  3. 现阶段FieldPath指的是当前body的值,所以body[0]body[1]等,TemplateRepeatIndex是当前value的索引。所以我们可以利用这些知识构造正确的RenderComponentField 调用。

示例

我有一个包含两个 body 字段的组件,每个字段都有两个 value 字段。所以 XML 是:

<Content xmlns="uuid:8841d68e-7b1b-45cd-a6d6-7e7da5de3ef9">
    <body>
        <value>body1.value1</value>
        <value>body1.value2</value>
    </body>
    <body>
        <value>body2.value1</value>
        <value>body2.value2</value>
    </body>
</Content>

上述 DWT 在该组件上的输出为:

<div><tcdl:ComponentField name="body[0].value"
                          index="0">body1.value1</tcdl:ComponentField></div>
<div><tcdl:ComponentField name="body[0].value" 
                          index="1">body1.value2</tcdl:ComponentField></div>
<div><tcdl:ComponentField name="body[1].value" 
                          index="0">body2.value1</tcdl:ComponentField></div>
<div><tcdl:ComponentField name="body[1].value" 
                          index="1">body2.value2</tcdl:ComponentField></div>

调试这些情况

许多人在编写这样的结构时遇到问题。我也不例外,我刚刚发现,通过知道关键变量是:FieldFieldPathTemplateRepeatIndex,我可以让大多数情况正常工作。如有疑问,只需将此片段嵌入您的 DWT 中的每个 TemplateBeginRepeat

(FieldPath=@@FieldPath@@, TemplateRepeatIndex=@@TemplateRepeatIndex@@)

【讨论】:

  • 优秀的答案。非常感谢
【解决方案2】:

FieldPath 变量在这里对您没有帮助吗?

请参阅Tridion Practice site,了解迭代多值嵌入字段的示例。

【讨论】:

  • 我尝试使用 FieldPath 变量。但还是没有结果。 aaa aa
    @@RenderComponentField (FieldPath, TemplateRepeatIndex)@@
  • 你说得对,尼尔,问题在于没有正确地遵循这个例子。我将在一个单独的示例中写出如何做到这一点。
【解决方案3】:

正如您已经注意到的,您不能在内循环中使用外循环索引。内循环索引将隐藏外循环索引。因此,您需要一种解决方法。我能想到我过去使用的 2 个:

  1. 使用 C# TBB(程序集或片段)生成输出。这不是一个很好的解决方案,但它很实用。您至少可以生成内部循环的输出并将各个值存储在包变量中。然后在外部循环中,您可以简单地迭代这些值并将它们包含在输出中。示例:创建名为body_0body_1 等的变量,然后使用@@body_${TemplateRepeatIndex}@@ 在外循环中输出它们

  2. 使用 Dreamweaver 函数来模拟内部循环索引。你可以有一个函数来Set一个包项变量,一个函数来Increment它。然后在循环中使用这个变量。示例:

<!-- TemplateBeginRepeat name="Component.Fields.body" -->
    @@Set("i", 0)@@
    <!-- TemplateBeginRepeat name="Component.Fields.body[${i}].value" -->
        <div>@@Component.Fields.body[${i}].value[${TemplateRepeatIndex}]</div>
    <!-- TempalteEndRepeat -->
    @@Increment("i")@@

您必须自己编写 SetIncrement DWT 函数来在包中存储和增加值。

【讨论】:

  • 感谢您提供的信息。你能帮我在 DWT 中编写增量函数吗
  • SDL Live 文档很好地介绍了如何实现自定义功能。这里还有一个 Nickoli Roussakov 的例子:tridiondeveloper.com/get-and-set-variables-in-dwts
  • 不需要自定义函数或自定义 TBB 即可完成此操作。如果您同意,请查看我的回答并投票。
【解决方案4】:

试试这个方法:-

<!-- TemplateBeginRepeat name="Component.Fields.body" -->
    @@Push("PrimaryIndex", TemplateRepeatIndex)@@
    <!-- TemplateBeginRepeat name="Component.Fields.body[${PrimaryIndex}].value" -->
            @@Push("SecondaryIndex", TemplateRepeatIndex)@@
            <div>@@RenderComponentField("Fields.body[${PrimaryIndex}].value", ${SecondaryIndex})@@ </div>
    <!-- TemplateEndRepeat -->
<!-- TemplateEndRepeat -->

更新 1:

只是我对此有所了解。这样做怎么样?

<!-- TemplateBeginRepeat name="Component.Fields.body" -->
    <!-- TemplateBeginRepeat name="value" -->               
            <div>@@Field@@</div> 
    <!-- TemplateEndRepeat -->
<!-- TemplateEndRepeat -->

不使用任何TemplateRepeatIndex

【讨论】:

  • 我收到推送功能不可用之类的错误。你能帮我克服这个错误吗?
  • 我认为 Push 必须是 Siva 正在使用的自定义功能。默认情况下不可用。
  • @DaveHoulker:推送是一个自定义功能。
  • @Siva Charan。我认为它不允许我们实现站点编辑功能。如果我错了,请纠正我
  • @Siva:你真的很接近最后一个例子。唯一需要考虑的是内部
    中的 @@RenderComponentField(FieldPath, TemplateRepeatIndex)@@。我将在单独的答案中写出来。
【解决方案5】:

对于那些使用 Tridion 2009 没有 SP1 版本的用户(如我们的客户),不能按照前面的答案中的建议使用“FieldPath”变量。但是有一种简单的方法可以在 DWT 本身中实现这一点,如下面的示例代码所示:

    <!-- TemplateBeginRepeat name="Component.body" -->
        <!-- TemplateBeginRepeat name="Field.value" -->
         <div> @@Field@@> </div>
        <!-- TemplateEndRepeat -->
    <!-- TemplateEndRepeat -->

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多