TYPO3 Logo

Notizen vom CAL-Vortrag

Am 25.Oktober 2008 hielt Mario Matzulla im Rahmen der monatlichen Treffen der TYPO3-Usergroup-NRW einen Vortrag zur Extension CAL, begleitet / gefolgt von Anmerkungen von Steffen Kamper

 

Diese Seite basiert auf den Notizen von Martin Bless. Vielen Dank für die ausführlichen Notizen.

Die Bilder sind dem Vortrag von Mario Matzulla, ursprünglich gehalten auf den Developer Days 2008, entnommen. Die gleichen Bilder und auch die dazugehörige Videos von Jeff hat Mario beim Vortrag präsentiert. Für die Videos ('Preparing a good Hamburger' in four parts) haben wir hier leider nicht genug Platz / Bandbreite.























Letzter Samstag im Monat: Da läutet die Glocke für das regelmäßige Treffen der TYPO3 Usergroup NRW. Diesmal mit einem ganz besonderen Event: Mario Matzulla ist da und lässt sein Baby, die CAL-Extension leben. Das ist nun wirklich Grund genug, endlich einmal den Sprung von Münster nach Düsseldorf zu machen. Und, das Beste kommt nicht nur zum Schluss, sondern steht gerne auch mal am Anfang: Es hat sich gelohnt! Da konnte auch WDR2 nichts dran ändern, der uns Nebel angedroht hatte, der dann noch nicht einmal da war. Sehr schöne Räumlichkeiten in der Marketing-Factory, das macht Spaß. Und gut dass ich da instinktiv noch Marmelade mitgebracht habe: Sehe jetzt erst, dass es dazu ja auch noch einen Aufruf gab.


Thema hatten wir "nur" eins: Die CAL-Extension.


Die Beschäftigung mit Zeitphänomenen ist sicher ein uraltes "Hobby" der Menschheit und auch eng mit astronomischen Gegebenheiten verknüpft. Man denke einmal an die Himmelsscheibe von Nebra:

      http://de.wikipedia.org/wiki/Himmelsscheibe_von_Nebra

Vielleicht nicht nur "Hobby", sondern schnell auch eine Notwendigkeit, und so sind auf der Welt viele Kalender entstanden. Die Schwierigkeit der Kalenderrechnung ergibt sich daraus, dass Erdumlaufbahn, Erddrehung und Mondumlauf in eine brauchbare Beziehung gesetzt werden müssen. Und die Zahlen teilen sich nunmal nicht glatt und sind zudem noch nichtmal konstant. Wer sich über die verschiedenen Kalenderrechnungen informieren will, wird hier umfassend "bedient":

      http://emr.cs.iit.edu/home/reingold/calendar-book/third-edition/


Martin Bless: Zu dem Werk Calendrical Calculations möchte ich noch sagen, dass alle Algorithmen, die dort verwandt werden, als Programmcode formuliert sind. Für nichtkommerzielle Zwecke schreibt man eine Mail an die Autoren und erhält einen Link zum download. In was für einer Programmiersprache? Die erste Ausgabe des Buches habe ich, da ist es LISP! Inzwischen gibt's aber, glaube ich, mindestens auch eine Javascript-Fassung.


Das ist ein starkes Werk. Besonders gut gefällt mir ja der Kalender, der zum Teil noch in Agypten gilt: Das Jahr hat immer 12 mal 30 Tage, und dann macht man einfach noch 5 oder 6 Feiertage.



Nun zu CAL, DER TYPO3-Kalenderextension. Alles, was ich hier schreibe, entstammt meinen privaten Notizen. Für das, was richtig ist, geht das Lob an die Autoren und Vortragenden. Die Fehler gehören mir und dürfen gerne korrigiert werden. Der Vortrag stand unter dem Motto "Cooking with Mario" und Chefköche sind:

  • Mario Matzulla mit live Vortrag
  • Jeff Segars per Video
  • Steffen Kamper mit live Demo von Bespielen
  • Franz Koch


Natürlich sind wir neugierig, und damit auch ja nichts untergeht, gleich hier:


Bei der Ein- und Wertschätzung hilft vielleicht die Info, dass die Entwicklungszeit im Dezember 2008 bereits drei Jahre beträgt.


Ein Dreh- und Angelpunkt ist:

Reingucken!


CAL hat historische Wurzeln in früheren Kalender-Extensions und PHP-Anwendungen, ist nun aber gründlich durchdacht und vom alten Code ist praktisch nichts mehr geblieben. Insbesondere das Fundament ist solide. Architektonisch spielen Model-View-Controller-Überlegungen wohl eine starke Rolle:


