1

您好,我在循环链接组件时遇到问题。
我创建了一个带有产品项的 EmailSetup(View UML diagram ) 组件。
产品组件具有架构 (EmailBlockWithCode)。

产品:

  • - 代码 = “wms_III”
  • - 物品:
    • - 密钥 = “产品密钥”
    • - 内容 = “产品内容”
    • - 呼吁采取行动 :
    • - 物品:
      • - 钥匙 = “蓝牙钥匙”
      • - 内容 =“蓝牙内容”

当我用代码循环这个组件时:

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

所以我的问题是代码没有循环
遍历“项目”(键 = ProductKey;内容 = 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 -->


UML 图

4

3 回答 3

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>
于 2013-03-05T05:18:24.873 回答
1

这可能与模板的执行方式有关。最内部的重复区域首先被渲染,然后渲染器向外工作。

因此,在内部重复区域中,您还无法访问您之前获得的组件。

是的,这根本不直观,但这就是它的工作原理。

您可以做的是浏览所有链接的组件,并使用在 DWT 之前执行的 .NET TBB 中的字段名称将它们推送到包中。

http://80000ft.blogspot.nl/2011/09/render-order-of-repeating-regions-and.html

于 2013-03-05T10:47:46.503 回答
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>  
于 2013-03-05T12:56:20.457 回答