Contao-Migration 4.9 → 4.13 → 5.7

1. Docker, PHP, Composer und Datenbank

Problem Lösung / Vorgehen
Direkter Sprung von Contao 4.9 auf 5.7 Migration über 4.13 als Zwischenschritt.
PHP-Version nicht kompatibel 4.9 mit PHP 7.4; für den weiteren Upgradepfad PHP anheben; Zielumgebung PHP 8.4.26.
Composer-Abhängigkeiten blockieren Update composer why-not und composer prohibits zur Konfliktanalyse.
Sicherheitsmeldungen blockieren Composer-Dry-Run Temporär --no-security-blocking für die Simulation; Advisories anschließend gesondert prüfen.
Alte Erweiterungen verhindern Contao 5 Nicht kompatible Pakete aktualisieren, ersetzen oder entfernen.
Composer-Plattformanforderungen composer check-platform-reqs ausgeführen
MariaDB-Version in Docker MariaDB 11.4.9 mit DB_SERVER_VERSION_COMPLETE_NAME=11.4.9-MariaDB-ubu2404 verwendet.
MariaDB-Downgrade mit vorhandenem Volume Nicht direkt downgraden; bei Bedarf Dump und Import verwenden.
Contao zeigt nach Docker-Migration „Contao installieren“ Datenbankverbindung, Umgebungsvariablen, Document-Root und Cache prüfen.
Veraltete Contao-Konfiguration url_suffix Eintrag aus contao.yaml entfernen.
Fehler bei Symfony-/Contao-Parametern Veraltete Konfiguration entfernen und Cache neu aufbauen.
Alte Datenbankspalten contao:migrate ausführen; nicht mehr benötigte Spalten prüfen.

2. PHP-Templates und Twig-Migration

Problem Lösung / Vorgehen
Alte .html5-Templates Nach .html.twig migrieren.
PHP-Syntax funktioniert nicht in Twig foreach, if, echo durch Twig-Syntax ersetzen.
Globale Klasse Controller nicht gefunden \Contao\Controller::replaceInsertTags() verwenden.
Globale Klasse System nicht gefunden Veraltete Klassenaufrufe in RSCE-Konfigurationen ersetzen bzw. entfernen.
System::getImageSizes() verursacht Fehler Aufruf aus betroffenen RSCE-Konfigurationen entfernt.
block_unsearchable.html.twig nicht vorhanden Nicht von einem nicht vorhandenen Template erben; passende Contao-Struktur verwenden.
HTML-Wrapper nach Migration verschwunden Ursprüngliche div, Klassen und Block-Strukturen wiederherstellen.
Twig-Variablen teilweise nicht vorhanden Mit is defined, default() und dump() prüfen.
Leere Werte verursachen Fehler Vor Ausgabe auf is defined und is not empty prüfen.
HTML wird als < und > ausgegeben Bei vertrauenswürdigem HTML |raw verwenden.
Insert-Tags in URLs bleiben unverarbeitet |insert_tag verwenden.
CSS-/JavaScript-Verhalten verändert Originale HTML-Struktur, Klassen und Initialisierungen beibehalten.

3. RockSolid Custom Elements (RSCE)

Problem Lösung / Vorgehen
Alte RSCE-PHP-Konfigurationen Für Contao 5.7 kompatibel machen.
Fehler bei Bildgrößen in RSCE-Konfigurationen Alte System::getImageSizes()-Verwendung entfernen.
Bildfeld enthält UUID statt Dateipfad UUID über Contao-Bildfunktionen auflösen.
contao_figure() liefert String statt Objekt Ergebnis als HTML behandeln; nicht auf .src zugreifen.
Impossible to access attribute "image" on a string Fertiges Figure-HTML nicht als Figure-Objekt an Twig-Komponenten übergeben.
linkTitle am FigureBuilder unbekannt Nicht unterstützte Builder-Eigenschaft entfernen.
Doppelte <figure>-Elemente Kein eigenes <figure> um contao_figure() setzen.
Bildunterschrift unerwünscht figcaption ausblenden; saubere Template-Anpassung noch offen.
Bild wird teilweise automatisch verlinkt Ursache der Linkausgabe noch nicht abschließend geklärt.
Bilder unterschiedlich hoch Einheitliches aspect-ratio und object-fit: cover.
RSCE-Headline erzeugt leeres <h2> Tatsächliche Datenstruktur der Überschrift prüfen.
Links enthalten {{link_url::...}} Über |insert_tag auflösen.
HTML-Icons in Linktexten werden maskiert |insert_tag|raw für vertrauenswürdigen Linktext.

