Contao extension [mae_event_categories]

Kategorien verwalten
Kategorien verwalten

Wenn Sie viele Veranstaltungen im System haben, die über Veranstaltungsarchive nicht ausreichend gruppiert werden können, bietet diese Erweiterung zusätzliche Kategorien zum Filtern im eventlist Frontendmodul sowohl über das Backend, als auch über ein Kategoriefilter Frontendmodul.

mae_event_categories fügt dem Eventmodul eine neue, globale Operation hinzu, die die Definition einer nicht-hierarchischen Kategorienliste erlaubt.
Einer Veranstaltung können beliebig viele Kategorien zugewiesen werden.
Die Module Veranstaltungsliste, Kalender und Eventmenü werden dahingehend erweitert, dass bei Bedarf nur bestimmte Kategorien von Veranstaltungen aufgelistet werden.
Der Zugriff auf die Kategorieverwaltung kann über Berechtigungen gesteuert werden.

Der getAllEvents hook wird verwendet, um die betreffenden Veranstaltungen zu filtern.
Veranstaltungslisten, bei denen keine Kategorien ausgewählt werden, verhalten sich wie im Contao-Standard üblich.

Das nachfolgende Beispiel zeigt die ein Eventlisten-modul mit zugehörigem Kategoriefilter.

Beispiel Event List

(Sonntag)
(Montag)
(Dienstag)

Beispiel Kategoriefilter

Kategoriefiltermodul

Modul - Event - Kategoriefilter
Moduleinstellungen

Seit der Version 1.1 gibt es ein zusätzliches Modul "Event Kategoriefilter" im Bereich "Events", das es dem Besucher erlaubt, eine Eventliste selbst nach bestimmten Kategorien zu filtern. Üblicherweise wird dieses Modul in der Seitenleiste neben der Eventliste platziert. Die Konfiguration des Moduls gestaltet sich wie folgt:

  • Eventliste
    Optionale Angabe der Eventliste, die gefiltert werden soll. Falls am Listenmodul eine Kategorieauswahl konfiguriert ist, wird das Filtermodul diese Auswahl für sich übernehmen.
  • Eventkategorien
    Hier kann dem Filtermodul optional eine feste Liste von filterbaren Kategorien zugewiesen werden und deren Reihenfolge festgelegt werden. Die Kategorieauswahl des Listenmoduls wird in diesem Fall ignoriert.
  • Filter URL Parameter
    Ab der Version 1.4.0 RC1 vom 29.04.2016 kann der GET-Parameter zum Filtern der Kategorien nun selbst bestimmt werden. Zusätzlich wurde an der Kategorie noch ein Aliasfeld hinzugefügt, damit die komplette Filter-URL auf die eigenen Wünsche angepasst werden kann.
  • Nur Kategorien aus zukünftigen Events auflisten
    Ab der Version 1.5.0 kann mit dieser Option eingestellt werden, dass nur nach Kategorien gefiltert werden kann, die tatsächlich einem zukünftigen Event zugeordnet sind. Dabei spielt es keine Rolle, in welchem Archiv sich das Event befindet. Es handelt sich hier um eine einfache Abfrage über alle existierenden Events.

Falls weder am Listenmodul, noch am Filtermodul Kategorien ausgewählt werden, werden dem Besucher alle vorhandenen Kategorien zur Auswahl angeboten. Um die Darstellung der Kategorien im Filtermodul flexibel zu gestalten, können nun an der Kategorie CSS ID/Klasse(n) definiert werden.

Kategorien im Frontend anzeigen

um die, einer Veranstaltung zugewiesenen Kategorien in der Veranstaltungsliste, bzw. den Veranstaltungsdetails im Frontend anzuzeigen, kann man die diversen Contao-Templates für Veranstaltungen (event_*) wie im nachfolgenden Beispiel beschrieben anpassen.
In der vorherigen Version der Doku war bis zum 14. April 2016 ein Fehler. Den ich jetzt behoben habe.
Das folgende Beispiel zeigt das Standard-Template "event_teaser.html5" aus Contao 3.5.0, in das ich die Zeilen 19-33 eingefügt habe:

<?php if ($this->header): ?>
  <div class="header<?= $this->classHeader ?>">
    <span class="date"><?= $this->firstDate ?></span><?php if ($this->firstDay): ?> <span class="day">(<?= $this->firstDay ?>)</span><?php endif; ?>
  </div>
<?php endif; ?>

