1

こんにちは、リンクされたコンポーネントのループで問題が発生しました。
製品アイテムを含む EmailSetup(View UML diagram ) コンポーネントを作成しました。
製品コンポーネントにはスキーマ (EmailBlockWithCode) があります。

製品:

  • - コード = "wms_III"
  • - アイテム:
    • - キー = "プロダクト キー"
    • - コンテンツ = "ProductContent"
    • - アクションの呼び出し :
    • - アイテム:
      • - キー = "BluetoothKey"
      • - コンテンツ = "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>

したがって、私の問題は、コードが
「アイテム」(キー = 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

これはおそらく、テンプレートの実行方法と関係があります。最も内側の繰り返し領域が最初にレンダリングされ、次にレンダラーが外側に向かって処理を行います。

したがって、内側の繰り返し領域では、以前に取得したコンポーネントにまだアクセスできません。

はい、これはまったく直感的ではありませんが、それがどのように機能するかです。

できることは、リンクされたすべてのコンポーネントを調べて、DWT の前に実行される .NET TBB のフィールド名を使用してそれらをパッケージにプッシュすることです。

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

于 2013-03-05T10:47:46.503 に答える
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

このコードを使用してこれを修正しました。最高ではありませんが、うまくいきます。

<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 に答える