4. Bilder, Galerien und Slider

Problem Lösung / Vorgehen
stdClass::$href in Bootstrap-Galerie nicht vorhanden !empty($col->href) verwenden.
col.margin, caption, linkTitle fehlen Optionale Eigenschaften mit is defined absichern.
Galerie-Layout verändert sich Originale HTML-Struktur und Bootstrap-Klassen erhalten.
Galerie-Navigation funktioniert nicht korrekt grid.next() und ursprüngliche Grid-Struktur berücksichtigen.
Hintergrundbild wird nicht angezeigt Prüfen, ob der Bildpfad korrekt aufgelöst wird.
Hintergrundelement hat Höhe 0 Elementhöhe über CSS sicherstellen.
Slider-Bild zeigt UUID als URL contao_figure() zur Auflösung nutzen.
Zugriff auf image.src verursacht Fehler contao_figure() liefert HTML; Bild-URL daraus extrahieren.
Swiper-Konfiguration ungültig Twig-Werte mit json_encode|raw an JavaScript übergeben.
JavaScript-Fehler bei classList Vorhandensein der DOM-Elemente und Slider-Struktur prüfen.

5. Navigation, Mmenu und Seitenlayout

Problem Lösung / Vorgehen
Mmenu-JavaScript liefert 404 Bundle-Assets und Symlinks prüfen.
Browser meldet MIME-Type-Fehler Statt JavaScript wird eine HTML-Fehlerseite ausgeliefert.
Datei existiert im vendor-Verzeichnis Zugriff aus dem Webserver-Container separat prüfen.
Symlink im PHP-Container funktioniert Gemeinsame Volumes und Pfade im Nginx-Container prüfen.
Altes fe_page-Template Auf Contao-5-Twig-Struktur umstellen.
Seitenbereiche fehlen contao_section() bzw. contao_sections() verwenden.
Mmenu-Template verwendet alte PHP-Klassen Namespaces korrigieren.
Navigation/Frontend sieht anders aus Ursprüngliche CSS-Klassen und HTML-Verschachtelung erhalten.

6. Nachrichten und weitere Inhaltselemente

Problem Lösung / Vorgehen
hasMetaFields in News-Templates fehlt Mit default(false) absichern.
Veröffentlichungsdatum verschwindet Nicht ausschließlich von hasMetaFields abhängig machen; vorhandene Datumswerte prüfen.
news_latest und news_full erzeugen Fehler Fehlende Twig-Variablen absichern.
news_latest_presse funktioniert nicht vollständig Alte PHP-Datenstruktur mit Twig-Kontext abgleichen.
Bildausgabe mit insert('image', ...) Auf passende Contao-5-Bildausgabe umstellen.
mod_breadcrumb.html5 mit leerer Klasse Vor Zugriff !empty() prüfen.
Bootstrap-Galerie mit optionalem Link Link nur erzeugen, wenn href vorhanden ist.

7. Suchmaschine und Suchindex

Problem Lösung / Vorgehen
Suchformular zeigt keine Treffer keyword, results und pagination geprüft.
Verdacht auf fehlende Twig-Variablen dump(_context|keys) zeigte: Variablen sind vorhanden.
results bleibt leer Suche funktioniert, aber Suchindex enthält keine Daten.
tl_search hat 0 Einträge Suchindex neu aufbauen.
Crawler bricht sofort ab Docker-Hostname kl2026.docker nicht auflösbar.
getent hosts kl2026.docker liefert nichts DNS-/Docker-Netzwerkkonfiguration korrigieren.
Could not resolve host: kl2026.docker Docker-Netzwerk-Alias oder passende Hostauflösung einrichten.
Crawler sendet nur eine Anfrage Startseite nicht erreichbar; keine weiteren Seiten indexierbar.
tl_search_index ohne Suchwörter Wird erst beim erfolgreichen Crawling gefüllt.

8. Datenbankmigration und Bereinigung

Problem Lösung / Vorgehen
Alte Contao-4-Datenbankstruktur contao:migrate ausführen.
tl_layout.mooSource und jSource veraltet Migration prüft deren Entfernung.
tl_page.sitemapName und createSitemap veraltet Migration prüft deren Entfernung.
singleSRC und ähnliche Dateireferenzen UUID-Format und Zuordnung in Contao 5 beachten.
RSCE-Verwendung in Datenbank finden tl_content nach type LIKE 'rsce_%' durchsuchen.
Zugehörige Seiten der RSCE ermitteln tl_content → tl_article → tl_page verknüpfen.