Typo3-Extension cal
Bisher habe ich auf mehreren Seiten die Kalender-Extension jw-calendar eingesetzt. Die wird aber seit Jahren nicht weiterentwickelt und man muss ständig eigene Änderungen vornehmen, damit die Extension auf neueren Typo3-Installationen lauffähig bleibt.
Eine gute Alternative scheint Calendar_Base (cal) zu sein. Diese Extension verfügt über sehr viele Funktionen und wird fleißig weiterentwickelt. Wichtig finde ich auch die Funktion, dass aus dem Frontend heraus Termine in den Kalender eingetragen werden können.
Bei cal wird eine 104-seitige Dokumentation mitgeliefert. Wie immer ist es aber so, dass genau die Dinge, die mich interessieren, da nicht abgehandelt werden. Es fehlen generell Beispiele. In der Doku wird eine Reihe von zusätzlichen Extensionen vorgestellt, die man zusätzlich in cal integrieren kann. Wenn man hier anfängt zu lesen ...
Für Beispiele und Anleitungen ist eigentlich immer das Web gut, da cal aber intensiv entwickelt wird, hat sich hier so viel verändert, dass die meisten Anleitungen nicht mehr passen. Von cal gibt es sehr unterschiedliche Versionen, aktuell ist im Frühjahr 2009 die Version 1.1.1.
Die meisten Anleitungen, auch die oft referenzierte unter http://www.sk-typo3.de/Einrichtung-vom-Kalender-Calendar.174.0.html beziehen sich auf Versionen bis 0.12. Mit der Version 0.13 wurde die Konfiguration so massiv verändert, dass alle Beispiele von dort nicht mehr funktionieren. Bei den Versionsnummern hat cal mit der Umstellung auf php5 den Sprung auf 1.x vorgenommen, die letzte Version davor war 0.17.3. Eine aktuelle Anleitung würde man normalerweise bei den Entwicklern suchen (http://webempoweredchurch.com/support/howtos/), aber die haben ihre Seite überarbeitet und viele Links hierher stimmen nicht mehr.
Hinweis: Das Front-End Editing hat bei mir mit den Versionen 1.1.0 und 1.1.1 nicht klappen wollen. Bei den Versionen 0.17.3 und 1.0.0 war es dagegen unproblematisch. Diese Erkenntnis hat mich jetzt etwa 10 Arbeitsstunden gekostet, da ich den Fehler erst bei mir gesucht habe und nicht bei der Software. Zum Glück sind auch die alten Versionen noch verfügbar http://typo3.org/fileadmin/ter/c/a/cal_1.0.0.t3x und http://typo3.org/fileadmin/ter/c/a/cal_0.17.3.t3x . Die neue Version 1.2.0 scheint auch wieder zu funktionieren, man muss sie nur direkt aus dem CVS http://svn.webempoweredchurch.org/snapshots/show/calendar laden.
Im Prinzip ist hier, wie es oft bei Typo3, tolle Funktionen, aber nicht ausreichende Dokumentation.
Ich will im Folgenden versuchen zu dokumentieren, was ich über cal herausbekommen habe. Dabei helfen zwei Seiten, die ich nach langer Suche doch noch gefunden habe:
Installation
Die Installation von cal ist eigentlich recht einfach, wobei es bei mir nicht direkt über das TER klappte. Ich habe also die Extension über http://typo3.org/extensions/repository/view/cal/current/ geladen und dann über den Erweiterungs-Manager über Import Extensions und Upload Extension file installiert und anschließend auch aktiviert. Dazu musste ich übrigens in der /etc/php5/apache2/php.ini einen Schalter anpassen:
upload_max_filesize = 8M
die Extension hat etwas mehr als 3MB und voreingestellt waren hier 2MB. Ich hatte vorher schon in der gleichen Datei die erlaubte Speichermenge erhöht:
memory_limit = 64M
In der Dokumentation wird ausdrücklich darauf hingewiesen, dass die Extension tt_address vorher installiert sein muss, wenn man diese auch nutzen möchte. Vermutlich nimmt cal bei der Installation Änderungen an tt_address vor. Die Extension tt_address ist aber nicht notwendig für den Betrieb von cal.
Empfohlen werden zusätzlich noch die Erweiterungen:
- Gabriel TYPO3 Arch Angel (gabriel)
- WEC Map (wec_map)
- Captcha Library (captcha)
- Partner Management (partner)
- Date selector library (rlmp_dateselectlib)
- static-info-tables
- date2cal
Wirklich nützlich ist dabei, zumindest am Anfang, nur die Date selector library. Hier ist aber ein Fehler (Version 0.1.8) im Quelltext vorhanden, der bewirkt, dass die Spracheinstellungen ignoriert werden. In der Datei ext/rlmp_dateselectlib/class.tx_rlmpdateselectlib.php muss ab Zeile 85 zweimal this-> ergänzt werden.
// Check if another language than 'default' was selected
$this->LLkey = 'default';
if ($GLOBALS['TSFE']->config['config']['language'] && $GLOBALS["TSFE"]->config["config"]["language"] != 'en') {
$this->LLkey = $GLOBALS['TSFE']->config['config']['language'];
}
Zusätzlich waren bei mir alle Umlaute in der Datei locallang.php falsch kodiert. Musste ich im Quelltext jeweils korrigieren.
Nach der Installation von cal kann es sein, dass im Backend keine Inhalte mehr zu sehen sind. Das liegt dann daran, dass die Backend-Komponenten von cal auf lokale PEAR-Komponenten zugreifen wollen und diese nicht über den Standardpfad erreichbar sind. Entweder erweitert man die Einstellung
php_admin_value include_path "/srv/www/..."
entsprechend, oder man kommentiert diese Zeile ganz aus, wodurch alle Pfade zulässig werden.
Einrichten von cal
Die Grundeinrichtung von cal beginnt damit, die notwendigen Seiten einzurichten. Im Prinzip kann cal mit einer einzigen Seite auskommen, auf der dann alle möglichen Ansichten (views) des Kalenders untergebracht sind. Die cal Anleitung beschreibt aber einen Aufbau, bei dem jeder View auf einer eigenen Seite liegt. Dann macht es Sinn auch einen zusätzlichen Sysordner anzulegen, in dem die Kalender-Daten untergebracht sind.
Arbeitet man mit mehreren Seiten, so sollte man mit einer Startseite beginnen und die anderen Seiten als Unterseiten einrichten, das ergibt etwas folgenden Aufbau im Seitenbaum:
Kalender |-Kalender-Daten (Sysordner) |-Monatsansicht |-Wochenansicht |-Ereignisansicht |-Termineingabe
Vor den nächsten Schritten muss man unbedingt ein paar Daten vorbereiten. Dazu klickt man im Backend-Menü von Typo3 auf Liste und dann auf den Sysordner im Seitenbaum und wählt aus dem Kontextmenü Neu aus, worauf folgende Auswahl erscheint:
Bevor man den ersten Termin eintragen kann, muss man hier erst einmal einen Kalender und mindestens eine Kalender Kategorie anlegen. Das geht gan einfach, indem an die entsprechende Funktion anklickt.
Beim Kalender muss man eigentlich nur den Kalendernamen angeben:
Ein Kalender ohne Besitzer ist öffentlich. Insofern sollte man hier keinen Besitzer angeben, wenn der Kalender im Web öffentlich sein soll. Statt einen Typo3 eigenen Kalender zu nutzen Standard Kalender (Datenbank) könnte man auch Externer Kalender oder ICS Datei einbinden wählen.
Wenn der Kalender eingerichtet ist, dann geht es an die Kategorien.
Auch hier ist wenig einzutragen, vor allem der Name der Kategorie und der zugehörige Kalender ist auszuwählen. Man kann hier anscheinend auch Unterkategorien zu vorhandenen Kategorien anlegen, recht flexibel das System.
Das Formular für die Eingabe von Kalenderdaten ist dann aber deutlich umfangreicher:
Es gibt sehr viele Eingabemöglichkeiten, die sich auf insgesamt 6 Tabs verteilen, im Prinzip sollten die Felder aber einigermaßen selbsterklärend sein.
Die Kalender-Seiten
Nach diesen Vorbereitungen kann man daran gehen, den Kalender in die vorbereiteten Seiten einzubinden. Dazu legt man zuerst ein Erweiterungstemplate an, auf der Kalender-Startseite. Dazu wählt man im Typo3-Menü die Funktion Template und dann im Seitenbaum die Startseite des Kalenders.
Hier wählt man dann Click here to create an extension template aus, worauf sich folgendes Bild ergibt:
Das sieht noch recht übersichtlich aus, aber es fehlen auch wichtige Einstellmöglichkeiten, die erst nach der Auswahl von Click here to edit whole template record erscheinen.
Wichtig ist hier, dass man im Reiter Enthält die notwendigen Templates hinzufügt, sonst erscheint später keinerlei Ausgabe auf den Seiten. Notwendig sind auf alle Fälle:
- CSS-based Template (cal)
- Default CSS styles (cal)
Wenn auch Webeingaben möglich sein sollen, dann auch
- Fe-Editing (cal)
Will man das Front-Editing erlauben, so muss im Feld Konstanten des Tabs Allgemein mindestens die Zeile
plugin.tx_cal_controller.rights.edit = 1
vorhanden sein.
Nach diesen Vorbereitungen kann man daran gehen, das Kalender-Plugin in die Seiten zu integrieren. Dazu wählt man im Typo3-Menü Seite und dann im Seitenbaum die Startseite des Kalenders und wählt dann Seiteninhalt anlegen aus. Als Element wählt man unter Plug-Ins dann Kalender aus, worauf wieder ein Dialog mit mehreren Tabs erscheint.
Im Reiter Allgemein kann man eine Überschrift angeben, wenn man möchte. Am umfangreichsten ist der Reiter Plugin, hier kann eine Vielzahl von Einstellungen vorgenommen werden.
Wichtig sind hier die erlaubten Ansichten, zwischen diesen kann dann im Frontend ausgewählt werden und vor allem auch der Ausgangspunkt, also die Seite, die die Datensätze beinhaltet.
Hat man vergessen den Ausgangspunkt einzutragen, so bekommt man beim Aufruf des Kalenders im Frontend die Mitteilung:
Fatal error: Call to a member function getHookObjectsArray() on a non-object in /var/www/cms/typo3conf/ext/cal/controller/class.tx_cal_controller.php on line 2458
Wenn man keinen Fehler gemacht hat, dann sollte im Frontend jetzt der Kalender sichtbar sein, wobei das etwas dauern kann, so richtig schnell ist der Kalender jedenfalls nicht.
Falls im Kalender jetzt die Spracheinstellungen oder der Zeichensatz nicht richtig sind (im März fällt das besonders auf) muss man überprüfen, ob im Standard-Template die Zeilen:
config.language = de config.renderCharset = utf-8
vorhanden sind und die ggf. ergänzen.
Mehrere Ansichten auf der Startseite sind möglich, im Beispiel sind aber Unterseiten für spezielle Ansichten vorhanden. Also soll die Ereignisansicht auf die dafür vorgesehene Seite gebracht werden.
Dazu muss man auf der Seite natürlich das Plugin entsprechend einfügen und nur eine Ansicht, nämlich Ereignis-Ansicht erlauben. Von der Einstiegsseite aus erfolgt dann die Verknüpfung über den entsprechenden Reiter:
Wichtig ist hier vor allem die Einstellung unter Ereignis-Ansicht Seite, hier wählt man die Zielseite aus. Aus den erlaubten Views für die Startseite kann man dann Einzelansicht herausnehmen.
Ein Problem taucht auf, wenn man so mit mehreren Seiten arbeitet. Die Einstellungen müssen dann überall konsistent vorgenommen werden. Der Verweis auf die Seite Ereignisansicht muss dann auch auf den Seiten für die Wochenansicht und die Monatsansicht eingetragen werden.
Hier sieht man dann schnell ein, dass es sinnvoll ist, zumindest das allgemeine Template schon vorher auf der übergeordneten Seite unterzubringen.
Änderungen an der Darstellung
Die Darstellung der Seiten wird über eine Reihe von Templates gesteuert, die man verändern kann. Zum Beispiel soll in der Datensatzanzeige der Titel der Veranstaltung in Zukunft fett erscheinen.
Das entsprechende Template sucht man sich z.B. im Constant Editor der Template-Seite:
Hier wäre das also :
EXT:cal/template/event.tmpl
dabei gibt das Schlüsselwort EXT an, das der restliche Pfad relativ zum Verzeichnis mit den Extensionen sein soll. Dieses Template selber sieht recht unspektakulär aus:
<!--event.tmpl--> <div id="calendar-event"><!-- ###EVENT### --><!-- ###EVENT### --></div> <div id="calendar-event-backlink">###BACK_LINK###</div> <!--/event.tmpl-->
Leider hilft das für das Ziel nicht weiter, weil hier nur die grobe Aufteilung in die Datensatzanzeige und den Backlink beschrieben ist.
Die eigentlich Beschreibung steckt in der Datei phpicalendar_event.tmpl. Zum Ausprobieren habe ich im Ordner fileadmin einen Unterordner template eingerichtet und diese Datei dorthin kopiert.
Nun kann man dieses Template im neuen Verzeichnis bearbeiten und dabei das gewünschte Ergebnis erhalten.
Den neuen Pfad kann man entweder über den Constant Editor oder über Info/modify und die folgende Eingabe im Feld Konstanten erreichen.
plugin.tx_cal_controller.view.event.phpicalendarEventTemplate = fileadmin/template/phpicalendar_event.tmpl
Front-End Editing
Häufiger taucht der Wunsch auf, dass man auch von einer Webseite aus Einträge in den Kalender vornehmen kann. Im Extremfall sogar ohne Benutzeranmeldung, dann müssen die Einträge natürlich kontrolliert werden. So kann man aber erreichen, dass Termine sehr flexibel und von vielen Leuten eingereicht werden können.
Dazu gedacht ist die Seite Termineingabe. Hier fügt man wieder das Kalender-Plugin als Seiteninhalt ein. Zur Konfiguration muss man eigentlich nur als erlaubte Ansicht Termin erstellen eintragen und natürlich wieder den Ausgangspunkt eintragen.
Ruft man jetzt die Seite im Frontend auf, so bekommt man eine Fehlermeldung:
calendar: no create event template file found:
Ihm fehlt also das entsprechende Template. Da die Eingabeseite sehr speziell ist, sollte man hier ein Extension-Template erstellen. In diesem Template muss dann im Reiter Enthält das Template Fe-Editing (cal) aktiviert werden. Danach verändert sich die Fehlermeldung zu:
Sie haben nicht die erforderlichen Rechte für die Erstellung eines/einerevent
Klar, das Editieren ist auch noch nicht explizit erlaubt. Dazu muss man noch einmal an das Template heran und unter Konstanten
plugin.tx_cal_controller.rights.edit = 1 plugin.tx_cal_controller.rights.admin.user = 1 plugin.tx_cal_controller.rights.admin.group = 1
eintragen. In der ersten Zeile steht die 1 für Ja, in den beiden Zeilen darunter für den ersten Frontendnutzer bzw. die erste Frontendnutzer-Gruppe. Nach dieser Änderung erscheint die Kalendereingabe schon für alle angemeldeten Benutzer. Alle nicht angemeldeten Benutzer bekommen weiterhin die letzte Fehler-Meldung zu sehen. Ein paar Zeilen Typoscript im Feld Konfiguration des Templates geben auch den anonymen Benutzern die Eingabe frei.
plugin.tx_cal_controller.rights {
create.event {
# Public Usern das Editing erlaugen
public = 1
fields {
# spezielle Konfigurationen für einige Felder:
# es kann z. B. kein Kalender ausgewählt werden:
calendar_id.public = 0
# statt dessen wird ein Kalender voreingestellt (muss ein öffentlicher sein, natürlich)
calendar_id.default = 1
# die Auswahl der Organisatoren ist inaktiv
cal_organizer.public = 0
organizer.public = 0
# ebenso das Pulldownmenü für die Orte
cal_location.public = 0
}
}
}
Weitere Codeschnipsel, die funktionieren: Minutenunterteilung festlegen
plugin.tx_cal_controller.view.create_event.startminutes.stepping = 20
RTE-Abmessungen ändern
plugin.tx_cal_controller.view.create_event.rte.width = 400 plugin.tx_cal_controller.view.create_event.rte.height = 200
Soll für das angegeben Feld die Darstellung ändern (noch nicht getestet)
plugin.tx_cal_controller.view.event.event {
fieldname.dataWrap = %%%LABELNAME%%%: |
}
Datums.Darstellung beeinflussen
plugin.tx_cal_controller.dateConfig {
dayPosition = 0
monthPosition = 1
yearPosition = 2
splitSymbol = .
}
und
plugin.tx_cal_controller.view.timeFormat = %H:%M (Konstante)
Fehlermeldung bei geänderter Datumseinstellung vermeiden
plugin.tx_cal_controller.rights.create.event.fields {
startdate.constrain.1.regexp = /(\d{2}).(\d{2}).(\d{4})/
startdate.constrain.1.message.dataWrap = %%%WRONG_DATE%%% (TT.MM.JJJJ)
enddate.constrain.1.regexp = /(\d{2}).(\d{2}).(\d{4})/
enddate.constrain.1.message.dataWrap = %%%WRONG_DATE%%% (TT.MM.JJJJ)
}
# neue Einträge sind verborgen plugin.tx_cal_controller.rights.create.event.fields.hidden.default = 1 # springt nach der Eingabe auf die Startseite plugin.tx_cal_controller.view.create_event.redirectAfterCreateToPid = 7
# die Datums-Auswahl per Dialog ermöglichen plugin.tx_cal_controller.view.event.useDateSelector = 1 plugin.tx_rlmpdateselectlib.calConf.inputFieldDateTimeFormat = %d.%m.%y
Termin-Datstellung verändern
Die Termine für ein Ereignis werden normalerweise recht komisch ausgegeben:
Wann: 2009-03-14 * 00:00 zu 00:00 2009-03-14 Datum liegt in der Vergangenheit
Unglücklich ist schon mal, dass alle Angaben in einer Zeile stehen. Das lässt sich im Typoscript verändern:
plugin.tx_cal_controller.view.create_event {
# @description Standard wrap for the startdate field
startdate_stdWrap {
dataWrap = <p><label for="startdate">%%%WHEN%%%:</label><input type="text" value="|" name="tx_cal_controller[startdate]" id="startdate" />###STARTDATE_SELECTOR### ###STARTDATE_REQUIRED###
}
# @description Standard wrap for the starttime field
starttime_stdWrap {
dataWrap = -<select name="tx_cal_controller[starttime]" id="starttime" size="1">|</select>
}
startminutes.stepping = 15
# @description Standard wrap for the startMinutes field
startminutes_stdWrap {
dataWrap = :<select name="tx_cal_controller[startminutes]" id="startminutes" size="1">|</select></p>
}
# @description Standard wrap for the enddate field
enddate_stdWrap {
dataWrap = <p><label for="startdate">%%%TO%%% </label><input type="text" value="|" name="tx_cal_controller[enddate]" id="enddate" />###ENDDATE_SELECTOR### ###ENDDATE_REQUIRED###
}
# @description Standard wrap for the endTime field
endtime_stdWrap {
dataWrap = -<select name="tx_cal_controller[endtime]" id="endime" size="1">|</select>
}
endminutes.stepping = 15
# @description Standard wrap for the endMinutes field
endminutes_stdWrap {
dataWrap = :<select name="tx_cal_controller[endminutes]" id="endminutes" size="1">|</select></p>
}
# @description Standard wrap for the allday field
allday_stdWrap {
dataWrap = <p><label for="allday">%%%EVENT_ALLDAY%%%:</label><input type="checkbox" | name="tx_cal_controller[allday]" id="allday" value="1" /></p>###STARTDATE_CONSTRAIN### ###START_CONSTRAIN###
}
}
Jetzt sind die Angaben auf zwei Zeilen verteilt. Es stört nur, dass in der zweiten Zeile Datum und Zeit vertausch sind. Dazu muss man an das Template create_event.tmpl heran.
Dazu kopiert man das vorhandene Template wieder nach fileadmin/template und gibt im Toposcipt im Feld Konstanten an:
plugin.tx_cal_controller.view.event.createEventTemplate = fileadmin/template/create_event.tmpl
Jetzt kann man an der Kopie wieder unbesorgt Änderungen vornehmen. Hier muss (ab Zeile 451) die Reihenfolge angepasst werden:
###TITLE### ###STARTDATE### ###STARTTIME### ###ENDDATE### ###ENDTIME### ###ALLDAY### ###FREQUENCY### ###UNTIL### ###COUNT### ###INTERVAL### ###BY_DAY### ###BY_MONTHDAY### ###BY_MONTH### ###RDATE_TYPE### ###RDATE### ###CATEGORY### ###CALENDAR_ID### ###LOCATION### ###CAL_LOCATION### ###DESCRIPTION###
Datum liegt in der Vergangenheit
Ein Problem besteht darin, dass beim Aufruf der Eingabe-Seite dort immer die Fehlermeldung auftaucht, dass der Termin in der Vergangenheit liegt. Das ist auch fast immer richtig, das asl Starttermin 00:00 des gleichen Tages eingetragen ist und als Endtermin 00:30 des gleichen Tages. Ich habe bisher keine korrekte Möglichkeit gefunden, das Problem zu lösen.
Nicht schön, aber funktionierend ist:
plugin.tx_cal_controller.rights.create.event.fields {
#start.constrain.2.rule = after|equals
start.constrain.2.field = yesterday
}
Die Eingabe yesterday ist sicher ungültig, aber löscht quasi den Vergleich. Dadurch sind aber alle Eingaben zulässig. Termine in der Vergangenheit werden dann aber später nicht angenommen.
Eine zweite Möglichkeit besteht darin, das vorgegebene Datum zu beeinflussen:
plugin.tx_cal_controller.rights.create.event.fields.startdate.default = 01.01.2019
Damit würde jetzt immer der erste Januar 2019 vorgegeben, auch nicht ganz glücklich, vor allem, wenn man mit der Datumsauswahl arbeitet.
Eine dritte Möglichkeit besteht darin die Fehlermeldung so anzupassen, dass sie nicht mehr stört:
start.constrain.2.message.dataWrap = %%%IS_IN_PAST%%%
ist die Vorgabe. Schreibt man hier z.B.
start.constrain.2.message.dataWrap = <br><span class="constrain">das Datum muss in der Zukunft liegen</span>
so ist das schon nicht mehr so nervig. Nimmt man die Klassendefinition weg, so ist der Text auch nicht mehr hervorgehoben.