<div class="event layout_teaser<?= $this->classList ?>">

  <?php if ($this->details): ?>
    <h2><a href="<?= $this->href ?>" title="<?= $this->title ?> (<?php if ($this->day) echo $this->day . ', '; ?><?= $this->date ?><?php if ($this->time) echo ', ' . $this->time; ?>)"<?= $this->target ?>><?= $this->link ?></a></h2>
  <?php else: ?>
    <h2><?= $this->title ?></h2>
  <?php endif; ?>

  <?php if ($this->time || $this->span): ?>
    <p class="time"><?= $this->time . $this->span ?></p>
  <?php endif; ?>

  <!-- ab hier folgt der ergänzende Code zur Anzeige der Kategorien -->
  <?php if ($this->categories): ?>
    <div class="categories">
        <ul>
        <?php
            $cat_ar = deserialize($this->categories, true);
            foreach ($cat_ar as $cat_id) {
                $objCat = Database::getInstance()->prepare("SELECT title FROM tl_mae_event_cat WHERE id = ? LIMIT 1")->execute($cat_id);
                echo "<li>" . $objCat->title . "</li>";
            }
        ?>
        </ul>
    </div>
  <?php endif; ?>
    <!-- hier endet der ergänzende Code zur Anzeige der Kategorien -->

  <div class="teaser">
    <?= $this->teaser ?>
  </div>

  <?php if ($this->details): ?>
    <p class="more"><a href="<?= $this->href ?>" title="<?= $this->readMore ?>"<?= $this->target ?>><?= $this->more ?> <span class="invisible"><?= $this->link ?></span></a></p>
  <?php endif; ?>

</div>

Feedback

Kommentar von Peter |

Sehr interessante Erweiterung!
Gibt es eine Möglichkeit die zugewiesenen Kategorien im Frontend auszugeben?

Danke für die Hilfe

Antwort von Martin Eberhardt

Hallo Peter,
danke für das Lob.
Die Möglichkeit ist leider nicht automatisch gegeben, man kann aber seine event templates in Contao selbst so anpassen, dass die Kategorien ausgegeben werden. Ich kann ja auf dieser Seite mal ein Beispiel veröffentlichen (in den nächsten Tagen). Ich schreib Dir dann eine Mail.

Kommentar von Daniel |

Macht genau was es soll! Danke Dir dafür!!

Antwort von Martin Eberhardt

Dankeschön!

Kommentar von Peter |

Hallo Martin,

ich hätte jetzt noch eine Idee für diese geniale Erweiterung.
Wäre es möglich die Erweiterung so zu erweitern, dass man die Kategorien ineinander verschachteln kann, also Unterkategorien anzulegen?

Grüße

Antwort von Martin Eberhardt

Hallo Peter,
ja, wäre mir auch lieber, aber ich kenne keine Möglichkeit, eine solche hierarchische Liste im Backend zur Auswahl darzustellen. Ich kenne jedenfalls keine. Da gibt es zwar die widget_tree_picker extension, die auch von der news_categories Erweiterung verwendet wird, aber ich möchte wegen der Hierarchien eigentlich keine Abhängigkeit von einer anderen Erweiterung herstellen. Man kann sich ja so behelfen, dass man Kategorien entsprechend benennt, um eine Art Hierarchie ersichtlich zu machen, z.B. "Musik", "Musik - klassisch", ...

Kommentar von Georg |

Super Erweiterung! Ist es nicht möglich die Kategorien über einen Hook an das Template zu übergeben? Eine Array mit allen Kategorien des Termins wäre doch überragend :-)
https://docs.contao.org/books/api/extensions/hooks/getAllEvents.html

Antwort von Martin Eberhardt

leider kann man in dem Hook nur Reihenfolge und Auswahl von events vornehmen, aber keine Daten mit geben. Mein Code-Beispiel funktioniert ja jetzt zum Glück auch endlich. Dann muss man diese paar Zeilen halt ins template rein machen, sorry.

Kommentar von Wagner |

Hallo Martin,

tolle Erweiterung. Leider wird bei mir bei einem Event dem drei Kategorien (A,B,C) zugeordnet sind nur die erste Kategorie dreimal (A,A,A) ausgegeben.

Hast Du da eine Idee?

Antwort von Martin Eberhardt

ah jetzt ja... da war ein Fehler im Code-Schnipsel. Ich hab ihn korrigiert.
Danke für die Info!

Kommentar von Martin Eberhardt |

