您好
循环遍历链接组件时遇到问题
我创建了一个带有产品项目的EmailSetup(View UML diagram)组件
产品Component具有架构(EmailBlockWithCode)。
产品:
当我使用代码
循环遍历此组件时 <products>
<!-- TemplateBeginRepeat name="Component.Fields.Product" -->
@@GetComponent(Field,'Product')@@
<product name="@@Product.Code@@">
<!-- TemplateBeginRepeat name="Product.Fields.Item" -->
<@@Product.Fields.Item.Key@@><![CDATA[@@Product.Fields.Item.Content@@]]></@@Product.Fields.Item.Key@@>
<!-- TemplateEndRepeat -->
<!-- TemplateBeginRepeat name="Product.Fields.CallToAction" -->
@@GetComponent(Field,'CallToAction')@@
<@@CallToAction.Fields.Item.Key@@><![CDATA[@@CallToAction.Fields.Item.Content@@]]></@@CallToAction.Fields.Item.Key@@>
<!-- TemplateEndRepeat -->
</product>
<!-- TemplateEndRepeat -->
</products>
这是函数GetComponent
[TemplateCallable]
public string GetComponent(string tcmUri, string packageVariable) {
Assert.NotEmpty("tcmUri", tcmUri);
Assert.NotEmpty("packageVariable", packageVariable);
IdentifiableObject identifiableObject = m_Engine.GetObject(new TcmUri(tcmUri));
if (identifiableObject as Component == null) {
throw new BuildingBlockException("Given tcmUri '" + tcmUri + "' is not a Component.");
}
Item previousItem = m_Package.GetByName(packageVariable);
if (previousItem != null) {
m_Package.Remove(previousItem);
}
Component component = identifiableObject as Component;
m_Package.PushItem(packageVariable, m_Package.CreateTridionItem(ContentType.Component, component));
return "";
}
我的输出是:
<products>
<product name="wms_III">
</product>
</products>
所以我的问题是代码没有循环到'item'(key = ProductKey; content = ProductContent) 我找到了一个函数IteratingOverMultivalueEmbeddedFields,但这也不会循环我的产品。代码:
<!-- TemplateBeginRepeat name="Component.Fields.Product" -->
@@GetComponent(Field,'Product')@@
<!-- TemplateBeginRepeat name="Product.Fields" -->
@@Field.Name@@
<!-- TemplateBeginRepeat name="Field.Values" -->
<!-- TemplateBeginIf cond="Field.ContentType = 'text/plain'" -->
@@RenderComponentField(FieldPath, TemplateRepeatIndex)@@
<!-- TemplateEndIf -->
<!-- TemplateBeginIf cond="Field.ContentType = 'tridion/field'" -->
<!-- TemplateBeginRepeat name="Field.Fields" -->
@@Field.Name@@
<!-- TemplateBeginRepeat name="Field.Values" -->
@@RenderComponentField(FieldPath, TemplateRepeatIndex)@@
<!-- TemplateEndRepeat -->
<!-- TemplateEndRepeat -->
<!-- TemplateEndIf -->
<!-- TemplateEndRepeat -->
<!-- TemplateEndRepeat -->
答案 0 :(得分:1)
因此,在DW函数将它们推入后,您似乎无法访问包中的组件?
使用DGX,您的代码大致会像这样,您是否考虑过使用它?
<products>
<!-- TemplateBeginRepeat name="Component.Fields.Product" -->
<product name="@@Get('Fields.Product[${TemplateRepeatIndex}].Code')@@">
<!-- TemplateBeginRepeat name="Product.Fields.Item" -->
<@@Get('Fields.Product[${TemplateRepeatIndex}].Fields.Item.Key')@@><![CDATA[@@Get('Fields.Product[${TemplateRepeatIndex}].Fields.Item.Content')@@]]></@@Get('Fields.Product[${TemplateRepeatIndex}].Fields.Item.Key')@@>
<!-- TemplateEndRepeat -->
<!-- TemplateBeginRepeat name="Product.Fields.CallToAction" -->
<@@Get('Fields.CallToAction[${TemplateRepeatIndex}].Fields.Item.Key')@@><![CDATA[@@Get('CallToAction[${TemplateRepeatIndex}].Fields.Item.Content')@@]]></@@Get('Fields.CallToAction[${TemplateRepeatIndex}].Fields.Item.Key')@@>
<!-- TemplateEndRepeat -->
</product>
<!-- TemplateEndRepeat -->
</products>
答案 1 :(得分:1)
这可能与模板的执行方式有关。首先渲染最内部的重复区域,然后渲染器向外移动。
因此,在内部重复区域中,您还没有访问之前获得的组件。
是的,这根本不直观,但这就是它的工作原理。
您可以做的是浏览所有链接的组件,并使用在DWT之前执行的.NET TBB中的字段名称将它们推入包中。
http://80000ft.blogspot.nl/2011/09/render-order-of-repeating-regions-and.html
答案 2 :(得分:1)
我使用此代码修复此问题。不是最好的,但它有效。
<products>
<!-- TemplateBeginRepeat name="Component.Fields.Product" -->
@@RenderComponentPresentation(Field, "tcm:75-72162-32")@@
<!-- TemplateEndRepeat -->
</products>
并且renderComponentPresentation加载另一个dwt:
<product name="@@Component.Fields.Code@@">
<!-- TemplateBeginRepeat name="Component.Fields.Item" -->
<@@Field.Key@@><![CDATA[@@Field.Content@@]]></@@Field.Key@@>
<!-- TemplateEndRepeat -->
<!-- TemplateBeginRepeat name="Component.Fields.CallToAction" -->
@@GetComponent(Field,'CallToAction')@@
<@@CallToAction.Fields.Item.Key@@><![CDATA[@@CallToAction.Fields.Item.Content@@]]></@@CallToAction.Fields.Item.Key@@>
<!-- TemplateEndRepeat -->
</product>