srhinow/training-plan-manager

Wöchentlicher Trainingsplan (Wochentag + Von–Bis + Gruppe) für das Contao CMS – schlanke Alternative zu wiederkehrenden Kalender-Events

Maintainers

Package info

gitlab.com/srhinow/training-plan-manager

Issues

Type:contao-bundle

pkg:composer/srhinow/training-plan-manager

Transparency log

Statistics

Installs: 6

Dependents: 0

Suggesters: 0

Stars: 0

0.4.0 2026-07-26 22:33 UTC

This package is not auto-updated.

Last update: 2026-07-26 20:37:48 UTC


README

Ein schlankes Contao-5-Bundle zur Verwaltung eines wöchentlichen Trainingsplans: Wochentag + Von–Bis + Gruppe, ohne die Umständlichkeit wiederkehrender Kalender-Events.

Gedacht für Vereine/Schulen mit festem Wochenrhythmus (z. B. Kampfsport, Fitness), bei denen der Kalender nur für echte Einzeltermine (Prüfungen, Ausflüge, Lehrgänge) zuständig bleiben soll.

Warum

Wiederkehrende Trainingszeiten als vollwertige Kalender-Events zu pflegen (Datum, Uhrzeit, Wiederholung, Ausnahmen) ist für Redakteure umständlich. Im Kern ist ein Trainingsplan aber nur ein fester Wochenplan. Dieses Bundle bildet genau das ab.

Funktionsumfang

  • Datenmodell tl_training_time: title, weekday (Mo–So), timeStart/timeEnd, trainingGroup (Fremdschlüssel auf tl_training_group), optional location/note, beliebig viele Ausfall-Zeiträume (cancellations, rowWizard), trainingMode, published.
  • Backend-Modul „Trainingszeiten": flache, sortierbare Liste, in Sekunden editierbar; Trainingsgruppen als eigene Einstellungs-Tabelle.
  • Betriebsart-Umschalter „Regelbetrieb ↔ Ferienbetrieb": ein Klick publiziert die Termine der Ziel-Betriebsart und blendet die der anderen aus. Slots mit trainingMode = always bleiben unberührt.
  • Frontend-Module (Kategorie „Trainingsplan"):
    • training_next – nächstes anstehendes Training
    • training_list – kommende Termine, nach Tag/Datum gruppiert (Markup wie die Contao-Event-Liste)
    • training_calendar – Wochenkalender Mo–So mit Vor/Zurück-Navigation
  • Insert-Tags: {{next_training_day}}, {{next_training_date}}, {{next_training_datetime}}.
  • iCalendar-Abo unter /training-plan/schedule.ics (siehe unten).

Kalender-Abo (iCal)

https://<domain>/training-plan/schedule.ics
https://<domain>/training-plan/schedule.ics?group=<gruppen-alias>

Die URL ist als Abonnement gedacht (Google Kalender „Per URL hinzufügen", Apple Kalender „Kalenderabo", Thunderbird „Netzwerk-Kalender") — nicht als einmaliger Download.

Jede Trainingszeit wird zu einem wiederkehrenden Termin (RRULE:FREQ=WEEKLY) statt zu einer Liste ausgerollter Einzeltermine. Das Abo läuft dadurch nicht nach ein paar Monaten leer, und die Kalender-App zeigt den Plan unbegrenzt weiter. Eingetragene Ausfall-Zeiträume erscheinen als EXDATE, verschwinden also auch im abonnierten Kalender.

Die Zeiten sind lokale Zeiten mit TZID, nie UTC — ein Training um 17:00 bleibt über den Sommer-/Winterzeit-Wechsel hinweg um 17:00. Die Zeitzone liegt als VTIMEZONE-Komponente bei, das Dokument ist also selbsttragend.

Ausgegeben werden nur veröffentlichte Trainingszeiten — der Umschalter Regelbetrieb/Ferienbetrieb wirkt damit automatisch auch auf das Abo. Die Termin-UIDs sind stabil (training-<id>@<domain>), Änderungen aktualisieren beim Abonnenten also den bestehenden Termin, statt einen zweiten anzulegen.

Trainingsfreie Zeiten

Ausfälle (Ferien, Feiertage, Einzelausfälle) werden ausschließlich am Trainingszeiten-Datensatz gepflegt – über die Ausfall-Zeiträume (cancellations). Es gibt bewusst keine Anbindung an Kalender aus contao/calendar-bundle: sie wäre eine zweite, konkurrierende Pflegestelle für dieselbe Information. Alle Ausgaben (Module wie Insert-Tags) berücksichtigen die Ausfälle damit einheitlich.

Installation

composer require srhinow/training-plan-manager
vendor/bin/contao-console contao:migrate   # legt tl_training_time + tl_training_group an

Datenmodell

weekday ist ISO-8601 kodiert (1 = Montag … 7 = Sonntag), passend zu date('N') für die „nächstes Training"-Berechnung. timeStart/timeEnd sind Contao-time-Felder (Unix-Timestamp auf dem Referenztag 1970-01-01). cancellations ist ein serialisiertes rowWizard-Array aus from/to-Datumswerten (ISO Y-m-d).

Entwicklung

composer install
composer run qa           # php-cs-fixer (Dry-Run) + PHPStan + PHPUnit
composer run cs-fix       # Coding-Standard anwenden
composer run unit-tests   # nur PHPUnit

Die Tests decken die Terminberechnung (TrainingScheduleCalculator) und das Parsen der Ausfall-Zeiträume (TrainingTimeModel) ab; sie laufen ohne Datenbank und ohne Contao-Framework. Die Zeitzone ist in phpunit.xml.dist auf Europe/Berlin festgenagelt, weil die Wochen-Schritte über Sommer-/Winterzeit-Wechsel hinweg korrekt bleiben müssen.

Lizenz

GPL-3.0-or-later · © Sven Rhinow