7

我正在 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 中的多个嵌套区域。

谢谢你。

4

5 回答 5

15

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

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

逐行:

  1. 迭代body组件字段的值
  2. 迭代可嵌入模式的value子字段的值body
  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>

调试这些情况

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

(FieldPath=@@FieldPath@@, TemplateRepeatIndex=@@TemplateRepeatIndex@@)
于 2012-04-25T19:38:09.610 回答
5

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

有关迭代多值嵌入字段的示例,请参阅Tridion Practice 站点。

于 2012-04-25T07:53:57.160 回答
3

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

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

  2. 使用 Dreamweaver 函数来模拟内部循环索引。您可以为SetPackage 项目变量提供一个函数,并为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")@@

您必须自己编写SetIncrementDWT 函数来存储和增加包中的值。

于 2012-04-25T06:35:28.620 回答
1

试试这种方式: -

<!-- 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

于 2012-04-25T06:25:33.357 回答
0

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

    <!-- TemplateBeginRepeat name="Component.body" -->
        <!-- TemplateBeginRepeat name="Field.value" -->
         <div> @@Field@@> </div>
        <!-- TemplateEndRepeat -->
    <!-- TemplateEndRepeat -->
于 2013-03-20T17:27:56.873 回答