Вопрос по tridion – Как обрабатывать вложенные повторяющиеся области в TBB Dreamweaver в SDL Tridion 2011 SP1

7

Я работаю над DWT TBB в SDL Tridion 2011 SP1.

У меня есть встроенное поле "тело" который многозначен. В этом встроенном поле у меня есть еще одно простое текстовое поле «значение», которое снова является многозначным.

Чтобы отобразить «значение» В поле я должен использовать две повторяющиеся петли.

Но я не могу отличить независимость обеих петель.

Я написал следующее.

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

Я не могу сделать поля.

Может ли кто-нибудь помочь, как обрабатывать несколько вложенных областей в DWT TBB.

Спасибо.

Ваша проблема в попытке получить доступ к текущему полю с TemplateRepeatIndex, как говорит Нил. Я напишу минимальный образец в отдельном ответе (поскольку это позволяет мне включать форматирование). Frank van Puffelen

Ваш Ответ

5   ответов
3

вы не можете использовать индекс внешнего цикла внутри внутреннего цикла. Индекс внутреннего цикла будет скрывать индекс внешнего цикла. Следовательно, вам нужен обходной путь. Я могу вспомнить 2, которые я использовал в прошлом:

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")@@

Вам придется написатьSet а такжеIncrement DWT функционирует самостоятельно для сохранения и увеличения значения в пакете.

Для этого не требуется ни пользовательская функция, ни пользовательский TBB. Посмотрите мой ответ и подтвердите его, если вы согласны.
Спасибо Вам за информацию. Можете ли вы помочь мне в написании функций приращения в DWT? Patan
Документация по SDL Live содержит хороший раздел о том, как реализовать пользовательские функции. Также здесь есть пример Николая Руссакова:tridiondeveloper.com/get-and-set-variables-in-dwts
0

without Версия SP1 (как и у нашего клиента), «FieldPath»; переменная не может быть использована, как предложено в предыдущих ответах. Но есть простой способ добиться этого в самом DWT, как показано ниже в примере кода:

    <!-- TemplateBeginRepeat name="Component.body" -->
        <!-- TemplateBeginRepeat name="Field.value" -->
         <div> @@[email protected]@> </div>
        <!-- TemplateEndRepeat -->
    <!-- TemplateEndRepeat -->
15

Страница практики тридионов, на которую ссылался Нейл хорошая ссылка. Но на этой странице показано, как в целом выполнять итерации по всем встроенным полям. В тех случаях, когда вы знаете имя поля, все становится немного проще. В вашем случае это все, что нужно в вашем DWT:

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

Построчно:

Iterate over the values of the body field of your Component Iterate over the values of the value subfield of your body embeddable schema At this stage the FieldPath 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. Example

У меня есть компонент с двумя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>
Debugging these situations

У многих людей возникают проблемы при написании таких конструкций. Я не исключение, я только что обнаружил, что в большинстве случаев я могу работать, зная, что основными переменными являются:Field, FieldPath а такжеTemplateRepeatIndex, Если вы сомневаетесь, просто вставьте этот фрагмент в свой DWT внутри каждогоTemplateBeginRepeat.

([email protected]@[email protected]@, [email protected]@[email protected]@)
Отличный ответ. огромное спасибо Patan
+1 за ваш ответ
5

FieldPath переменная не поможет вам здесь?

УвидетьСайт практики Tridion для примера итерации по многозначным встроенным полям.

Вы правы, Нил, проблема в том, что вы не правильно следовали этому примеру. Я напишу, как это сделать, в отдельном примере.
Я пытался с переменной FieldPath. Но до сих пор нет результата. & lt;! - TemplateBeginRepeat name = & quot; Component.Fields.body & quot; - & gt; aaa & lt;! - TemplateBeginRepeat name = & quot; Component.Fields.body [$ {TemplateRepeatIndex}]. value & quot; - & gt; aa & lt; div & gt; @@ RenderComponentField (FieldPath, TemplateRepeatIndex) @@ & lt; / div & gt; & lt;! - TemplateEndRepeat - & gt; & lt;! - TemplateEndRepeat - & gt; Patan
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 -->
UPDATE 1:

Просто я получил представление об этом. Как насчет этого?

<!-- TemplateBeginRepeat name="Component.Fields.body" -->
    <!-- TemplateBeginRepeat name="value" -->               
            <div>@@[email protected]@</div> 
    <!-- TemplateEndRepeat -->
<!-- TemplateEndRepeat -->

Без использования каких-либоTemplateRepeatIndex

Я получаю сообщение об ошибке, так как функция Push недоступна. Можете ли вы помочь мне в преодолении этой ошибки. Patan
Я думаю, что Push должен быть пользовательской функцией, которую использует Шива. Это не доступно по умолчанию.
@muzimil: я обновил свой ответ. Попробуйте это сейчас
@DaveHoulker: Push - это пользовательская функция.
@ Шива Чаран. Я думаю, что это не позволит нам реализовать функцию редактирования сайта. Поправьте меня если я не прав Patan

Похожие вопросы