TYPO3 4.1 Feature „Inline Relational Record Editing“ kurz vorgestellt: Einfach irre!
Bei einem Reiseportal sollen Hotels und deren Leistungen im Internet dargestellt werden und vom Kunden direkt gebucht werden können. Ein Hotel bietet beispielsweise diverse Erholungs- oder Wellness-Programme an, die wiederum einer unterschiedlichen Preisstruktur unterliegen, je nachdem, ob man zur Haupt- oder Nebensaison buchen möchte.
Dieses Szenario soll unser Einstieg in die Welt relationaler Daten sein. Die Objekte „Hotel“, „Programm“ und „Preis“ sind jeweils direkt voneinander abhängig: Ein Programm ist einem Hotel fest zugeordnet und könnte ohne dieses Elternobjekt nicht existieren (Komposition).
Irre?
Der bisherige Weg, die beschriebene Datenstruktur zu bewältigen – die sich immerhin über drei Ebenen erstreckt – war eher mühselig. So musste etwa das Hotel als Elternobjekt angelegt und auch gleich wieder abgespeichert werden, damit TYPO3 eine UID erzeugt, auf die Programme als Kindobjekte referenzieren können. Über selbst gestrickte Wizards, die diverse Popups öffnen, konnte die gewünschte Struktur zumindest einigermaßen komfortabel realisiert werden.
Die Extension „kb_tca_section“ von Bernhard Kraft und „dynaflex“ von Thomas Hempel brachten schon etwas mehr Komfort – so konnte die Struktur weitgehend in einer Ansicht bearbeitet werden. Für jeden neuen Kinddatensatz oder eine Änderung der Element-Sortierung war jedoch trotzdem das Abspeichern und Neuladen der kompletten Eingabemaske notwendig.
IRRE!
Inline Relational Record Editing (IRRE) setzt bei den vorher genannten Punkten an. Einem neuen, ungespeicherten Elternobjekt können sofort weitere Kindelemente hinzugefügt und bearbeitet werden. Vorhandene Elemente können vom Elternobjekt wieder entfernt oder per Drag & Drop sortiert werden. Die Anzahl der möglichen Hierarchieebenen ist nahezu unbeschränkt. Wenn alle Daten vollständig sind, wird die Datenstruktur per Klick auf Abspeichern in der Datenbank abgelegt. Das Hotel-Beispiel vom Anfang kann so auf einen Streich – vom Hotel, über die Programme, bis zu den Preisen – direkt eingegeben und administriert werden.
Datenspeicherung
IRRE unterstützt verschiedene Arten, um Relationen zwischen Elternobjekten und den zugehörigen Kindobjekten zu speichern. Listen stellen dabei die einfachste Variante dar. Die UIDs der Kindobjekte werden in einem Feld des Elternobjekts gespeichert und sind per Komma getrennt. Die Reihenfolge der einzelnen Werte entspricht der Sortierreihenfolge. Fremdschlüssel ermöglichen normalisierte Datenstrukturen. In der
Tabelle der Kindobjekte wird ein Feld reserviert, das die UID des
Elternobjekts speichert.
Im TYPO3 Content Array (TCA) des Elternelements ist konfiguriert, welches Feld des Kinds dazu herangezogen wird („foreign_field“). Eine weitere Konfigurationsoption erlaubt es, zusätzlich den Tabellennamen des Elternobjekts zu hinterlegen („foreign_table_field“) – man nennt dies auch „weak entity“.
Relationstabellen, bei TYPO3 bereits als MM-Relationen bekannt, erlauben die Verknüpfung von zwei Objekten. Die UID-Werte der beiden zusammengehörigen Datensätze werden hier in einer zusätzlichen Tabelle abgespeichert, der Relationstabelle. Inline Relational Record Editing verwendet allerdings nicht die herkömmlichen MM-Tabellen, sondern eine eigene Tabelle, die ebenfalls per TCA definiert werden kann. Daraus resultiert, dass hier nun Attribute für jede Relation hinterlegt werden können.
$TCA['tx_irrehotel_hotel'] = Array( 'ctrl' => ..., 'interface' => ..., 'columns' => Array( 'title' => Array( 'label' => ..., 'config' => Array( 'type' => 'input', ), ), 'programs' => Array( 'label' => ..., 'config' => Array( 'type' => 'inline', 'foreign_table' => 'tx_irrehotel_program', 'foreign_field' => 'parentid', 'foreign_table_field' => 'parenttable', 'maxitems' => 10, ), ), ), 'types' => ..., 'palettes' => ..., ); $TCA['tx_irrehotel_program'] = Array( 'ctrl' => ..., 'interface' => ..., 'columns' => Array( 'title' => Array( 'label' => ..., 'config' => Array( 'type' => 'input', ), ), 'parentid' => Array( 'config' => Array( 'type' => 'passthrough', ), ), 'parenttable' => Array( 'config' => Array( 'type' => 'passthrough', ), ), ), 'types' => ..., 'palettes' => ..., );
Listing 1
Ab TYPO3 4.1 lässt sich die Funktionalität von IRRE über den TCA-Typ „inline“ nutzen. Das angeführte Beispiel soll eine Relation zwischen einem Hotel als Elternelement und mehreren Programmen als Kindelemente zeigen. Das komplette Beispiel ist im TYPO3 Extension Repository (TER) unter dem Namen „irre_hotel“ hinterlegt [1].
In der Tabelle des Elternobjekts (tx_irrehotel_hotel) wird dem Feld „programs“ der Typ „inline“ zugewiesen, um IRRE hierfür verwenden zu können. Außerdem wird per „foreign_table“ die Tabelle des Kindobjekts (tx_irrehotel_program) definiert. Mit „foreign_field“ und „foreign_table_field“ sind die Felder der Kind-Tabelle benannt, in denen später die UID des Elternobjekts sowie dessen Tabellenname hinterlegt werden.
Auszug aus der MySQL-Tabelle „tx_irrehotel_hotel“:
uid | pid | … | title | programs |
13 | 2 | … | Wohlfühlhotel am Rosengarten, Bad Steben | 3 |
Auszug aus der MySQL-Tabelle „tx_irrehotel_program“:
uid | pid | … | title | parentid | parenttable |
55 | 2 | … | Kennenlern-Angebot | 13 | tx_irrehotel_hotel |
56 | 2 | … | Verwöhn-Tage | 13 | tx_irrehotel_hotel |
57 | 2 | … | Gesundheits-Kur | 13 | tx_irrehotel_hotel |
Fazit
Das Diplomarbeitsthema des Autors beschreibt das Thema dieses Artikels noch detaillierter und steht in englischer Sprache kostenfrei zur Verfügung [2]. Einen oberflächlicheren und schnelleren Überblick kann man sich per TYPO3-Wiki [3] verschaffen.
Die Einsatzbereiche von Inline Relational Record Editing sind vielfältig. So könnten beispielsweise Bilder der Standardinhaltselemente (tt_content) in einer eigenen Tabelle gehalten und mit Untertitel, Links und weiteren Eigenschaften versehen werden. Jedes Bildobjekt könnte dann individuell ohne Abspeichern und Neuladen der Backend-Ansicht bearbeitet werden. Die genauen TCA-Konfigurationsmöglichkeiten sind in der Dokumentation der TYPO3 Core APIs zu finden [4].
Zukunftsmusik
Das Projekt IRRE wurde auch mit Blick auf David Brühlmeiers „Party Information Framework“ (vormals Partner Framework) [5] entwickelt. Dort wird es bei der Handhabung von Personen beziehungsweise Organisationen und deren Verbindungen untereinander zum Einsatz kommen. IRRE wird weiterentwickelt und soll auch in Zukunft schrittweise neue Features erhalten. Interessierte können Erweiterungswünsche entweder über den Bug-Tracker [6] oder über die News-Liste [7] einreichen und diskutieren.