7

SDL Tridion 2011 SP1 で DWT TBB に取り組んでいます。

多値の埋め込みフィールド「body」があります。この埋め込みフィールドには、もう 1 つの単純なテキスト フィールド「値」があります。これも多値です。

「値」フィールドをレンダリングするには、2 つの繰り返しループを使用する必要があります。

しかし、両方のループのインデックスを区別できません。

以下のように書いています。

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

ニールが参照したトリディオンの練習ページは良い参考資料です。しかし、そのページは、すべての埋め込みフィールドを一般的に反復する方法を示しています。フィールド名がわかっている場合は、少し簡単になります。あなたの場合、これがあなたのDWTに必要なすべてです:

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

1行ずつ:

  1. bodyコンポーネントのフィールドの値を繰り返し処理します
  2. 埋め込み可能なスキーマのvalueサブフィールドの値を繰り返し処理しますbody
  3. この段階でFieldPathは、は現在のbody値、つまりbody[0]body[1]などを参照し、現在TemplateRepeatIndexののインデックスですvalue。したがってRenderComponentField、この知識を使用して正しい呼び出しを作成できます。

bodyそれぞれ2つのフィールドを持つ2つのフィールドを持つコンポーネントがあり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>

これらの状況のデバッグ

多くの人がこのような構造を書くのに問題があります。私も例外ではありません。重要な変数が:FieldFieldPathおよびであることを知っていることで、ほとんどのケースを機能させることができることがわかりましたTemplateRepeatIndex。疑わしい場合は、このフラグメントをすべての内のDWTに埋め込むだけTemplateBeginRepeatです。

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

FieldPath変数はここでは役に立ちませんか?

複数値の埋め込みフィールドを反復処理する例については、 TridionPracticeサイトを参照してください。

于 2012-04-25T07:53:57.160 に答える
3

既にお気づきのように、内側のループ内で外側のループ インデックスを使用することはできません。内側のループ インデックスは、外側のループ インデックスを隠します。したがって、回避策が必要です。私は過去に使用した2つを考えることができます:

  1. C# TBB (アセンブリまたはフラグメント) を使用して出力を生成します。これはあまり良い解決策ではありませんが、実用的です。少なくとも内側のループの出力を生成し、個々の値をパッケージ変数に格納できます。次に、外側のループで、値を反復処理して出力に含めることができます。body_0例: 、などの変数を作成しますbody_1。次に、外側のループ内でそれらを出力します。@@body_${TemplateRepeatIndex}@@

  2. Dreamweaver 関数を使用して、内側のループ インデックスをシミュレートします。Setパッケージ項目変数に対する関数と、それに対する関数を 1 つ持つことができます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パッケージに値を格納してインクリメントするには、およびIncrementDWT 関数を自分で作成する必要があります。

于 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 に答える