Nachdem ich bisher viel positives Feedback für mein TypoScript-CATMENU für tt_news bekommen habe, ist es nun Zeit geworden, einen Nachfolger für tx_news auf die Beine zu stellen. Natürlich auch wieder mit News-Counter pro Kategorie.
tt_news ist tot, lange lebe tx_news. Ganz so dramatisch ist es nicht, aber tt_news verliert mehr und mehr Bedeutung zugunsten von tx_news. Vor einiger Zeit habe ich hier ein flexibles Kategorie-Menü mit News-Counter für tt_news erstellt und dafür sehr viel Lob bekommen. Nachdem ich aber in meiner eigenen Website und in sämtlichen Kundenprojekten nur noch tx_news einsetze, ist es notwendig geworden, eine neue, angepasste Version zu erstellen, welche die gleichen Features bietet.
Für diejenigen, welche mein CATMENU noch nicht kennen sollten, hier nochmal kurz die Features:
- maximale Flexibilität durch Verwendung von reinem TypoScript
- Auflistung aller News-Kategorien, auch über mehrere Ebenen
- Zählung aller zugewiesenen News pro Kategorie
- Links zum Filtern nach Kategorien
Ich habe wieder bewusst darauf geachtet, möglichst viele Kommentar zu hinterlegen, so dass auch TYPO3-Anfänger wenig Probleme haben sollten, die Zusammenhänge zu verstehen.
# zu erst der Marker für 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 = sys_category
select {
# hier muss die pid eures News-Sysordners rein, bzw. wo die News-Kategorien gespeichert sind
pidInList = 3
orderBy = title
where = parent=0 AND deleted=0 AND hidden=0
}
renderObj = COA
renderObj {
# wrappe jede gefundene Hauptkategorie als Listenelement
wrap = <li>|</li>
# überschreibe den vorherigen Wrap ...
wrap.override = <li class="active">|</li>
# ... nur, wenn ...
wrap.override.if {
# ... eine News-Kategorie bereits ausgewählt wurde und per GET/POST ermittelt werden kann
value.data = GP:tx_news_pi1|overwriteDemand|categories
# und dieser ermittelte Wert der aktuellen uid gleicht
equals.field = uid
}
# zeig mir den Kategorie-Titel und mache einen Filter-Link daraus
10 = TEXT
10 {
# das title-Feld soll als Text angezeigt werden (könnte man auch description... verwenden)
field = title
typolink {
# verlinke zu der Seite mit der News-Auflistung (Listenansicht)
parameter = 34
title.field = title
# füge den GET-Parameter für die ausgewählte Kategorie hinzu
additionalParams.dataWrap = &tx_news_pi1[overwriteDemand][categories]={field:uid}
# cHash mit übergeben fürs Caching
useCacheHash = 1
}
}
# zeig mir einen Counter aller News-Einträge in dieser Kategorie
20 = CONTENT
20 {
table = sys_category
select {
# hier wieder der Sysordner aller News-Einträge und -Kategorien
pidInList = 3
join (
sys_category_record_mm ON (sys_category.uid = sys_category_record_mm.uid_local)
JOIN tx_news_domain_model_news ON (tx_news_domain_model_news.uid = sys_category_record_mm.uid_foreign)
)
andWhere.dataWrap (
(sys_category.uid={field:uid})
AND tx_news_domain_model_news.deleted=0 AND tx_news_domain_model_news.hidden=0
AND sys_language_uid={TSFE:sys_language_uid}
)
# führe 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>
}
}
# zeig mir alle Unterkategorien der aktuellen Kategorie an
30 = CONTENT
30 {
stdWrap {
# führe den Abschnitt nur aus, wenn in der Select-Abfrage ein Wert gefunden wurde
required = 1
wrap = <ul>|</ul>
}
table = sys_category
select {
pidInList = 3
orderBy = title
andWhere.dataWrap = parent={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
# }
}
}
}
}
}
Wie schaut das nun in Aktion aus? Hier im Kategorie-Menü auf der Seite "News" könnt ihr es euch in der rechten Sidebar ansehen. Ansonsten wünsche ich allen viel Spaß damit und bin wie immer offen für Feedback :)
Es wird bei mir der Einfachheit halber mit einem DCE-Modul zur Kategorieauswahl zum Einsatz kommen (http://aikantink.de/y4y/blog-aktuelles-snippets/blog-detailansicht/news/fiedomedia-catmenu-fuer-tx-news-mit-counter-in-dce-mit-kategorieauswahl/
Allerdings wird bei mir der span mit dem Counter für die News nicht im a-Tag generiert, sondern dahinter. Auf Deiner Beispielseite ist das anders.
Auf was muss ich da achten?
meineDomain.de/news/?tx_news_pi1%5BoverwriteDemand%5D%5Bcategories%5D=12&cHash=085fffec7addb1c707d87a812eda03bf
obwohl ich Realurl verwende!
Sollte ich in der Realurl_config noch was eintragen?
LG Alex
danke für das Script - genau das, was ich gesucht habe!
Allerdings habe ich eine mehrsprachige Website und der Counter funktioniert nicht korrekt. Er zählt alle vorhandenen/übersetzten Artikel unabhängig von der Sprache:
select {
# hier wieder der Sysordner aller News-Eintraege und -Kategorien
pidInList = 14
join = sys_category_record_mm ON (sys_category.uid = sys_category_record_mm.uid_local)
JOIN tx_news_domain_model_news ON (tx_news_domain_model_news.uid = sys_category_record_mm.uid_foreign)
andWhere.dataWrap = (sys_category.uid={field:uid})
AND tx_news_domain_model_news.deleted=0 AND tx_news_domain_model_news.hidden=0
AND sys_language_uid={TSFE:sys_language_uid}
languageField = sys_language_uid
# fuehre einen count durch und speichere das Ergebnis in "counter"
selectFields = count(*) AS counter
}
Hast du eine Idee, woran das liegen könnte?
Danke und Grüße,
Stefanie
Bei einem Artikel setze ich immer nur die Subkategorie ohne die Parent-Cat. zusätzlich zu setzen.
Hast Du eine Idee, woran das liegen kann?
Ich habe TYPO3 V8.7 und news 5.3.2 im Einsatz.
In 7.6.18 mit news 5.3.3 oder auch news 6.0.0 funktioniert es.
Mir ist noch nicht ganz klar, warum es nicht geht. Die Zuordnung der Unterkategorien funktioniert nicht. Die Unterkategorien (und die Hauptkategorien) werden bei mir bei jeder Hauptkategorie wiederholt.
Ein Problem hab ich leider dennoch und komme nicht auf die Lösung.
Ich habe nur den Counter verwendet um Anzahl der Artikel aus einer einzigen Kategorie aus zu geben. Der Counter zählt leider sämtliche Artikel der betreffenden Kategorie (ohne berücksichtigung der Sprache) und ich wollte die Datenbankabfrage noch um "starttime kleiner jetzt" und "endtime größer jetzt" erweitern.
Eigentlich ganz einfach, aber ich komme einfach nicht auf die Lösung. Könnten Sie mir da kurz weiter helfen? Wär echt super :)
Vielen Dank
Leider scheint es mit TYPO3 8.7 und news 6.3 nicht korrekt zu zählen.
Es zählt alle News anstatt nur die in der jeweiligen Kategorie.
Unterkategorien werden keine verwendet.
Kann da jemand weiterhelfen?
...
# zeig mir den Kategorie-Titel und mache einen Filter-Link daraus
10 = COA
10 {
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 = {$news.aktuell.listid}
title.field = title
# fuege den GET-Parameter fuer die ausgewaehlte Kategorie hinzu
additionalParams.dataWrap = &tx_news_pi1[overwriteDemand][categories]={field:uid}
# cHash mit uebergeben fuers Caching
useCacheHash = 1
}
}
# zeig mir einen Counter aller News-Eintraege in dieser Kategorie
20 = CONTENT
20 {
table = sys_category
select {
# hier wieder der Sysordner aller News-Eintraege und -Kategorien
pidInList = {$news.aktuell.pid}
join = sys_category_record_mm ON (sys_category.uid = sys_category_record_mm.uid_local)
JOIN = tx_news_domain_model_news ON (tx_news_domain_model_news.uid = sys_category_record_mm.uid_foreign)
andWhere.dataWrap = (sys_category.uid={field:uid}) AND tx_news_domain_model_news.deleted=0 AND tx_news_domain_model_news.hidden=0 AND tx_news_domain_model_news.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>
}
}
}
# wrap= |
stdWrap.typolink = <li>|</li>
...
genau das Menü kann ich gut gebrauchen, habe aber auch das Problem, dass die Zeile im Bereich Counter mit dem "andWhere.dataWrap" scheinbar komplett ignoriert wird:, meine Version: TYPO3 8.7.27, News7.20:
20 = CONTENT
20 {
table = sys_category
select {
# hier wieder der Sysordner aller News-Einträge und -Kategorien
pidInList = XXX
join = sys_category_record_mm ON (sys_category.uid = sys_category_record_mm.uid_local) JOIN tx_news_domain_model_news ON (tx_news_domain_model_news.uid = sys_category_record_mm.uid_foreign)
andwhere.dataWrap = (sys_category.uid={field:uid}) AND tx_news_domain_model_news.deleted=0 AND tx_news_domain_model_news.hidden=0 AND sys_language_uid={TSFE:sys_language_uid}
# führe 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>
}
}
"join" steht in einer Zeile, in der nächsten dann "andWhere.dataWrap". Wenn ich die Zeile mit "andWhere" auskommentiere, ändert sich nix.
Ansonsten: Großes Lob!
Es funktioniert, der Counter gibt aber für jede Kategorie immer die Gesamtzahl von Nachrichten.
Was kann ich machen?
Danke!