Für CAL gibt's hier ein imposantes Schaubild (PDF, SVG):


Was mich besonders begeistert ist, dass die vier CAL-Miraculixe nicht einen proprietären Datensaft nach eigenem Rezept kochen, sondern versuchen, sich möglichst an den iCalendar-Standard zu halten:


Das Regelwerk hierzu findet sich in den "Aufrufen zur Stellungnahme", den RFCs:


"ical", "ics", "icalendar" sind wichtige Stichworte hierzu, die man sich merken sollte. Sie beschreiben Austauschformate von Kalenderdaten, MIME-Type "text/calendar".


"CAL kann das Standardformat exportieren und importieren." Das ist eine Aussage, die man gar nicht hoch genug schäzten kann.


Wenn man CAL verwenden will, benötigt man die Extension


und den den einen und anderen Sysordner. Zuerst legt man immer einen Kalender an und kann hier unterscheiden zwischen privatem und öffentlichem Kalender. Private werden nur von bestimmten FeUsern und -gruppen gesehen. Optionale kann man Kalenderkategorien anlegen. Das eigentliche "Fleisch", also das Datenmaterial für diese "Knochen" sind dann die Events, die immer zu (mindestens?) einem Kalender gehören.


Preisfrage: Was kennzeichnet einen Event? Er hat jedenfalls IMMER ein Anfangsdatum und eine Dauer bzw. Endedatum. "Meeting 10 Uhr" ist also KEIN Event! Events können auch im Backend eingegeben werden. In den Feldern "HeaderStyle" und "BodyStyle" kann man etwas eintragen. Sie werden später ausgewertet und in CSS-Klassen umgesetzt, so dass man Events z. B. farblich unterlegen kann. Es gibt auch (ca.) sechs vorbereitete, wie red, green, blue usw. sowie "default". Genaue Namen bitte nachgucken.


Bei der Vorstellung der Basics haben wir unmittelbar kleinere Ausflüge zu den Tipps und Tricks und "Was man wissen muss" usw. gemacht. Die Details sprengen hier den Rahmen, aber dafür gibt es ja auch mehr als 150 Seiten Doku:


