Tridion:循环链接组件时的组件模板问题

时间:2013-03-04 15:30:30

标签: tridion tridion-2011 tridion-content-delivery

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

  • - Code =“wms_III”
  •         
  • - 项目:
    • - Key =“ProductKey”
    • - Content =“ProductContent”
             
    • - CallToAction:
    • - 项目:
      • - Key =“BluetoothKey”
      •                                
      • - Content =“BluetoothContent”

当我使用代码

循环遍历此组件时
  <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 -->


UML diagram

3 个答案:

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