TYPO3 DataHandler: Warum direktes SQL in Erweiterungen gefährlich ist

Der DataHandler ist die wichtigste Schnittstelle für sichere Aufgaben in der Datenbank. Dieser Text erklärt DataMap, CmdMap und die Suche nach Fehlern. Er erklärt auch neue Befehle und Änderungen in v14.

Auf einen Blick

  • Der DataHandler ist der einzige sichere Weg. Damit bearbeiten Sie Tabellen mit TCA in TYPO3. Ohne ihn gehen der Zwischenspeicher und die Arbeitsbereiche kaputt.
  • Zwei Listen steuern alles. Die DataMap ($data) erstellt und ändert Einträge. Die CmdMap ($cmd) kopiert, verschiebt und löscht Einträge.
  • TYPO3 v14 löscht einige alte Eigenschaften. Es gibt auch den neuen discard-Befehl. Dieser ist wichtig für die Arbeit in Arbeitsbereichen.
  • Es gibt sogenannte Hooks. Ein Beispiel ist processDatamap_afterDatabaseOperations. Damit können Sie auf jede Änderung in der Datenbank reagieren. Sie können zum Beispiel Nachrichten verschicken.
  • Warum Sie den DataHandler für TCA-Tabellen unbedingt brauchen.
  • Wie die Listen $data und $cmd funktionieren.
  • Wie Sie Fehler finden und behandeln.
  • Wie Sie auf Änderungen in der Datenbank reagieren.
  • Was sich in TYPO3 v14 ändert und wie Sie gut umsteigen.

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.

FeatureDataHandlerRohes 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 LesenNormalSchneller
Ausnahmen: Wann direktes SQL erlaubt ist
  • 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)
sys_file ist gesperrt

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:

Das TCA ist nötig

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 substNEWwithIDs

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.

Benutzer und Rechte

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.

PSR-14 oder SC_OPTIONS (TYPO3 v14)

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  

HookZeitpunktMethode
processDatamapClassVor oder nach DatenprocessDatamap_preProcessFieldArray, processDatamap_postProcessFieldArray, processDatamap_afterDatabaseOperations, processDatamap_afterAllOperations
processCmdmapClassVor oder nach BefehlenprocessCmdmap_preProcess, processCmdmap_postProcess, processCmdmap_deleteAction
clearCachePostProcNach dem ZwischenspeicherEigene Methode

Hook anmelden  

Beispiel für die Praxis: Auf neue Einträge reagieren  

Werte für den afterDatabaseOperations-Hook
  • $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:

v14: Referenzindex ist bei der Wartung

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 pages oder tt_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:

Welche Nummer für discard?

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:

ÄnderungTicketNeue Lösung
Eigenschaften userid und admin sind weg#107848TYPO3 liest den Benutzer direkt aus $GLOBALS['BE_USER'].
Eigenschaft storeLogMessages ist weg#106118Das System schreibt immer in sys_log. Sie müssen nichts mehr einstellen.
Alte Eigenschaften für das Kopieren sind weg#107856TYPO3 liest die Werte jetzt aus den Einstellungen vom Benutzer.
Neuer Befehl discard#107519Dieser Befehl ersetzt alte Befehle für Arbeitsbereiche.
Datumswerte sind jetzt besser#105549Sie brauchen keine komplizierten Anpassungen mehr für die Zeit.
Listen und Seiten nutzen die Record API#107356 / #92434Nutzen 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  

Nutzen Sie den Extension Scanner

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.

Für technisch Interessierte

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.

Auf GitHub öffnen

Was ist Leichter Lesen?

A2

Diese Seite ist in Leichter Sprache geschrieben. Leichte Sprache hilft vielen Menschen, Texte besser zu verstehen. Die Sätze sind kurz. Schwierige Wörter werden erklärt.

Dieser Text wurde nach den Regeln der Leichten Sprache erstellt. Textniveau: A2 (Gemeinsamer Europäischer Referenzrahmen).

Lassen Sie uns ueber Ihr Projekt sprechen

Standorte

  • Mattersburg
    Johann Nepomuk Bergerstraße 7/2/14
    7210 Mattersburg, Austria
  • Wien
    Ungargasse 64-66/3/404
    1030 Wien, Austria

Dieser Inhalt wurde teilweise mithilfe von KI erstellt.