Skip to content

[Contao 5.3] UndefinedMethodError: In ModuleEventlistTags wird $this->getFilterTags() aufgerufen, Methode fehlt #108

@mandrael

Description

@mandrael

Umgebung

  • Contao: 5.3.x (getestet mit 5.3.37)
  • PHP: 8.1 / 8.2
  • Bundle: hschottm/tags 5.0.5
  • Modul/Klasse: Eventliste (Tags) – Hschottm\TagsBundle\ModuleEventlistTags

Schritte zum Reproduzieren

  1. hschottm/tags:^5.0.5 in einem Contao-5.3-Projekt installieren.
  2. Frontend-Modul Eventliste (Tags) anlegen und auf einer Seite ausgeben.
  3. 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.

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions