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

Я работаю над 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.

Спасибо.

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

Ответы на вопрос(5)

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

    <!-- TemplateBeginRepeat name="Component.body" -->
        <!-- TemplateBeginRepeat name="Field.value" -->
         <div> @@[email protected]@> </div>
        <!-- TemplateEndRepeat -->
    <!-- TemplateEndRepeat -->
Решение Вопроса

Страница практики тридионов, на которую ссылался Нейл хорошая ссылка. Но на этой странице показано, как в целом выполнять итерации по всем встроенным полям. В тех случаях, когда вы знаете имя поля, все становится немного проще. В вашем случае это все, что нужно в вашем 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]@)
 26 апр. 2012 г., 06:31
+1 за ваш ответ
 Patan26 апр. 2012 г., 07:49
Отличный ответ. огромное спасибо

вы не можете использовать индекс внешнего цикла внутри внутреннего цикла. Индекс внутреннего цикла будет скрывать индекс внешнего цикла. Следовательно, вам нужен обходной путь. Я могу вспомнить 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 функционирует самостоятельно для сохранения и увеличения значения в пакете.

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

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

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

 Patan25 апр. 2012 г., 10:52
Я пытался с переменной 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;
 25 апр. 2012 г., 21:14
Вы правы, Нил, проблема в том, что вы не правильно следовали этому примеру. Я напишу, как это сделать, в отдельном примере.

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

 25 апр. 2012 г., 12:57
@muzimil: я обновил свой ответ. Попробуйте это сейчас
 25 апр. 2012 г., 12:55
@DaveHoulker: Push - это пользовательская функция.
 Patan25 апр. 2012 г., 14:09
@ Шива Чаран. Я думаю, что это не позволит нам реализовать функцию редактирования сайта. Поправьте меня если я не прав
 Patan25 апр. 2012 г., 08:58
Я получаю сообщение об ошибке, так как функция Push недоступна. Можете ли вы помочь мне в преодолении этой ошибки.
 25 апр. 2012 г., 09:26
Я думаю, что Push должен быть пользовательской функцией, которую использует Шива. Это не доступно по умолчанию.

Ваш ответ на вопрос