6

TemplateBeginRepeatカスタムタグを出力する必要がある場所を使用して、2 つのループを作成する必要があります

<!-- TemplateBeginRepeat name="customtag" -->
    ${RenderComponentPresentation(Field, rendercustomtagstarttemplate)}
<!-- TemplateEndRepeat -->

いくつかのhtmlを出力する

<!-- TemplateBeginRepeat name="customtag" -->
    ${RenderComponentPresentation(Field, rendercustomtagclosetemplate)}
<!-- TemplateEndRepeat -->

2 番目のループは最初のループでレンダリングされたカスタム タグを閉じるため、2 番目のループは逆の順序で実行する必要があります。(タグは逆の順序で閉じる必要があるため)。TemplateBeginRepeat を使用してコンポーネントの逆順で 2 番目のループを実行するにはどうすればよいですか?

4

2 に答える 2

6

繰り返される項目を逆の順序でループする組み込みの方法はありません。


がパッケージ内の配列アイテム (通常はコンポーネントまたはコンポーネント プレゼンテーションの配列) である場合customtag、同じアイテムを含むパッケージにリストを逆の順序でプッシュし、そのアイテムをループすることができます。

<!-- TemplateBeginRepeat name="customtag_reversed" -->

yourcustomtagがフィールドの場合、フィールドをパッケージにプッシュできないため、これは機能しません。その場合、カスタム タグを正しい順序で出力するカスタム関数を作成することをお勧めします。

@@RenderCustomTags('customtag', 'Order.Reverse')@@

アップデート

customtagコンポーネント リンクフィールドの場合、リンクされたコンポーネントをコンポーネント配列アイテムとしてパッケージに単純に追加することをお勧めします。Nuno は SDL Tridion World の TBB へのリンクを提供しましたが、これは最も重要なフラグメントです。

//  Tridion.ContentManager.Templating.ComponentPresentation
var list = new List<ComponentPresentation>(); 

list.Add(new ComponentPresentation(Component.Id, ComponentTemplate.Id));
// you'll want to do a loop of these for every linked Component

var item = package.CreateStringItem(ContentType.ComponentArray,
                                    ComponentPresentationList.ToXml(list));
package.PushItem("customtag_Components", item);

リンクされたコンポーネントごとにこれらのループを実行する必要があります。

list.Add(new ComponentPresentation(Component.Id, ComponentTemplate.Id));

また、C# コードでコンポーネント テンプレート ID をハードコーディングする代わりに、C# で空のままにして、RenderComponentPresentation既に行っているように DWT の呼び出し内に保持することも検討できます。

于 2013-01-04T16:27:41.327 に答える
5

ここでの問題は、Dreamweaver の構文が最も単純なプログラミング タスクにしか適していないことです。Frank と Nuno は、一部のロジックを C# テンプレートに移動すると改善されることを示しましたが、この出力の生成を完全に C# テンプレートに移動することも検討する必要があります。言い換えれば、DWT 以外のものを使用する必要が生じると、問題の定義が変わります。これは、ここで説明する問題が DWT 中心であるためです。

逆にループする必要があるのは、構造を正しい順序で閉じたいからです。C# のような言語では、ネストされた (再帰的であっても) 関数呼び出しを使用するか、(おそらくより可能性が高い) クローズ出力をスタックにプッシュすることで、この結果を得ることができます。

于 2013-01-05T07:55:08.323 に答える