Zum Inhalt springen

tx_news: Bestimmte Kategorien ausgeben

Erstellt am 24. Oktober 2013 · 2 Antworten · letzte Antwort am 24. Oktober 2013

Tags: Kategorien, tx_news, TYPO3 6, Frage

Itsab ·

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: http://typo3.3.n7.nabble.com/tx-news-mehr-als-eine-Kategorie-anzeigen-td244807.html

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

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

Wenn ich stattdessen den Schnipsel einsetze, passiert leider gar nichts:

<span class="news-list-category"> 
	<f:for each="{categories}" as="category" iteration="categoryIterator" reverse="1"> 
		<f:if condition="{categoryIterator.isLast}"> 
			<f:then> 
				{category.title} 
			</f:then> 
			<f:else> 
				{category.title}, 
			</f:else> 
		</f:if> 
	</f:for> 
</span>

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

<!-- categories -->
<span class="news-list-category">
	<f:for each="{categories}" as="category">
		<f:if condition="{category.shortcut}">
			<f:then>
				<f:link.page pageUid="{category.shortcut}">
					{category.title}
				</f:link.page>
			</f:then>
			<f:else>
				{category.title}
			</f:else>
		</f:if>
	</f:for>
</span>

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

Vielen Dank für alle Hinweise
Itsab

jenses ·
Itsab schrieb
<span class="news-list-category"> 
	<f:for each="{categories}" as="category" iteration="categoryIterator" reverse="1"> 
		<f:if condition="{categoryIterator.isLast}"> 
			<f:then> 
				{category.title} 
			</f:then> 
			<f:else> 
				{category.title}, 
			</f:else> 
		</f:if> 
	</f:for> 
</span>

sollte doch wohl eher so lauten:

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

Die Condition habe ich entfernt da sowieso sinnlos.

Itsab · · Beste Antwort

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

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

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

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

Es ersetzt den Originalteil für die erste Kategorie

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

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

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

im "class"-Attribut ergänzt:

{namespace n=Tx_News_ViewHelpers}
<!-- Partials/List/Item.html -->

<n:excludeDisplayedNews newsItem="{newsItem}" />
<f:if condition="{settings.templateLayout} == 10">
	<f:then>
		<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)}">
			<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