Manche Entwickler schreiben direkte Befehle für die Datenbank. Ein Beispiel ist INSERT INTO tt_content. Das ist keine gute Idee. Damit umgehen Sie wichtige Funktionen von TYPO3. Dazu gehören der Zwischenspeicher und die Arbeitsbereiche. Der DataHandler ist die richtige Schnittstelle dafür. Er steuert alle diese wichtigen Dinge sehr zuverlässig. Dieser Text erklärt vor allem TYPO3 v14. Wir erwähnen auch wichtige Änderungen aus Version 13.
Inhaltsverzeichnis
Die wichtigste Regel
Direktes SQL macht den Zwischenspeicher und den Index kaputt.
DataMap und CmdMap
Erstellen, ändern, löschen, kopieren und verschieben über zwei Listen.
Ausführung und Fehler
Sicherheit, Fehler finden und die neuen Nummern für Einträge.
Kommandozeile und Planer
Wie Sie den DataHandler im Hintergrund richtig aufrufen.
Hooks für Änderungen
Auf Änderungen reagieren und eigene Aktionen auslösen.
Referenzindex und Speicher
Den Index prüfen und den Zwischenspeicher richtig leeren.
Arbeit in Arbeitsbereichen
Versionen speichern und der neue discard-Befehl in v14.
Häufige Fehler
Die vier größten Fehler bei der Arbeit mit dem DataHandler.
Wichtige Änderungen in v14
Gelöschte Eigenschaften und das neue Format für das Datum.
Die wichtigste Regel: Kein direktes SQL für TCA-Tabellen
Diese Regel gilt für alle Tabellen mit TCA. Das sind zum Beispiel pages und tt_content. Nutzen Sie immer den DataHandler. Schreiben Sie keine direkten Befehle für die Datenbank. Direkte Befehle umgehen alle wichtigen Schutzfunktionen von TYPO3.
| Feature | DataHandler | Rohes SQL |
|---|---|---|
| Referenzindex (sys_refindex) | ✓ | ✕ |
| Zwischenspeicher leeren | ✓ | ✕ |
| Liste der alten Versionen (sys_history) | ✓ | ✕ |
| Arbeitet mit Arbeitsbereichen | ✓ | ✕ |
| Hooks und Ereignisse im System | ✓ | ✕ |
| Verarbeitung von FlexForms | ✓ | ✕ |
| Verbindungen zwischen Tabellen (MM) | ✓ | ✕ |
| Geschwindigkeit beim Lesen | Normal | Schneller |
- Tabellen für eigene Protokolle ohne TCA
- Auswertungen für viele Daten (nur lesen)
- Skripte für den Umzug von Daten (danach den Index neu bauen)
TYPO3 sperrt das Schreiben in die Tabelle sys_file. Das gilt seit TYPO3 v13.0.1. Zusätzliche Felder gehören in die Tabelle sys_file_metadata. Das ist wichtig für die Sicherheit. Der Grund ist die Sicherheitswarnung TYPO3-CORE-SA-2024-006.
Die zwei Kernstrukturen
Zwei Listen steuern den DataHandler. Die erste Liste heißt DataMap ($data). Sie legt neue Einträge an und ändert sie. Die zweite Liste heißt CmdMap ($cmd). Sie verschiebt, kopiert und löscht Einträge.
DataMap: Einträge erstellen und ändern
Aufbau: $data[tabellenname][uid][feldname] = wert
Für neue Einträge brauchen Sie einen eindeutigen Text. Dieser Text muss mit NEW anfangen:
Der DataHandler braucht das TCA. Er verarbeitet nur Felder aus der Konfiguration im TCA. Felder mit dem Typ none werden ignoriert. Falsche Typen ignoriert er auch.
CmdMap: Einträge verschieben, kopieren und löschen
Aufbau: $cmd[tabellenname][uid][befehl] = wert
TYPO3 nutzt oft das weiche Löschen. Das heißt Soft-Delete. Das passiert automatisch durch die Einstellungen im TCA.
Ausführung, Fehler finden und neue Nummern
Der DataHandler merkt sich seinen Zustand. Sie müssen für jede Aufgabe eine neue Instanz erstellen. Das bedeutet einen neuen Aufruf. Nutzen Sie dafür meistens GeneralUtility::makeInstance(DataHandler::class). Nutzen Sie nicht die gleiche Instanz für mehrere Aufgaben hintereinander.
Ablauf vom DataHandler: Vom Start bis zur neuen Nummer
Grundlegendes Muster
Die Variable $dataHandler->substNEWwithIDs ist sehr wichtig. Sie enthält die neuen Nummern für Ihre Einträge. Ein Beispiel: $dataHandler->substNEWwithIDs['NEW_hero'] gibt Ihnen die echte Nummer vom neuen Eintrag.
Erweitert: Eigene Transaktionen für die Datenbank
Die offizielle Anleitung hat keine Regeln für eigene Transaktionen. In normalen Erweiterungen reicht die einfache Schnittstelle. Das sind die Befehle start und process_datamap(). Nutzen Sie eigene Transaktionen nur sehr selten. Machen Sie das nur bei vielen eigenen SQL-Schritten auf einmal. Prüfen Sie vorher alle möglichen Fehler sehr genau.
Einsatz auf der Kommandozeile und im Planer
Auf der Kommandozeile gibt es keinen automatischen Benutzer. Das gilt auch für den Planer. Sie müssen einen Benutzer anmelden. Nutzen Sie dafür Bootstrap::initializeBackendAuthentication(). Machen Sie das vor dem Schreiben von Daten. Sonst bekommen Sie einen Fehler wegen fehlenden Rechten.
Der Benutzer auf der Kommandozeile braucht echte Rechte. Er braucht Rechte für Ihre Tabellen und Seiten. Setzen Sie das Admin-Recht nicht von Hand. Nutzen Sie einen echten Benutzer mit passenden Rechten. Sie können diesen Benutzer als drittes Argument für den DataHandler übergeben. Prüfen Sie die Rechte immer richtig.
Hooks: Auf Änderungen in der Datenbank reagieren
Der DataHandler bietet spezielle Schnittstellen an. Diese heißen SC_OPTIONS-Hooks. Damit können Sie auf jede Änderung reagieren. Sie können zum Beispiel Protokolle schreiben. Oder Sie können externe Daten abgleichen.
TYPO3 bietet hier keine modernen PSR-14-Ereignisse an. Nutzen Sie weiterhin die alten Hook-Klassen. Diese heißen zum Beispiel processDatamapClass. TYPO3 hat nur moderne Ereignisse für ganz bestimmte andere Dinge. Das sind zum Beispiel Ereignisse für den Referenzindex.
Verfügbare Hooks
| Hook | Zeitpunkt | Methode |
|---|---|---|
| processDatamapClass | Vor oder nach Daten | processDatamap_preProcessFieldArray, processDatamap_postProcessFieldArray, processDatamap_afterDatabaseOperations, processDatamap_afterAllOperations |
| processCmdmapClass | Vor oder nach Befehlen | processCmdmap_preProcess, processCmdmap_postProcess, processCmdmap_deleteAction |
| clearCachePostProc | Nach dem Zwischenspeicher | Eigene Methode |
Hook anmelden
Beispiel für die Praxis: Auf neue Einträge reagieren
$status: Der Status ist'new'oder'update'.$table: Das ist der Name der Tabelle.$id: Das ist die Nummer von dem Eintrag.$fieldArray: Das ist die Liste der geschriebenen Felder.$dataHandler: Das ist der DataHandler selbst.
Referenzindex und Zwischenspeicher
Referenzindex auf den neuesten Stand bringen
Der Referenzindex (sys_refindex) merkt sich alle Verbindungen zwischen Einträgen. Der DataHandler aktualisiert diesen Index automatisch. Manchmal machen Sie sehr große Änderungen. Prüfen Sie den Index dann von Hand auf der Kommandozeile:
In TYPO3 v14 finden Sie die Prüfung woanders. Sie ist unter Verwaltungswerkzeuge → System → Wartung. Auf der Kommandozeile geht es weiterhin mit dem bekannten Befehl. Das ist sehr gut für große Internetseiten.
Zwischenspeicher leeren
Der DataHandler leert den Zwischenspeicher automatisch. Er macht das nach jeder Änderung. Er nutzt dafür besondere Markierungen. Für jeden Eintrag fließen folgende Markierungen in den Zwischenspeicher ein:
- Name der Tabelle: Zum Beispiel
pagesodertt_content. - Tabelle und Nummer: Zum Beispiel
tt_content_123. - Nummer der Seite: Zum Beispiel
pageId_10.
Sie können den Zwischenspeicher auch von Hand leeren:
Richtig mit Arbeitsbereichen arbeiten
Vielleicht läuft Ihr Code in einem Arbeitsbereich. Dann macht der DataHandler automatisch neue Versionen für Ihre Einträge. Das bedeutet, er speichert verschiedene Versionen. Sie müssen dafür nichts extra tun. Sie müssen nur den DataHandler nutzen.
Neu in v14: Der Befehl discard
TYPO3 v14 hat einen neuen Befehl. Dieser Befehl heißt discard. Er löscht Änderungen aus einem Arbeitsbereich. Das ist sauberer und klarer als der alte Weg:
Der Befehl braucht eine Nummer. Das kann die Nummer der Live-Version sein. Es kann auch die Nummer aus dem Arbeitsbereich sein. Bei der Live-Nummer sucht TYPO3 automatisch die richtige Version heraus.
Häufige Fehler
Wichtige Änderungen in Version 14
TYPO3 v14 löscht einige alte Eigenschaften vom DataHandler. Auch das Verhalten bei einem Datum ändert sich. Hier ist die genaue Übersicht:
| Änderung | Ticket | Neue Lösung |
|---|---|---|
| Eigenschaften userid und admin sind weg | #107848 | TYPO3 liest den Benutzer direkt aus $GLOBALS['BE_USER']. |
| Eigenschaft storeLogMessages ist weg | #106118 | Das System schreibt immer in sys_log. Sie müssen nichts mehr einstellen. |
| Alte Eigenschaften für das Kopieren sind weg | #107856 | TYPO3 liest die Werte jetzt aus den Einstellungen vom Benutzer. |
| Neuer Befehl discard | #107519 | Dieser Befehl ersetzt alte Befehle für Arbeitsbereiche. |
| Datumswerte sind jetzt besser | #105549 | Sie brauchen keine komplizierten Anpassungen mehr für die Zeit. |
| Listen und Seiten nutzen die Record API | #107356 / #92434 | Nutzen Sie jetzt Record-Objekte anstelle von einfachen Listen. |
Das neue Datum im Detail
Früher gab es Probleme mit der Uhrzeit. TYPO3 hat das Datum oft falsch verstanden. In Version 14 ist das repariert:
Alte Eigenschaften ersetzen
TYPO3 hat einen Prüfer für Erweiterungen. Dieser heißt Extension Scanner. Er findet alte und falsche Eigenschaften. Prüfen Sie Ihre Erweiterungen vor dem Update auf v14.
Fazit
Der DataHandler ist Pflicht
Nutzen Sie ihn für jede TCA-Tabelle. Direkte Befehle für die Datenbank machen viele Funktionen kaputt.
Zwei Listen für alles
Die Liste $data erstellt und ändert Daten. Die Liste $cmd kopiert, verschiebt und löscht Daten. Starten Sie immer einen neuen Aufruf.
Wechsel auf v14 planen
Prüfen Sie alte Eigenschaften in Ihrem Code. Entfernen Sie alte Umwege für das Datum. Nutzen Sie den Befehl discard.
Der DataHandler ist keine freiwillige Funktion. Er ist zwingend nötig. Nur so bleiben Ihre Erweiterungen fehlerfrei. Er sorgt für saubere Arbeitsbereiche. Nehmen Sie sich Zeit für den DataHandler. Ihre Internetseite läuft dadurch sehr stabil und sicher.
Wissen über den TYPO3 DataHandler
Hier finden Sie noch mehr Informationen für Entwickler. Die Daten passen für TYPO3 v13 und v14. Sie lernen alles über DataMap und CmdMap. Sie finden dort auch Informationen über Hooks und Ereignisse im System. Im selben Ordner finden Sie auch Dateien wie SKILL.md und weitere Hilfen.