6

我需要使用TemplateBeginRepeat需要输出自定义标签的位置创建 2 个循环

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

输出一些html

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

由于第二个循环关闭了第一个循环呈现的自定义标签,因此第二个循环应该以相反的顺序运行。(因为标签需要以相反的顺序关闭)。如何使用 TemplateBeginRepeat 以组件的相反顺序运行第二个循环?

4

2 回答 2

6

没有内置的方法可以以相反的顺序循环重复的项目。


如果您customtag是包中的数组项(通常是组件或组件表示的数组),您可以将列表以相反的顺序推送到包含相同项的包中,然后循环该项。

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

如果您customtag是一个字段,这将不起作用,因为您无法将字段推送到包中。在这种情况下,我建议创建一个自定义函数,以正确的顺序输出您的自定义标签,例如:

@@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 回答