-
Notifications
You must be signed in to change notification settings - Fork 18
Description
Umgebung
- Contao: 5.3.x (getestet mit 5.3.37)
- PHP: 8.1 / 8.2
- Bundle:
hschottm/tags5.0.5 - Modul/Klasse: Eventliste (Tags) –
Hschottm\TagsBundle\ModuleEventlistTags
Schritte zum Reproduzieren
hschottm/tags:^5.0.5in einem Contao-5.3-Projekt installieren.- Frontend-Modul Eventliste (Tags) anlegen und auf einer Seite ausgeben.
- Im Modul einen Tag-Filter setzen (
tag_filter) oder die Seite mit?tag=…aufrufen.
Aktuelles Verhalten
Im Frontend erscheint eine Exception:
Symfony\Component\ErrorHandler\Error\UndefinedMethodError:
Attempted to call an undefined method named "getFilterTags" of class "Hschottm\TagsBundle\ModuleEventlistTags".
at vendor/hschottm/tags/src/Resources/contao/modules/ModuleEventlistTags.php:48
Erwartetes Verhalten
Die Eventliste rendert ohne Fehler und filtert – sofern konfiguriert – nach Tags.
Ursache
In ModuleEventlistTags wird die Methode $this->getFilterTags() verwendet, ist aber in der Klasse nicht implementiert.
Das führt in Contao 5.3 zu einem UndefinedMethodError, sobald ein Tag-Filter greift.
Lösungsvorschlag (minimaler Fix)
Die fehlende Methode getFilterTags() als geschützte Hilfsmethode ergänzen.
Sie liest das Modulfeld tag_filter (kommagetrennt) und liefert die passenden Event-IDs (tl_calendar_events.id) über tl_tag.tid als eindeutiges, sortiertes int-Array zurück.
Alle übrigen Logik-Teile bleiben unverändert.
Patch (unified diff)
Datei im Repo:
src/Resources/contao/modules/ModuleEventlistTags.php
diff --git a/src/Resources/contao/modules/ModuleEventlistTags.php b/src/Resources/contao/modules/ModuleEventlistTags.php
index 2c2c2c2..3d3d3d3 100644
--- a/src/Resources/contao/modules/ModuleEventlistTags.php
+++ b/src/Resources/contao/modules/ModuleEventlistTags.php
@@ -119,6 +119,55 @@ class ModuleEventlistTags extends ModuleEventlist
return $arrAllEvents;
}
+ /**
+ * Liefert Event-IDs (tl_calendar_events.id), die dem im Modul gesetzten tag_filter entsprechen.
+ *
+ * @return int[] Eindeutige, sortierte Liste von Event-IDs
+ */
+ protected function getFilterTags(): array
+ {
+ $tagids = [];
+
+ $filter = (string) $this->tag_filter;
+ if ($filter === '') {
+ return $tagids;
+ }
+
+ $tags = preg_split('/,/', $filter) ?: [];
+ $tags = array_filter(array_map('trim', $tags));
+
+ if (!$tags) {
+ return $tagids;
+ }
+
+ $db = Database::getInstance();
+
+ foreach ($tags as $tag) {
+ // tl_tag.tid referenziert den Primärschlüssel des Datensatzes (hier: tl_calendar_events.id)
+ $ids = $db->prepare('SELECT tid FROM tl_tag WHERE from_table = ? AND tag = ?')
+ ->execute('tl_calendar_events', $tag)
+ ->fetchEach('tid');
+
+ if (!empty($ids)) {
+ $tagids = array_merge($tagids, $ids);
+ }
+ }
+
+ // Deduplizieren, auf int casten, sortieren
+ $tagids = array_values(array_unique(array_map('intval', $tagids)));
+ sort($tagids);
+
+ return $tagids;
+ }
+
/**
* Generate the module
*/Verifikation nach dem Fix
- Ohne
tag_filter: Eventliste rendert normal. - Mit
tag_filter(z. B.foo,bar): Eventliste rendert und zeigt nur die passenden Events. - Zusätzlicher URL-Parameter
?tag=baz: weiterhin kein Fehler, Filterung wie erwartet.
Commit-Nachricht
fix(EventlistTags): fehlende getFilterTags() implementiert (Contao 5.3)
In ModuleEventlistTags wird $this->getFilterTags() verwendet, war aber nicht implementiert.
Dies führte in Contao 5.3 zu einem UndefinedMethodError beim Rendern der Eventliste mit Tag-Filter.
Die Methode liefert nun die passenden tl_calendar_events.id-Werte (über tl_tag.tid) auf Basis
des Modulfeldes "tag_filter" zurück (unique, sortiert). Sonstige Logik unverändert.
Danke
Danke fürs Pflegen des Bundles! Der Patch ist minimal-invasiv und behebt den Crash in Contao 5.3. Bei Bedarf reiche ich das gern direkt als PR ein.