I am working on DWT TBB in SDL Tridion 2011 SP1.
I have a embedded field "body" which is multivalued. In this embedded field I have one more simple Text field "value", which is again multivalued.
To render the "value" field I have to use two repeating loops.
But I am unable to differentiate the Indeces of the both loops.
I have written as follows.
<!-- TemplateBeginRepeat name="Component.Fields.body" -->
<!-- TemplateBeginRepeat name="Component.Fields.body[${TemplateRepeatIndex}].value" -->
<div>@@RenderComponentField("Fields.body[${TemplateRepeatIndex}].value", TemplateRepeatIndex)@@ </div>
<!-- TemplateEndRepeat -->
<!-- TemplateEndRepeat -->
I am unable to render the fields.
Can any one help how to handle multiple nested regions in DWT TBB.
Thank you.
The Tridion practice page that Neil referred to is a good reference. But that page shows how to generically iterate over all embedded fields. In cases where you know the field name, things get a bit easier. In you case, this is all that is needed in your DWT:
<!-- TemplateBeginRepeat name="body" -->
<!-- TemplateBeginRepeat name="Field.value" -->
<div>@@RenderComponentField(FieldPath+".value",
TemplateRepeatIndex)@@ </div>
<!-- TemplateEndRepeat -->
<!-- TemplateEndRepeat -->
Line by line:
body
field of your Componentvalue
subfield of your body
embeddable schemaFieldPath
refers to the current body
value, so body[0]
, body[1]
, etc. and TemplateRepeatIndex
is the index of the current value
. So we can construct the correct RenderComponentField
call with this knowledge.I have a Component with two body
fields, each with two value
fields. So the XML is:
<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>
The output from the above DWT on this Component is:
<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>
Many people have problems writing constructs like these. I am no exception, I have just found that I can get most cases working by knowing that the crucial variables are: Field
, FieldPath
and TemplateRepeatIndex
. When in doubt, simply embed this fragment into your DWT inside every TemplateBeginRepeat
.
(FieldPath=@@FieldPath@@, TemplateRepeatIndex=@@TemplateRepeatIndex@@)
Does the FieldPath variable not help you here?
See the Tridion Practice site for an example of iterating over multivalue embedded fields.
As you noticed already, you cannot use the outer loop index inside the inner loop. The inner loop index will hide the outer loop index. Therefore, you need a workaround. I can think of 2 that I used in the past:
Use a C# TBB (either assembly or fragment) to generate the output. This is not a very nice solution, but it is practical. You could at least generate the output of the inner loop and store the individual values in Package variables. Then in the outer loop you can simply iterate over the values and include them in the output. Example: create variables called body_0
, body_1
, etc. Then output them inside the outer loop using @@body_${TemplateRepeatIndex}@@
Use Dreamweaver functions to simulate the inner loop index. You can have a function to Set
a Package item variable, and one to Increment
it. Then use this variable inside the loops. Example:
<!-- 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")@@
You will have to write the Set
and Increment
DWT functions yourself to store and increment a value in the Package.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With