Как обрабатывать вложенные повторяющиеся области в TBB Dreamweaver в SDL Tridion 2011 SP1
Я работаю над DWT TBB в SDL Tridion 2011 SP1.
У меня есть встроенное поле "тело", которое многозначно. В этом встроенном поле у меня есть еще одно простое текстовое поле "значение", которое снова многозначно.
Чтобы отобразить поле "значение", я должен использовать два повторяющихся цикла.
Но я не могу отличить независимость обеих петель.
Я написал следующее.
<!-- TemplateBeginRepeat name="Component.Fields.body" -->
<!-- TemplateBeginRepeat name="Component.Fields.body[${TemplateRepeatIndex}].value" -->
<div>@@RenderComponentField("Fields.body[${TemplateRepeatIndex}].value", TemplateRepeatIndex)@@ </div>
<!-- TemplateEndRepeat -->
<!-- TemplateEndRepeat -->
Я не могу сделать поля.
Может ли кто-нибудь помочь, как обрабатывать несколько вложенных областей в DWT TBB.
Спасибо.
5 ответов
Страница практики Tridion, на которую ссылался Нил, является хорошим справочным материалом. Но на этой странице показано, как в целом выполнять итерации по всем встроенным полям. В тех случаях, когда вы знаете имя поля, все становится немного проще. В вашем случае это все, что нужно в вашем DWT:
<!-- TemplateBeginRepeat name="body" -->
<!-- TemplateBeginRepeat name="Field.value" -->
<div>@@RenderComponentField(FieldPath+".value",
TemplateRepeatIndex)@@ </div>
<!-- TemplateEndRepeat -->
<!-- TemplateEndRepeat -->
Построчно:
- Итерация по значениям
body
поле вашего компонента - Итерация по значениям
value
подполе вашегоbody
встраиваемая схема - На этом этапе
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
, FieldPath
а также TemplateRepeatIndex
, Если вы сомневаетесь, просто вставьте этот фрагмент в свой DWT внутри каждого TemplateBeginRepeat
,
(FieldPath=@@FieldPath@@, TemplateRepeatIndex=@@TemplateRepeatIndex@@)
Переменная FieldPath вам здесь не помогает?
См. Сайт практики Tridion для примера итерации многозначных встроенных полей.
Как вы уже заметили, вы не можете использовать индекс внешнего цикла внутри внутреннего цикла. Индекс внутреннего цикла будет скрывать индекс внешнего цикла. Следовательно, вам нужен обходной путь. Я могу вспомнить 2, которые я использовал в прошлом:
Используйте C# TBB (сборку или фрагмент) для генерации вывода. Это не очень хорошее решение, но оно практично. Вы могли бы по крайней мере сгенерировать выходные данные внутреннего цикла и сохранить отдельные значения в переменных Package. Затем во внешнем цикле вы можете просто перебрать значения и включить их в вывод. Пример: создать переменные с именем
body_0
,body_1
и т. д. Затем выведите их во внешний цикл, используя@@body_${TemplateRepeatIndex}@@
Используйте функции 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")@@
Вам придется написать Set
а также Increment
DWT функционирует самостоятельно для сохранения и увеличения значения в пакете.
Попробуйте так:
<!-- 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
Для тех, кто использует Tridion 2009 без версии SP1 (как наш клиент), переменная 'FieldPath' не может использоваться, как предложено в предыдущих ответах. Но есть простой способ добиться этого в самом DWT, как показано ниже в примере кода:
<!-- TemplateBeginRepeat name="Component.body" -->
<!-- TemplateBeginRepeat name="Field.value" -->
<div> @@Field@@> </div>
<!-- TemplateEndRepeat -->
<!-- TemplateEndRepeat -->