Update von Typo3 8.7 auf Typo3 10.4
Neben dem klassischen Weg über den Update-Manager gibt es noch einen weiteren Weg um ein vorhandenes System zu aktualisieren, welches auf dem Nettemplate aufsetzt.
Update über .t3d
Für diesen Weg habe ich folgende Schritte unternommen:
- Auf der alten Seite die Datei tx_impexp_presets.sql importiert in die leere Datenbanktabelle tx_impexp_presets (Die BenutzerID in dem Datensatz muss diejenige des Benutzers für den Export sein, hier 1).
- Damit einen Export im .t3d Format, das xml-Format scheint hier nicht zu funktionieren (Speicher Probleme beim Import)
- Von den Fehlermeldungen nicht irritieren lassen, sondern unter Datei&Voreinstellungen die Einstellung auswählen und laden
- Weiter unten kann man einen Namen angeben und die Datei dann sichern
- Dann ein neues Typo3-System angelegt ohne Seitenbaum. Dazu habe ich das Paket nettemplate_2.0.5.zip installiert (.zip Upload), aus dem ich vorher die Datei data.xml im Verzeichnis Installation entfernt habe
- Die .t3d Datei ist meistens so groß, dass sie nicht im Browser hochgeladen werden kann, ich habe sie dann direkt in das Verzeichnis fileadmin/user_upload/_temp_/importexport/ kopiert
- Auf dem neuen System habe ich diese Datei dann importiert
- * Ähnlich ist es mit den Dateien für Formulare. Die liegen jetzt im Verzeichnis fileadmin/form_definitions/ auch da einmal per Hand kopiert.
- Unter DB-Überprüfung den Referenz-Index aktualisieren
- Dann noch die Seite Ausgangsseite zum Ordner machen und die Slugs aller direkten Unterseiten aktualisieren, die Weiterleitungen kann man jeweils entfernen
Wenn jetzt niemand Veränderungen an den Templates und Typoscript Dateien vorgenommen hat, dann sollte damit das Update erledigt sein.
- Veränderte Template-Dateien lassen sich leicht finden. Beim Import werden die vorhandenen Dateien nicht überschieben, sondern die im t3d vorhandenen geänderten Dateien werden mit einem _01 versehen, sind also leicht zu finden. Soweit es Dateien aus dem Template betrifft können die Veränderungen problemlos übernommen werden. Dies Dateien kann man aufspüren mittels
cd fileadmin find . -name *_01\.*
- Die Dateien mit dem _01 im Namen stammen von der alten Installation und können in der Regel direkt übernommen werden.
Vorteile dieses Verfahren
- alle nicht benutzten Dateien werden sich nicht im neuen System anfinden
Nachteile des Verfahrens
- Bei großem Datenvolumen kann es Probleme mit dem Speicher bzw. der Ausführungszeit geben. Dann funktioniert eventuell nur der klassische Weg.
- Wenn nach dem Start des Exports der Bereich einfach nur grau wird, dann langt der Speicher nicht. Man braucht in der Regel mehr Haupt-Speicher, als das Festplattenvolumen der Seite.
Schwierigkeiten
Bei umfangreicheren und auch älteren Webseiten schlägt der Export von der Seite 0 oft fehl. In diesem Fall greife ich zum Export über die Ausgangsseite. Dann sind aber eine Reihe von Datenbank-Tebellen direkt zu manipulieren:
- sys_file
- sys_file_metadata
- be_groups
- be_users
Und die Grafikdateien werden auch nicht kopiert, das muss man dann händisch machen.
Folgende Schritte:
- Ausgangssystem aufräumen, vor allem die Datenbank aktualisieren
- T3D-Export ausgehend von der Ausgangsseite, alle weiteren Seiten sind Kindseiten, ich übernehme folgende Tabellen
- be_groups
- be_users
- sys_file
- sys_file_metadata
- sys_file_filemounts
- sys_file*
- sys_language
- sys_news*
- backend_layout
- sys_domain
- sys_template
- tt_content
- index_conf
- tx_gridelements
- eventuell noch News-Seite extra importieren
- im Zielsystem nettemplate installieren ohne den Seitenbaum
- im Zielsystem root-Seite erstellen und konfigurieren
- site-Einstellungen vornehmen
- t3d Dateien auf das neue System kopieren
- von der root-Seite ausgehend importieren (uid erzwingen)
- root-Templates aktivieren
- es fehlen jetzt die Bilder, die vom alten auf das neue System kopieren (hoffentlich eine sinnvolle Struktur)
- auf dem Ausgangssystem folgende Datenbanktabellen exportieren:
- sys_file
- sys_file_metadata
- be_groups
- be_users
- auf dem Zielsystem in dieser Reihenfolge in die richtige Tabelle importieren dabei darauf achten:
- die Importdateien stehen in den sys_file Tabellen (1 bzw. zwei), dort löschen
- tauchen beim Import Meldungen über unbekannte Spalten auf, diese in der Zieldatenbank Ergänzen (t3ver_id: int(11), t3ver_label: varchar(30) )
- nach dem Import die Datenbank jeweils wieder prüfen und korrigieren lassen.
Konfiguration der Backend-Anmeldung
Manche Betreiber mochte auch das Formular für die Anmeldung (https://<meine domain>/typo3) gestalten. Das geht aktuell über Einstellungen -> Extension Konfiguration -> backend :
Anpassungen an fluid_styled_content
An mehreren Stellen ha mich gestört, dass HTML-Elemente nicht gerendert werden, z.B.
- in Bildunterschriften
- Tabellen
Es gibt dafür eine einfache Lösung.
Man erweitert des Typoscript, indem man an die setup.txt folgende Zeile anhängt:
lib.contentElement.partialRootPaths.200 = {$resDir}/Private/Partials/
Damit sagt man, dass Fluid Partials zuerst im angegeben Verzeichnis suchen soll. Dann kopiert man das Partial, mit dem man nicht zufrieden ist dorthin
cd fileadmin/nettemplate/Resources/Private/Partials cp -a ../../../../../typo3/sysext/fluid_styled_content/Resources/Private/Partials/Table/ .
oder dann
cp -a ../../../../../typo3/sysext/fluid_styled_content/Resources/Private/Partials/Media/ .
Nun ersetzt man in der Datei
Columns.html
bzw.
Type/Image.html
Zeilen der Art
{cell -> f:format.nl2br()}
durch
<f:format.htmlentitiesDecode>{cell}</f:format.htmlentitiesDecode>
Bzw.
{file.description -> f:format.nl2br()}
durch
<f:format.htmlentitiesDecode>{file.description}</f:format.htmlentitiesDecode>
Conditions
Bisher habe ich folgendermaßen abgefragt, ob ein Benutzer im backend angemeldet ist.
[globalVar = TSFE : beUserLogin > 0]
Das funktioniert nicht mehr.
Mit Typo3 9 muss man stattdessen schreiben
[getTSFE().isBackendUserLoggedIn()]
Seit Typo3 10 geht es übersichtlicher mit
[backend.user.isLoggedIn]
Das bietet noch mehr Möglichkeiten
[backend.user.isAdmin] [backend.user.userId == 2]
Merkwürdigkeiten in Fluid
Etwas wie
<f:if condition="({Item.children} && {Item.active})"> <f:render section="submenu" arguments="{submenu: Item.children}"/> </f:if>
funktioniert leider nicht. Man kann den Umweg wählen:
<f:if condition="{Item.children}"> <f:if condition="{Item.active}"> <f:render section="submenu" arguments="{submenu: Item.children}"/> </f:if> </f:if>
oder folgende Krücke (noch nicht getestet) über einen Array-Vergleich
<f:if condition="{0:Item.children} = {0:'1'} && {0:Item.active} = {0:'1'}"> <f:render section="submenu" arguments="{submenu: Item.children}"/> </f:if>
oder eventuell
<f:if condition="{0:Item.children,1:Item.active} == {0:'1',1:'1'}"> <f:render section="submenu" arguments="{submenu: Item.children}"/> </f:if>