tt_news ist eine der ältesten vorhanden Extensions für TYPO3, sicherlich aber auch die am meisten genutzte. Da sich über die Jahre bei TYPO3 allerdings viel getan und weiterentwickelt hat, sind manche Verhaltensweisen und Funktionen von tt_news veraltet und schlichtweg zu unflexibel geworden. Hierzu zähle ich vorallem das CATMENU, mit welchem man eine für das Auge ansprechende Auswahl aller vorhandenen News-Kategorien anzeigen lassen kann. Doch leider ist die Verwendung des CATMENU zum Teil alles andere als zufrieden stellend.
- Bislang ist es unmöglich (?!?), ohne Eingriff in den Quellcode der tt_news-Extension, die Anzahl der News, die eine Kategorie beinhaltet, dem Websiten-Besucher anzuzeigen
- Wraps sind viel zu wenig implementiert, wodurch z. B. eine Listenansicht mit eingebetteten Unterlisten nicht HTML-konform erstellbar ist.
Um in den vollen Genuss der TYPO3-Wraps und Co. zu kommen, kann ich nur empfehlen, sich das Kategorien-Menü selbst zu generieren. Hierzu habe ein Typoscript-Snippet zusammengebastelt, mit welchem man sich selbst das CATMENU generieren lassen kann und als besonderes Feature, zu jeder Kategorie die Anzahl der dort hinterlegten News angezeigt werden.
Übrigens: wer bereits die neue Alternativ-Extension tx_news verwendet, für den habe ich das TypoScript-Snippet in einer angepassten tx_news-Version mit Counter bereitgestellt.
Ich habe bewusst zu fast jeder Code-Zeile einen Kommentar verfasst, so dass auch TYPO3-Anfänger wenig Probleme haben sollten, die Zusammenhänge zu verstehen.
# zu erst der Marker fuer das neue Kat-Menu
lib.catList = COA
lib.catList {
# hole alle Hauptkategorien
10 = CONTENT
10 {
# wrappe die gesamte Liste als "unsortierte Liste"
wrap = <ul class="news-catmenu">|</ul>
table = tt_news_cat
select {
# hier muss die pid eures News-Sysordners rein, bzw. wo die News-Kategorien gespeichert sind
pidInList = 3
orderBy = title
where = parent_category=0 AND deleted=0 AND hidden=0
}
renderObj = COA
renderObj {
# wrappe jede gefundene Hauptkategorie als Listenelement
wrap = <li>|</li>
# ueberschreibe den vorherigen Wrap ...
wrap.override = <li class="news-catmenu-ACT">|</li>
# ... nur, wenn ...
wrap.override.if {
# ... eine News-Kategorie bereits ausgewaehlt wurde und per GET/POST ermittelt werden kann
value.data = GPvar:tx_ttnews|cat
# und dieser ermittelte Wert der aktuellen uid gleicht
equals.field = uid
}
# zeig mir den Kategorie-Titel und mache einen Link daraus zur Kategorie-Detail-Uebersicht
10 = TEXT
10 {
# das title-Feld soll als Text angezeigt werden (koennte man auch description... verwenden)
field = title
typolink {
# verlinke zu der Seite mit der News-Auflistung (Listenansicht)
parameter = 34
title.field = title
# fuege den GET-Parameter fuer die ausgewaehlte Kategorie hinzu
additionalParams.dataWrap = &tx_ttnews[cat]={field:uid}
# cHash mit uebergeben fuers Caching - Danke an ScubaBen fuer den Hinweis!
useCacheHash = 1
}
}
# zeig mir einen Counter aller News-Eintraege in dieser Kategorie
20 = CONTENT
20 {
table = tt_news_cat
select {
# hier wieder der Sysordner aller News-Eintraege und -Kategorien
pidInList = 3
join (
tt_news_cat_mm ON (tt_news_cat.uid = tt_news_cat_mm.uid_foreign)
JOIN tt_news ON (tt_news.uid = tt_news_cat_mm.uid_local)
)
# dieses Where sorgt dafuer, dass auch die News der Unterkategorien 1 Ebene unterhalb
# gezaehlt werden - tiefere Ebenen koennen nicht beruecksichtigt werden
# andWhere.dataWrap = (tt_news_cat.uid={field:uid} OR tt_news_cat.parent_category={field:uid}) AND tt_news.deleted=0 AND tt_news.hidden=0
# dieses Where zaehlt nur die News in dieser Kategorie
andWhere.dataWrap (
(tt_news_cat.uid={field:uid})
AND tt_news.deleted=0 AND tt_news.hidden=0
AND sys_language_uid={TSFE:sys_language_uid}
)
# fuehre einen count durch und speichere das Ergebnis in "counter"
selectFields = count(*) AS counter
}
renderObj = TEXT
renderObj {
# zeig mir nun das Ergebnis des Counters an und wrappe es
field = counter
wrap = <span>(|)</span>
}
}
# zeige mir alle Unterkategorien der aktuellen Kategorie an
30 = CONTENT
30 {
stdWrap {
# fuehre den Abschnitt nur aus, wenn in der Select-Abfrage ein Wert gefunden wurde
required = 1
wrap = <ul>|</ul>
}
table = tt_news_cat
select {
pidInList = 3
orderBy = title
andWhere.dataWrap = parent_category={field:uid} AND deleted=0 AND hidden=0
}
# vererbe die Einstellungen von lib.CatList.10.renderObj an dieses renderObj
renderObj < lib.catList.10.renderObj
renderObj = COA
renderObj {
# zeige den Titel mit Verlinkung an, genauso wie bei lib.catList.10.renderObj.10 (vererbt)
10 < lib.catList.10.renderObj.10
# zeige den News-Counter an, genauso wie bei lib.catList.10.renderObj.20 (vererbt)
20 < lib.catList.10.renderObj.20
# zeige die Unterkategorien an, genauso wie bei lib.catList.10.renderObj.30 (vererbt)
30 < lib.catList.10.renderObj.30
# wenn noch eine 4. und 5. Kategorien-Ebene abgebildet werden sollen,
# dann die folgenden 6 Zeilen verwenden
# 30.renderObj = COA
# 30.renderObj {
# 10 < lib.catList.10.renderObj.10
# 20 < lib.catList.10.renderObj.20
# 30 < lib.catList.10.renderObj.30
# }
}
}
}
}
}
Zum Abschluss noch ein wenig CSS, um die aktuell ausgewählte Kategorie auch grafisch ansprechend darzustellen:
li.news-catmenu-ACT > a {
font-weight: bold;
color: red;
}
09.08.2011 - UPDATE 1 (Zeile 41+42)
Der cHash sollte bei einem Link mit übergeben werden, um das Caching von TYPO3 zu "unterstützen". Hierzu gibt es im TypoScript zu typolink eine Option "useCacheHash", diese auf 1 setzen, und schon wird der URL der cHash mit angehängt. Vielen Dank an ScubaBen, der mich "in die richtige Richtung geschubst hat" ;)
09.08.2011 - UPDATE 2 (Zeile 62)
Ein kleiner Fehler hat sich beim Counter der News eingeschlichen. Um lediglich die News zu zählen, die auch in dieser Sprache verfügbar sind, muss die WHERE-Klausel um die sys_language_uid aus dem TSFE-Objekt erweitert werden: "AND sys_language_uid={TSFE:sys_language_uid}"
danke für den code, ist an sich genau was ich suche!
habe aber ein problem: möchte gerne immer alle unterkategorien anzeigen (als verschachtelte ul-listen), habe das aber nicht hingekkriegt... resp. die unterkategorien werden überhaupt nie angezeigt, auch wenn ich deinen code unverändert benütze (abgesehen von der "pidInList" natürlich)... sollten nicht zumindest die unterkategorien der aktuell aktiven kategorie angezeigt werden?
*danke für deine hilfe und lieber gruss
danke für deine rückmeldung
und sorry, war n fehler in meinem typoscript (vergessen den namen der lib anzupassen bei den unterrubriken)... dein code funktioniert einwandfrei!
werde nun noch versuchen die einstellungen (va. pidInList und pid für catlist) zu dynamisieren, so dass per kategorie auf eine seperate listen-ansicht gelinkt werden kann.
werde den code hier posten sobald ichs geschafft habe.
*danke & gruss
david
Ich such schon siet 4 Stunden nach genau Deinem Post. Schade, dass Du noch so schlecht gefunden wirst. Aber vielen Dank & meinen Link hast Du ;)
tolles Script, macht beinahe genau das was ich brauche und super, dass Du alles kommentiert hast, dann versteht auch ich einigermaßen was passiert.
Ich hab aber auch noch zwei Fragen:
Ist es möglich, nur die Unterkategorien ausgeklappt anzuzeigen von denen gerade die Obergatekorie angeklickt wurde, also ähnlich wie bei einem normalen TYPO3-Menu?
Im Moment ist es bei mir so:
Oberkategorie 1
'- Unterkategorie 1
'- Unterkategorie 2
'- Unterkategorie 3
Oberkategorie 2
'- Unterkategorie 4
'- Unterkategorie 5
Oberkategorie 3
'- Unterkategorie 6
'- Unterkategorie 7
und so hätte ich es gerne, weil ich ziemlich viele Kategorien habe und die Liste sonst ziemlich lang wird:
Oberkategorie 1
Oberkategorie 2 (aktiv)
'- Unterkategorie 4
'- Unterkategorie 5
Oberkategorie 3
Die zweite Frage:
Ist es möglich eine Klasse für die Oberkategorie zu vergeben, bei der eine Unterkategorie aktiv ist? Dann könnte man den Pfad und nicht nur den aktiven Punkt im Menü hervorheben.
Grüße Christian
und danke für das snippet. Tolle Arbeit.
Siehst du eine Möglichkeit die Anzahl der Artikel kummuliert darzustellen? Also wie bei der original Catmenu tree von tt_news.
Ich meine, wie macht man aus:
_
|__Category1 (3)
|__SubcategoryA (3)
|__SubcategoryB (3)
|__SubcategoryC (3)
folgendes:
_
|__Category1 (12)
|__SubcategoryA (3)
|__SubcategoryB (3)
|__SubcategoryC (3)
Hintergrund: Bei der Listenansicht von Category1 werden richtigerweise die Artikel aus unterliegende Kategorien ebenfalls angezeigt. Im Fall oben also 12 Artikel. Das Menü zeigt in Klammern aber nur 'seine eigene' Artikel an. Das verwirrt einige Leute.
Irgend eine Idee/Lösung?
vg Alex
vielen Dank für den tollen Beitrag!
Bei mir funktioniert auch alles soweit, allerdings bleibe ich an folgendem Punkt hängen.
<ul>
<li>1. Level (1)
<ul></ul>
</li>
</ul>
Er baut mir keine li in die zweite ul, um die Subkategorien anzeigen zu lassen. Woran könnte das liegen?
Viele Grüße und vielen Dank!
Nicki
Danke für dieses gute Script. Was mir noch fehlt: nur die jeweils aktive Kategorie und Subkategorie soll aufgeklappt werden. Leider kriege ich das nicht hin... Hättest du da eine Idee?
Das habe ich versucht:
if {
value.field = uid
equals.data = GP:tx_ttnews|cat
}
Aber so bald man dann in der zweiten Ebene ist, klappt das Menü wieder zu. UID und GP:tx_ttnews|cat stimmen da ja nicht mehr überein. Man müsste nachsehen ob GP:tx_ttnews|cat innerhalb der parent_cat ist...
Danke,
Thomas
Viele Grüße Bojo
ich habe noch eine Frage - ich habe dein Script in die tt_news.ts-Datei eingefügt und die IDs der Seiten für die Datensätze und für die Detailseite geändert. In der HTML-Vorlage muss ich aber noch sicherlich den oder die Marker einfügen, oder? Heißt der Marker COA? Ich bin leider ziemlich wenig mit Typo3 vertraut, deswegen frage ich schon so was Grundsätzliches. Oder geht es mit dem Typo3 6.2 doch schon ein Stück leichter?
Liebe Grüße,
Jan
Kann jemand helfen?