[Frage] tx_news: Bestimmte Kategorien ausgeben [Gelöst] TYPO3-Version: 6.1.1

  • Itsab Itsab
    Padawan
    0 x
    37 Beiträge
    0 Hilfreiche Beiträge
    24. 10. 2013, 09:44

    Hallo Zusammen,

    ich setze mich gerade mit der tx_news auseinander und mache auch meine ersten Schritte mit FLUID. Dabei sind einige Fragen aufgetaucht, bei denen ich noch keine Lösung gefunden habe. Eine davon ist folgende:

    Angenommen, es gibt eine Kategorie-Struktur wie diese:

    Kategorie_A
    - Unterkategorie 1
    - Unterkategorie 2
    - Unterkategorie 3

    Kategorie_B
    - Unterkategorie 1
    - Unterkategorie 2
    - Unterkategorie 3

    Nun möchte ich im Wrap der Liste für News der Kategorie_A eine CSS-Klasse hinzufügen, nämlich Kategorie_A. Im Wrap der Liste für News der Kategorie_B analog dazu die CSS-Klasse Kategorie_B.

    In der Liste sollen die News-Items ebenfalls Ihre Kategorie ausgeben, jedoch eben nicht Kategorie_A, sondern Unterkategorie 1, 2, 3 usw.

    Im Netz habe ich nicht wirklich viel gefunden. Ein interessanter Schnipsel war hier zu finden, hat mir aber nicht weitergeholfen: [url]http://typo3.3.n7.nabble.com/tx-news-mehr-als-eine-Kategorie-anzeigen-td244807.html[/url]

    Im Template wird standardmäßig nur die erste Kategorie ausgegeben:
    Pfad: /Partials/List/Item.html

    1. <f:if condition="{newsItem.firstCategory}">
    2. <!-- first category -->
    3. <span class="news-list-category">{newsItem.firstCategory.title}</span>
    4. </f:if>

    Wenn ich stattdessen den Schnipsel einsetze, passiert leider gar nichts:
    1. <span class="news-list-category">
    2. <f:for each="{categories}" as="category" iteration="categoryIterator" reverse="1">
    3. <f:if condition="{categoryIterator.isLast}">
    4. <f:then>
    5. {category.title}
    6. </f:then>
    7. <f:else>
    8. {category.title},
    9. </f:else>
    10. </f:if>
    11. </f:for>
    12. </span>

    Einen interessantes Partial ist in der Ext selbst zu finden:
    Pfad: /Partials/Category/Items.html

    1. <!-- categories -->
    2. <span class="news-list-category">
    3. <f:for each="{categories}" as="category">
    4. <f:if condition="{category.shortcut}">
    5. <f:then>
    6. <f:link.page pageUid="{category.shortcut}">
    7. {category.title}
    8. </f:link.page>
    9. </f:then>
    10. <f:else>
    11. {category.title}
    12. </f:else>
    13. </f:if>
    14. </f:for>
    15. </span>

    Aber einfach ins Template einfügen reicht leider nicht. Hat jemand eine Idee?

    Vielen Dank für alle Hinweise
    Itsab

  • Itsab Itsab
    Padawan
    0 x
    37 Beiträge
    0 Hilfreiche Beiträge
    24. 10. 2013, 17:30 - Lösung

    Hallo Jenses,

    danke für den Hinweis. Leider gibt der Code keine Ausgabe aus:

    <span class="news-list-category">
    <f:for each="{newsItem.categories}" as="category" iteration="categoryIterator" reverse="1">
    {category.title}
    </f:for>
    </span>

    Ich habe noch ein bisschen herumgefummelt und es folgendermaßen gelöst:
    Zunächst ein neues Partial angelegt unter
    Pfad: /Partials/Category/Items_last.html

    Dieses Partial gibt nur die letzte Kategorie aus, oder anders gesagt, jene der niedrigsten Ebene

    1. <!-- last category -->
    2. <f:for each="{categories}" as="category" iteration="categoryIterator" reverse="0">
    3. <f:if condition="{categoryIterator.isLast}">
    4. <f:then>{category.title}</f:then>
    5. <f:else></f:else>
    6. </f:if>
    7. </f:for>

    Dieses Partial wird dann im Partial Item.html der Liste wieder aufgegriffen.
    Pfad /Partials/List/Item.html

    1. <!-- last category -->
    2. <f:if condition="{newsItem.categories}">
    3. <span class="news_item_category">
    4. <f:render partial="Category/Items_last" arguments="{categories:newsItem.categories, settings:settings}" />
    5. </span>
    6. </f:if>

    Es ersetzt den Originalteil für die erste Kategorie

    1. <f:if condition="{newsItem.firstCategory}">
    2. <!-- first category -->
    3. <span class="news-list-category">{newsItem.firstCategory.title}</span>
    4. </f:if>

    Damit dann auch die CSS-Klasse erscheint, habe dann eine Condition

    1. {f:if(condition: newsItem.firstCategory, then: newsItem.firstCategory.title)}

    im "class"-Attribut ergänzt:

    1. {namespace n=Tx_News_ViewHelpers}
    2. <!-- Partials/List/Item.html -->
    3.  
    4. <n:excludeDisplayedNews newsItem="{newsItem}" />
    5. <f:if condition="{settings.templateLayout} == 10">
    6. <f:then>
    7. <n:link newsItem="{newsItem}" settings="{settings}" class="news_item border article articletype-{newsItem.type}{f:if(condition: newsItem.istopnews, then: ' topnews ')}{f:if(condition: newsItem.firstCategory, then: newsItem.firstCategory.title)}">
    8. <div class="news_item_image">

    Ich bin mir zwar nicht sicher, ob das die eleganteste Variante ist, aber es funktioniert bei mir auf jeden Fall. Hoffe, es hilft jemandem weiter.

    Viele Grüße


  • 1
  • jenses jenses
    Flash Gordon
    0 x
    3087 Beiträge
    106 Hilfreiche Beiträge
    24. 10. 2013, 10:24

    Zitiert von: Itsab

    1. <span class="news-list-category">
    2. <f:for each="{categories}" as="category" iteration="categoryIterator" reverse="1">
    3. <f:if condition="{categoryIterator.isLast}">
    4. <f:then>
    5. {category.title}
    6. </f:then>
    7. <f:else>
    8. {category.title},
    9. </f:else>
    10. </f:if>
    11. </f:for>
    12. </span>

    sollte doch wohl eher so lauten:

    1. <span class="news-list-category">
    2. <f:for each="{newsItem.categories}" as="category" iteration="categoryIterator" reverse="1">
    3. {category.title}
    4. </f:for>
    5. </span>

    Die Condition habe ich entfernt da sowieso sinnlos.

  • Itsab Itsab
    Padawan
    0 x
    37 Beiträge
    0 Hilfreiche Beiträge
    24. 10. 2013, 17:30

    Hallo Jenses,

    danke für den Hinweis. Leider gibt der Code keine Ausgabe aus:

    <span class="news-list-category">
    <f:for each="{newsItem.categories}" as="category" iteration="categoryIterator" reverse="1">
    {category.title}
    </f:for>
    </span>

    Ich habe noch ein bisschen herumgefummelt und es folgendermaßen gelöst:
    Zunächst ein neues Partial angelegt unter
    Pfad: /Partials/Category/Items_last.html

    Dieses Partial gibt nur die letzte Kategorie aus, oder anders gesagt, jene der niedrigsten Ebene

    1. <!-- last category -->
    2. <f:for each="{categories}" as="category" iteration="categoryIterator" reverse="0">
    3. <f:if condition="{categoryIterator.isLast}">
    4. <f:then>{category.title}</f:then>
    5. <f:else></f:else>
    6. </f:if>
    7. </f:for>

    Dieses Partial wird dann im Partial Item.html der Liste wieder aufgegriffen.
    Pfad /Partials/List/Item.html

    1. <!-- last category -->
    2. <f:if condition="{newsItem.categories}">
    3. <span class="news_item_category">
    4. <f:render partial="Category/Items_last" arguments="{categories:newsItem.categories, settings:settings}" />
    5. </span>
    6. </f:if>

    Es ersetzt den Originalteil für die erste Kategorie

    1. <f:if condition="{newsItem.firstCategory}">
    2. <!-- first category -->
    3. <span class="news-list-category">{newsItem.firstCategory.title}</span>
    4. </f:if>

    Damit dann auch die CSS-Klasse erscheint, habe dann eine Condition

    1. {f:if(condition: newsItem.firstCategory, then: newsItem.firstCategory.title)}

    im "class"-Attribut ergänzt:

    1. {namespace n=Tx_News_ViewHelpers}
    2. <!-- Partials/List/Item.html -->
    3.  
    4. <n:excludeDisplayedNews newsItem="{newsItem}" />
    5. <f:if condition="{settings.templateLayout} == 10">
    6. <f:then>
    7. <n:link newsItem="{newsItem}" settings="{settings}" class="news_item border article articletype-{newsItem.type}{f:if(condition: newsItem.istopnews, then: ' topnews ')}{f:if(condition: newsItem.firstCategory, then: newsItem.firstCategory.title)}">
    8. <div class="news_item_image">

    Ich bin mir zwar nicht sicher, ob das die eleganteste Variante ist, aber es funktioniert bei mir auf jeden Fall. Hoffe, es hilft jemandem weiter.

    Viele Grüße

  • 1