Deshalb hier vielleicht eher die Hinweise auf einige Prinzipien, Tipps und Fallgruben ("pitfalls"):


  • Listenauswahl im Kalenderdatensatztyp: Hier ist der erste Punkt oft der, der als Default zum Tragen kommt.
  • FAQ: Wie mache ich ne Listenansicht für XXX? Per Template! (= Text-Template-File).
  • Wichtig ist es natürlich immer, die Startingpoints richtig zu setzen.
  • Wenn man Links zB auf die Detail-Ansicht haben will, muss man im Flexform auch die Seite eintragen, auf der die Detailansicht erscheinen soll. Wie soll sonst der Link generiert werden?
  • TYPO3 v4.3 bringt nächsten eine neue Funktion mit, die den Aufbau der PIDList (also das Auswerten der Startingpoints) erheblich beschleunigt.
  • Es gibt ein Typoscript-Feld im Plugin, mit dem auch User, die sonst nicht an die TS-Einstellungen kommen, letzte Einstellungen machen können. Andererseits kann der Admin dies nun auch wieder disablen. Schöne gute Konfigwelt!
  • Die Kalendermaschine in CAL kann mit JEDER Art von Event umgehen. Allerdings muss der Event selbst wissen, wie er sich gerne darstellen möchte. (Objektorientierung)
  • Für ALLE Events wird die Ausgabe der Events im Event-Template (Text-Datei) definiert. Genau dort und auch NUR dort. Alle anderen Templates enthalten nur Referenzen auf diese Definitionen.
  • Will man ICS-Daten importieren, so legt man einen Kalender vom entsprechenden Typ an. Der zeigt dann alle Daten an, ist aber ReadOnly. Aber, ta ta ta taaa, da kann ein Trick doch nützlich werden: Ändert man tx_cal_event.isTemp=1 in 0, so ist der Kalender editierbar. Use at your own risk! Aber, der Nutzen: Vielleicht kann man Kalender so einfach exportieren, an anderer Stelle wieder importieren und dann einfach normal nutzen?

    Tipp:

    Gelobt wurde die "Gabriel-Extension". Auch wenn man nur einen Cronjob anlegt, kann man damit direkt aus TYPO3 heraus verschiedene Aufgaben verwalten. ZB um Kalender, die auf einem ICS-Feed basieren, regelmäßig zu aktualisieren.
  • CAL unterstützt als Ausgabe auch
    • einen ICS-Feed, Standardseitentyp 150
    • einen RSS-Feed, Standardseitentyp 151
  • Kalenderseiten werden ggf. durchaus in TYPO3 gecached. Allerdings bringt CAL eine eigene Funktion mit, die dafür sorgt, dass nicht auch noch gigantischerweise Zwischenschritte gecached werden, wenn sie bei den Subpart- und Markern (evt. nur minimal) etwas geändert hat. Kalender, die editierbar sind, werden nicht gecached.
  • Das Typoscript, dass bei CAL zum Einsatz kommt, ist SEHR SEHR lang. Und kann auf den ersten Blick verwirrend aussehen. Es folgt jedoch weitgehend diesem prinzipiellen Aufbau:
    plugin.tx_cal_controller {
    	((view)).((object)).((property))
    	# Beispiel:
    	month.event.title.crop=5
    }
    
    WICHTIG: Praktisch alle Felder (Properties?) haben stdWrap-Eigenschaften, können also das, was ein TS-TEXT-Objekt kann.
  • Clever und endlich einmal: Die Renderingmaschine in CAL ist "Template-getrieben". Soll heißen: CAL guckt in den Templates und im TS nach, welche Ausgaben benötigt werden, und genau die werden dann berechnet. Andersherum ginge es vermutlich auch gar nicht: Man kann nicht alle denkbaren Ausgaben errechnen, um dann nur wenige zu verwenden.
  • Fallgrube: Für Allday-Events und normale Events existieren getrennte Templates, die beide angepasst werden müssen. Ähnliches kann analog an anderer Stelle vorkommen.
  • Unterschiedliche Zeilendarstellung für gerade und ungerade Zeile in der Listenansicht ist bereits vorgesehen. Kann per TS auf mehr Varianten erweitert werden.
  • Entwickler, aufgepasst: Setze in der localconf.php diese drei Zeilen, und dir wird immer etwas angezeigt und mitgeteilt:
       $TYPO3_CONF_VARS['SYS']['sqlDebug'] = 1;
       $TYPO3_CONF_VARS['SYS']['displayErrors'] = 1;
       $TYPO3_CONF_VARS['SYS']['debug'] = 1;
    
    NICHT VERGESSEN: Später wieder ausschalten!!!
  • Steffen Kamper hat gezeigt, wie er über den Standard-Hook-Mechanismus von TYPO3 die Hooks in CAL verwendet.
    Das dazugehörige PHP hat Steffen Kamper in seinen Snippets veröffentlicht: http://snippets.typo3.org/snippets/c/58/
    Suche nach "hook" in den CAL-Quelltexten und schlage nach, welche Parameter erforderlich sind.
    Bernd Pier: Die Extension 'dmc_hooklist' (http://typo3.org/extensions/repository/view/dmc_hooklist/current/) zeigt alle im Code enthaltenen Hooks an. Das freut.
  • CAL verwendet die PEAR date-Klasse. Wer die bereits installiert hat: Glückwunsch!
  • Es gibt auch eine TYPO3-Extension, um PEAR-Klassen zu verwalten: http://typo3.org/extensions/repository/view/pear/current/
  • Aber auch der, der PEAR nicht installiert hat, wird bedient: Als "Fallback" bringt CAL eigene Funktionen mit (nachteilig?).
  • Intern wird jeder Kalender letztlich aus einem ggf. langen, großen PHP-Array von Events gerendert, dass nach Datum, Uhrzeit und Event hierarchisiet ist. Da kann man natürlich PHP-mäßig "reinstochern".
  • Man KANN sich ALLE Templates aus der CAL-Extension nach fileadmin/ kopieren, und braucht nur einen TS-Wert zu ändern, um diese zu nutzen. Wird aber leicht unübersichtlich.

    Tipp:

    Steffen hat gezeigt, wie man im BE im TS-Objectbrowser sich sozusagen "Shortcuts" auf Teilbereiche des TS anlegt, indem man unten auf der Seite den OL-Link benutzt. Steht für Object-List, und kaum jemand weiß, was das bedeutet. Damit kann man die Dropdown-Liste für das Anspringen bestimmter TS-Punkte erweiteren!

  • Fallgrube: Die TS-Einstellungen zur Legende unterm Kalender sind u. U. nicht leicht in den Templates zu finden, denn die Legende wird aus dem Tree der Kategorien generiert.

    Kann denn Typoscript Sünde sein?

    Auch dann, wenn es korrekt ist? Ja, das kann es! Das Problem kann die schiere Masse sein. Zuuuu viiiieeeel Typoscript kann den Zeit- und Speicher-Rahmen sprengen. Deshalb der dringende Rat von Steffen und Mario:

    1. Lege alles an TS tot, was nicht benötigt wird:
      plugin.tx_cal_controller.((object)) > usw.
    2. Benutze niemals Frontend-, ICS- oder RSS-Ausgabe auf der gleichen Seite.
  • Studiere die Datei setup.txt: Es gibt per TS ausgefeilte Möglichkeiten zur Rechte-Einstellung. Unter anderem hat der Wert "time_Offset" Einfluss darauf, wie weit in Vergangenheit (und/oder Zukunft?) jemand Termine eingeben kann.
  • Was es mit den %%%LABELS%%% auf sich hat, habe ich so schnell nicht verstanden. Jedenfalls funktioniert es und sorgt dafür, dass die richtigen Werte zum richtigen Zeitpunkt da sind. Wie war das also noch?
    Bernd Wilke: Mit den %%%LABELS%%% ist das so:
    Würde man die Labels "LLL:EXT:cal.LABEL" benutzen würden diese zwar sprachspezifisch ersetzt. Eine Redefinition dieser Label mittels TypoScript (http://www.pi-phi.de/t3v4/61.html) würde dabei aber nicht mehr greifen. Daher verwendet CAL die %%%-Label und ersetzt erst ganz zum Schluss die endgültige Label-Definition inklusive TypoScript-Redefinition.
  • Es gibt in CAL "Exception-Events". Trägt man einen solchen ein, kann er dafür sorgen, dass ein ansonsten regelmäßiger Event an einem bestimmten Zeitpunkt ausfällt. Es muss sich aber um einen regelmäßigen handeln nicht nur um eine Wiederholung. Es bleibt der eigenen Überlegung überlassen, was passiert, wenn nun ein Termin alle drei Tage stattfindet aber alle fünf Tage ausfällt. Viel Spaß!

Tipp und Frage:
Conditions im TS sind ggf. schneller als EXT-Templates. Hat da jemand eine Quelle zu?

ACHTUNG:
Es sind vor allem die wiederkehrenden Termine, mit denen CAL den Server an den Rand des Wahnsinns treiben kann. Da muss sehr viel berechnet werden.


Call for feedback:

Es gibt in CAL deshalb zur Zeit ein "experimental feature" useNewRecurringModel (etwa dieser Name). Hierzu hätte Mario gerne Feedback.


Update von älteren CAL-Version: Es gibt dazu ein Updatescript. Und der Export- und Import von ICS-Daten ist auch eine Idee.


Dann war da noch was zu GoogleMaps ... Wie war das? CAL unterstützt vor allem die TYPO3-Extension von der WEC? Hhm, welche ist das?

Simon Harhues: GoogleMaps Extension der Web Empowered Church? Da ist wohl folgende Extension gemeint: WEC Map, Extkey 'wec_map', http://typo3.org/extensions/repository/view/wec_map/current/


Michael Gnessner: 'wec_map' - Genau diese Extension war bei meiner Frage gemeint. So hast Du die Möglichkeit, beim Organizer- und Location-Datensatz entsprechend eine Googlemap einzubinden, die auch sehr flexibel konfigurierbar ist.


Natürlich wurden auch bestehende Bugs angesprochen und noch viel mehr Feature-Requests gleich vor Ort in die Runde getragen. Hier sei gesagt: Es macht überhaupt keinen Sinn, diese per Mail irgendwo hin zu schicken. Hier ist der richtige Ort dafür:


Was hier eingetragen ist, geht auf alle Fälle schon einmal nicht verloren. Und Jeff und Mario können hier effizient den Dingen nachgehen. Die CAL Version 2.0 ist hier gleichsam das Auffangbecken visionäre Überlegungen.


Aktuelle Versionen sind per Subversion hier zu erhalten:


Wann immer von Entwicklerseite ein Submit gemacht wird, also für jedes neue Release, sollte dort unmittelbar ein neuer Build erstellt werden, nicht nur "nightly". Siehe auch:


Fazit:
Fünf Stunden waren veranschlagt, und die Zeit ist vergangen wie im Fluge.
Es hat Spaß gemacht und sich SEHR gelohnt. Ein herzliches Dankeschön an alle Beteiligten!


Links

Hier noch einmal eine Liste mit wichtigen Links:

sun.webempoweredchurch.com/projects/calendar

www.typo3-calendar.org

es gibt auch eine Newsgroup/Mailingliste, in der neben den Entwicklern auch eine Gruppe von Cal-Nutzern Fragen beantworten:

news://typo3.projects.calendar