2013-03-04 3 views
1

Здравствуйте, У меня возникла проблема с перекосом связанного компонента.
Я создал EmailSetup (вид UML diagram) Компонент с товаром.
Компонент продукта имеет схему (EmailBlockWithCode).

продукта: Tridion: проблема с компонентом Template при циклировании связанных компонентов

  • - Code = "wms_III"
  • - Предмет:
    • - Key = "ProductKey"
    • - Content = "ProductContent"
    • - CallToAction:
    • - Предмет:
      • - Ключ = "BluetoothKey"
      • - Содержание = "BluetoothContent"

Когда я цикл по этому компоненту с кодом:

<products> 
      <!-- TemplateBeginRepeat name="Component.Fields.Product" --> 
      @@GetComponent(Field,'Product')@@ 
      <product name="@@[email protected]@"> 
       <!-- TemplateBeginRepeat name="Product.Fields.Item" --> 
       <@@[email protected]@><![CDATA[@@[email protected]@]]></@@[email protected]@> 
       <!-- TemplateEndRepeat --> 
       <!-- TemplateBeginRepeat name="Product.Fields.CallToAction" --> 
       @@GetComponent(Field,'CallToAction')@@ 
       <@@[email protected]@><![CDATA[@@[email protected]@]]></@@[email protected]@> 
       <!-- 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" --> 
    @@[email protected]@ 
    <!-- TemplateBeginRepeat name="Field.Values" --> 
    <!-- TemplateBeginIf cond="Field.ContentType = 'text/plain'" -->  
    @@RenderComponentField(FieldPath, TemplateRepeatIndex)@@ 
    <!-- TemplateEndIf --> 
    <!-- TemplateBeginIf cond="Field.ContentType = 'tridion/field'" --> 
     <!-- TemplateBeginRepeat name="Field.Fields" --> 
     @@[email protected]@ 
     <!-- TemplateBeginRepeat name="Field.Values" --> 
      @@RenderComponentField(FieldPath, TemplateRepeatIndex)@@   
     <!-- TemplateEndRepeat --> 
     <!-- TemplateEndRepeat --> 
    <!-- TemplateEndIf --> 
    <!-- TemplateEndRepeat --> 
<!-- TemplateEndRepeat --> 


UML diagram

+0

Fixed. проверил мой ответ –

ответ

1

Я установил это, используя этот код. Не лучший, но он работает.

<products> 
     <!-- TemplateBeginRepeat name="Component.Fields.Product" --> 
      @@RenderComponentPresentation(Field, "tcm:75-72162-32")@@ 
     <!-- TemplateEndRepeat --> 
</products> 

и renderComponentPresentation грузы другой дедвейт с этим:

<product name="@@[email protected]@"> 
      <!-- TemplateBeginRepeat name="Component.Fields.Item" --> 
       <@@[email protected]@><![CDATA[@@[email protected]@]]></@@[email protected]@> 
      <!-- TemplateEndRepeat --> 
      <!-- TemplateBeginRepeat name="Component.Fields.CallToAction" --> 
       @@GetComponent(Field,'CallToAction')@@ 
       <@@[email protected]@><![CDATA[@@[email protected]@]]></@@[email protected]@> 
      <!-- TemplateEndRepeat -->  
     </product> 
+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> 
+0

Это правильно, мы не можем получить доступ к компонентам в пакете. Я установил DGX и работает код. , но все же Код «« все еще не хочет перебирать «Item» –

+0

Правильно --- он не будет выглядеть в поле компонент, который не находится в пакете. Не уверен, как работать с этим TBH, я не создавал DGX для этого варианта использования, и не уверен, что он работает вообще - смешанные отчеты из поля по использованию DGX в Repeats and Conditions –

+0

Странно, потому что если я сделаю «@ @Count (поле, «элемент») @@ «он говорит, что есть 2 счета. & @@ Get ('Product.Fields.Item [1] .Key') @@, он возвращает значение внутри! но не когда я зацикливаюсь –

1

Возможно, это связано с тем, как выполняется шаблон. Сначала воспроизводятся наиболее внутренние повторяющиеся области, а затем рендеринг работает наружу.

Таким образом, во внутренней повторяющейся области у вас еще нет доступа к компоненту, который вы получаете раньше.

Да, это не интуитивно, но так оно и работает.

Что вы можете сделать, это пройти через все связанные компоненты и вставить их в пакет, используя имя поля в .NET TBB, которое выполняется перед DWT.

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

+0

Это тоже не сработало, купите я разместил решение в вопросе. Thx anyway –

+0

В вашем новом подходе вы не сталкиваетесь с проблемой оформления заказа, так что это может быть причиной? Или почему? –

 Смежные вопросы

  • Нет связанных вопросов^_^