Habe heute die Version 1.4.0 RC1 veröffentlicht. Die Reihenfolge der Kategorien im Filtermodul kann jetzt manuell angepasst werden. Außerdem kann man der Kategorie einen Alias verpassen und am Filtermodul der GET-Parameter bestimmen. Somit kann man jetzt freundlichere URLs generieren, z.B.:
http://www.martin-eberhardt.com/mae_event_categories/kategorie/feiertage.html

Kommentar von Marco |

Vielen Dank für Deine Erweiterung.
Ich habe auf meiner Seite den Filter eingebunden und es funktioniert auch alles prima.
Eine Sache könnte man noch verbessern. Wenn auf einer Seite der Filter eingebunden ist, sollten auch nur die Kategorien angezeigt werden die auf der Seite vorkommen. Wenn man auf eine Kategorie klickt und es dazu keinen Eintrag gibt, kommt die Meldung "Es gibt keine Events in diesem Monat". Ich würde dieses Feature auch gerne finanziell unterstützen.

Antwort von Martin Eberhardt

Hallo Marco,
die Eventliste hat ja viele Optionen, die bestimmen, ob ein Eintrag auf einer Seite erscheinen darf und das Filtermodul müsste die Abfrage der Liste quasi nachbauen, um heraus zu finden, welche Kategorien vorkommen könnten. Das EInzige, das ich mir vorstellen könnte wäre, abzufragen, ob eine Kategorie in irgendeiner zukünftigen Veranstaltung hinterlegt ist und sie nur in diesem Fall im Filter anzubieten. Würde Dir das weiter helfen?
Das Filtermodul bekäme dann eine neue Option "Nur Kategorien aus zukünftigen Events auflisten". Wenn ich Dich richtig verstanden habe, geht es ja um Kategorien die in der Eventliste zwar erlaubt sind, aber derzeit einfach an keinem Event vergeben sind, richtig?

Kommentar von Marco |

Hallo Martin,
der Filter müsste prüfen, ob eine Kategorie in einer zukünftigen Veranstaltung hinterlegt ist und sie nur in diesem Fall im Filter auf in der Listenansicht anzubieten. Das sollte mein Problem lösen.
Grüße Marco

Antwort von Martin Eberhardt

Hallo Marco,
habe gerade die neue Version 1.5.0 veröffentlicht. Da ist es drin.

Kommentar von Marco |

Hallo Martin, wow, dass ging ja schnell. Vielen Dank dafür. Habe es gerade getestet und es funktioniert. Grüße Marco

Kommentar von SB |

Hallo Martin,

Vielen Dank für Deine Erweiterung. Ich habe alles soweit angebaut und es funktioniert. Ich würde gerne das "alle anzeigen" im Filtermodul abändern, konnte es aber in den Dateien des Languages-Ordner nirgends finden. Und ich würde gerne den "Filter URL Parameter" in einem Modul für einen Linkpfad ausgeben. Könntest Du mir bei den beiden Sachen weiterhelfen.

Vielen Dank schon mal.
Stefan

Antwort von Martin Eberhardt

Hallo Stefan,

trage dies in system/config/langconfig.php ein und ändere die Texte entsprechend:
$GLOBALS['TL_LANG']['tl_mae_event_cat']['all'] = array('Alle anzeigen', 'Alle Kategorien anzeigen');

Die zweite Frage habe ich nicht verstanden.

Viele Grüße,
Martin

Kommentar von Markus |

Hallo Martin,

erstmal vielen Dank für die praktische Erweiterung. Doch ich habe eine Frage:
Kann ich im Modul Eventliste die CSS-Klasse ausgeben?
Ich möchte die Listenelemente je nach Kategorie in unterschiedlichen Farben darstellen.

Viele Grüße
Markus

Antwort von Martin Eberhardt

Hallo Markus,

dazu müsstest Du das Listentemplate anpassen. Die zugewiesenen Kategorien bekommst Du folgendermaßen:

$cat_ar = deserialize($this->categories, true);
foreach ($cat_ar as $cat_id) {
    $objCat = Database::getInstance()->prepare("SELECT title FROM tl_mae_event_cat WHERE id = ? LIMIT 1")->execute($cat_id);
    echo "<li>" . $objCat->title . "</li>";
}

 

anstatt des title würdest Du hier cssId und/oder cssClass benötigen, wobei cssClass wiederum ein array ist.

Viele Grüße,
Martin