【问题标题】:TemplateBeginRepeat in reverse orderTemplateBeginRepeat 以相反的顺序
【发布时间】:2023-03-31 17:26:01
【问题描述】:

我需要使用 TemplateBeginRepeat 创建 2 个循环,我需要在其中输出自定义标签

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

输出一些html

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

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

【问题讨论】:

  • customtag 是什么类型?它是一个字段吗?
  • 请注意 ${} 应该只用于例外情况,而不是默认情况下。它允许您在默认 @@ @@ 之前先评估(呈现)表达式。

标签: tridion tridion-2011


【解决方案1】:

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


如果您的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# 中将其留空,并将其保留在 DWT 中的 RenderComponentPresentation 调用中,就像您已经做的那样。

【讨论】:

  • Frank,customtag 是一个多值的组件链接元数据字段
  • 所以它是一个字段。然后,您必须创建自己的集合(在 c# 中创建 ComponentArray,以相反的顺序推送到包)。此处的示例sdltridionworld.com/community/extension_overview/… - 检查“按模板类型分组组件”TBB 或“获取同级组件”)
  • 你是对的 Nuno,在这种情况下,将链接的组件推入包中可能会更好。我会更新我的答案。
【解决方案2】:

这里的问题似乎是 Dreamweaver 语法只适用于最简单的编程任务。 Frank 和 Nuno 已经表明,将一些逻辑移动到 C# 模板会带来改进,但您还应该考虑将这个输出的生成完全移动到 C# 模板。换句话说,一旦你需要使用 DWT 以外的东西,你的问题定义就会改变,因为现在描述的问题非常以 DWT 为中心。

只存在反向循环的需要,因为您希望以正确的顺序关闭您的构造。在像 C# 这样的语言中,您可以通过使用嵌套(甚至递归)函数调用或(可能更有可能)通过将关闭输出推送到堆栈来实现此结果。

【讨论】:

  • 同意Dom。考虑到此处对RenderComponentPresentation 的调用,这可能会生成大部分HTML,处理外观的C# 可能不会输出太多HTML(可能只是ullis)。如果您希望以后能够在不需要 Visual Studio 的情况下修改源代码,我建议您使用 C# 片段 TBB 作为 DWT 中复杂构造的替代方案。
  • 如果 DWT 调用它所在的模板会发生什么? :-) 弗兰克,不过,我没有看到列表。这感觉更像是作者想要的任何节点的嵌套:&lt;div&gt;&lt;p&gt;&lt;span&gt; rest of the content &lt;/span&gt;&lt;/p&gt;&lt;/div&gt;', where div, p, and span are the customtag` 字段。所以也许 C# 只是输出尖括号和属性?希望这个组件适用于开发人员或高级用户。
猜你喜欢
  • 1970-01-01
  • 2016-09-20
  • 2015-02-17
  • 1970-01-01
  • 1970-01-01
  • 2016-10-05
  • 2011-11-02
  • 2019-03-28
  • 1970-01-01
相关资源
最近更新 更多