Wiederkehrende Massenänderungen an t3sbootstrap-Feldern lassen sich im Backend nur Element für Element machen.
Mit SQL sind sie eine Zeile — und mit einem falschen WHERE ein Datenverlust.
Deshalb steht zu jedem Eingriff zuerst ein SELECT. Was es zurückgibt, ist genau das, was das UPDATE danach anfasst.
Stimmt die Trefferzahl nicht, stimmt die Bedingung nicht.
Vorher ein Dump. Direkte UPDATEs gehen am DataHandler vorbei: keine History, kein Undo im Backend, kein aktualisierter Reference Index, keine Workspace-Trennung. Nach jedem Eingriff den Frontend-Cache leeren — gerenderte Inhalte liegen sonst unverändert im Page-Cache.
Alle Angaben ohne Gewähr.
Die Befehle und SQL-Anweisungen sind nach bestem Wissen zusammengestellt und auf eigenen Installationen erprobt — getestet werden müssen sie auf deiner.
Konsolenbefehle von EXT:t3sbootstrap
| Befehl | Wofür |
|---|---|
t3sbootstrap:cdnToLocal | Lädt CSS, JS, Schriften und die Bootstrap-Quellen herunter und legt sie lokal ab. Nötig nach jedem Deployment, das typo3temp/ nicht mitnimmt. Der Webserver braucht dafür ausgehenden Internetzugang. |
t3sbootstrap:customScss <Rootseiten-ID> | Schreibt das eigene SCSS aus dem Konfigurations-Datensatz in die Datei und kompiliert es. |
t3sbootstrap:anchor | Erzeugt die Speaking IDs aus den Überschriften. Mit --mode clear werden sie wieder entfernt. |
t3sbootstrap:imageToTextmedia | Migriert den alten CType image nach textmedia. |
t3sbootstrap:textToTextmedia | Dasselbe für den CType text. |
Die ersten beiden gibt es auch als Scheduler-Aufgaben: T3SB CDN to local und T3SB Custom SCSS.
TYPO3-Befehle, die dabei immer gebraucht werden
# Caches leeren - nach jedem direkten DB-Eingriff
vendor/bin/typo3 cache:flush
# Nach einem Extension-Update: TCA, DB-Schema, Statische Dateien
vendor/bin/typo3 extension:setup
vendor/bin/typo3 database:updateschema
# Upgrade Wizards auflisten und einzeln laufen lassen
vendor/bin/typo3 upgrade:list
vendor/bin/typo3 upgrade:run t3sbootstrap_backendlayoutUpgradeWizard
# Reference Index nach SQL-Eingriffen neu aufbauen
vendor/bin/typo3 referenceindex:updateDie Wizards der Extension heissen:
t3sbootstrap_backendlayoutUpgradeWizard
t3sbootstrap_legacyAssetLocationUpgradeWizard
t3sbootstrap_iconpackTitleUpgradeWizard
t3sbootstrap_iconpackHeaderUpgradeWizard
t3sbootstrap_iconpackBodytextUpgradeWizard
t3sbootstrap_navbarBrandImageUpgradeWizard
t3sbootstrap_rteBadgeSettingUpgradeWizard
t3sbootstrap_rteColorSettingUpgradeWizard
t3sbootstrap_anchorUpgradeWizardContainer für einen ganzen Seitenbaum setzen
Das Feld heisst tx_t3sbootstrap_container. Gültige Werte sind 0 (kein Container), container, container-fluid, container-fluid px-0 sowie container-sm bis container-xxl.
Erst die Seiten des Teilbaums sammeln — SQL kennt keine Rootline:
-- Unterseiten einer Seite (eine Ebene)
SELECT uid, title FROM pages
WHERE pid = 123 AND deleted = 0;Dann prüfen, was betroffen wäre:
SELECT uid, pid, CType, header, tx_t3sbootstrap_container
FROM tt_content
WHERE pid IN (123,124,125)
AND deleted = 0
AND t3ver_wsid = 0
AND tx_container_parent = 0;Und erst dann setzen:
UPDATE tt_content
SET tx_t3sbootstrap_container = 'container',
tstamp = UNIX_TIMESTAMP()
WHERE pid IN (123,124,125)
AND deleted = 0
AND t3ver_wsid = 0
AND tx_container_parent = 0;tx_container_parent = 0 ist hier der wichtige Teil: Elemente innerhalb eines Containers bekommen keinen eigenen Container, sonst steckt ein container im nächsten. t3ver_wsid = 0 hält Workspace-Versionen heraus.
Nur bestimmte Inhaltstypen
UPDATE tt_content
SET tx_t3sbootstrap_container = 'container', tstamp = UNIX_TIMESTAMP()
WHERE pid IN (123,124,125)
AND CType IN ('textmedia','bullets','table')
AND deleted = 0 AND t3ver_wsid = 0 AND tx_container_parent = 0;Container wieder entfernen
UPDATE tt_content
SET tx_t3sbootstrap_container = '0', tstamp = UNIX_TIMESTAMP()
WHERE pid IN (123,124,125)
AND tx_t3sbootstrap_container <> '0'
AND deleted = 0 AND t3ver_wsid = 0;Der Wert ist die Zeichenkette '0', nicht die Zahl 0 — das Feld ist ein varchar.
Backend-Layout für viele Seiten umstellen
-- Inventur: welches Layout liegt wie oft?
SELECT backend_layout, COUNT(*) AS anzahl
FROM pages WHERE deleted = 0
GROUP BY backend_layout ORDER BY anzahl DESC;UPDATE pages
SET backend_layout = 'pagets__OneCol',
backend_layout_next_level = 'pagets__OneCol',
tstamp = UNIX_TIMESTAMP()
WHERE pid = 123 AND deleted = 0 AND t3ver_wsid = 0;Ein leerer Wert bedeutet „vom Elternteil erben“. Seit 5.3.56 wird das Layout an Unterseiten vererbt — oft reicht es also, es nur auf der obersten Seite zu setzen und bei den Kindern zu leeren:
UPDATE pages SET backend_layout = '', backend_layout_next_level = ''
WHERE pid IN (123,124,125) AND deleted = 0 AND t3ver_wsid = 0;Extra-Klassen
-- Wo steckt eine bestimmte Klasse?
SELECT uid, pid, CType, header, tx_t3sbootstrap_extra_class
FROM tt_content
WHERE tx_t3sbootstrap_extra_class LIKE '%mb-5%' AND deleted = 0;-- Eine Klasse ersetzen, ohne die übrigen zu verlieren
UPDATE tt_content
SET tx_t3sbootstrap_extra_class =
TRIM(REPLACE(CONCAT(' ', tx_t3sbootstrap_extra_class, ' '), ' mb-5 ', ' mb-4 ')),
tstamp = UNIX_TIMESTAMP()
WHERE tx_t3sbootstrap_extra_class LIKE '%mb-5%'
AND deleted = 0 AND t3ver_wsid = 0;Die Leerzeichen um Suchwort und Feld verhindern, dass mb-5 auch in mb-50 trifft.
Speaking IDs (Anker)
-- Wie viele Elemente haben einen Anker?
SELECT COUNT(*) FROM tt_content
WHERE tx_t3sbootstrap_anchor <> '' AND deleted = 0;Zum Leeren nimmst du besser den Befehl als SQL — er räumt auch die abhängigen Stellen auf:
vendor/bin/typo3 t3sbootstrap:anchor --mode clearFontAwesome-Reste finden
Nach dem Umstieg auf EXT:iconpack bleiben manchmal alte Klassen im Fließtext stehen:
SELECT uid, pid, header FROM tt_content
WHERE deleted = 0
AND (bodytext LIKE '%\"fa fa-%' OR bodytext LIKE '%fa-solid%' OR bodytext LIKE '%fas fa-%');Inventur — was ist überhaupt im Einsatz?
-- Welche Inhaltstypen, wie oft
SELECT CType, COUNT(*) AS anzahl FROM tt_content
WHERE deleted = 0 AND hidden = 0
GROUP BY CType ORDER BY anzahl DESC;-- Konfigurations-Datensätze und ihre Rootseiten
SELECT c.uid, c.pid, p.title AS rootseite, c.record_type
FROM tx_t3sbootstrap_domain_model_config c
JOIN pages p ON p.uid = c.pid
WHERE c.deleted = 0;-- Verwaiste Container-Kinder: Eltern gelöscht, Kind noch da
SELECT k.uid, k.pid, k.CType, k.header
FROM tt_content k
LEFT JOIN tt_content e ON e.uid = k.tx_container_parent
WHERE k.tx_container_parent <> 0
AND k.deleted = 0
AND (e.uid IS NULL OR e.deleted = 1);Hinweise
- Immer
deleted = 0undt3ver_wsid = 0in der Bedingung. Ohne das erste fässt du gelöschte Datensätze an, die im Papierkorb noch wiederherstellbar wären; ohne das zweite veränderst du Workspace-Versionen, die noch gar nicht veröffentlicht sind. tstampmitsetzen. Sonst merkt weder das Backend noch ein Cache-Tag, dass sich etwas geändert hat.- Mehrsprachige Seiten. Übersetzungen sind eigene Zeilen mit eigener
uid. EinUPDATEohne Einschränkung aufsys_language_uidtrifft alle Sprachen — meist genau richtig, bei Layout-Feldern aber nicht immer gewollt. - Reference Index. Nach Eingriffen, die Dateireferenzen oder Verknüpfungen betreffen,
referenceindex:updatelaufen lassen. - Der DataHandler ist der sauberere Weg. Wo es nicht um tausende Datensätze geht, ist ein kurzes CLI-Skript über
DataHandlerdie bessere Wahl: History, Workspaces, Hooks und Reference Index bleiben intakt.