Joomla nach Backup-Restore: „Call to undefined method MenuHelper::getItems()“ beheben

Nach einem fehlgeschlagenen Joomla-Update kann es naheliegend sein, einfach ein wenige Tage altes Backup zurückzuspielen. Das funktioniert jedoch nicht immer so sauber, wie man erwarten würde.

In meinem Fall war zuvor ein Update von Joomla 5.2.5 auf Joomla 5.4.x erfolgt. Nachdem anschließend Probleme mit einer Erweiterung auftraten, wurde ein Backup des älteren Joomla-5.2.5-Stands wiederhergestellt.

Danach funktionierte das Joomla-Backend wieder, das Frontend jedoch nicht. Stattdessen erschien:

Call to undefined method Joomla\Module\Menu\Site\Helper\MenuHelper::getItems()

Das Problem

Der Fehler deutet zunächst auf das Joomla-Menümodul beziehungsweise dessen PHP-Klassen hin.

Auffällig war jedoch der zeitliche Zusammenhang:

  1. Joomla 5.2.5 funktionierte.
  2. Das System wurde auf Joomla 5.4.x aktualisiert.
  3. Danach traten Probleme auf.
  4. Ein Backup des vorherigen Joomla-5.2.5-Stands wurde über die bestehende Installation zurückgespielt.
  5. Backend-Zugriff war wieder möglich, das Frontend erzeugte jedoch den MenuHelper::getItems()-Fehler.

Damit lag der Verdacht nahe, dass nicht die komplette Installation wieder exakt auf den alten Zustand zurückgesetzt worden war.

Ursache: Ein Restore löscht nicht automatisch alle vorhandenen Dateien

Der wichtige Punkt ist, wie ein typischer Joomla-Backup-Restore funktioniert.

Beim Wiederherstellen werden Dateien aus dem Backup auf den Server geschrieben. Vorhandene Dateien mit demselben Namen werden dabei ersetzt.

Dateien, die bereits auf dem Server liegen, aber im Backup nicht vorkommen, werden dagegen nicht zwangsläufig gelöscht.

Das ist grundsätzlich sinnvoll. Ein Restore kann schließlich nicht sicher wissen, ob zusätzliche Dateien:

Ein Restore ist deshalb nicht automatisch mit einer vollständigen Synchronisation des Dateisystems auf den Zustand des Backups gleichzusetzen.

Warum das bei Joomla-Versionen problematisch werden kann

Bei einem Joomla-Update können sich nicht nur Inhalte bestehender Dateien ändern.

Zwischen Joomla-Versionen können auch Dateien:

Wird anschließend ein Backup einer älteren Joomla-Version über diesen neueren Stand zurückgespielt, entsteht deshalb möglicherweise ein Mischzustand:

Joomla 5.2.5 aus dem Backup
+
übrig gebliebene Dateien aus Joomla 5.4.x
=
potenziell inkonsistente Installation

Das war in diesem Fall die naheliegende Erklärung für den Methodenfehler im Frontend.

Wichtig ist die Unterscheidung:

Gesichert ist, dass ein Restore zusätzliche vorhandene Dateien nicht zwingend entfernt und dadurch nach einem Versionswechsel Dateireste bestehen bleiben können.

Nicht abschließend nachgewiesen wurde, welche konkrete verbliebene Datei den MenuHelper::getItems()-Fehler ausgelöst hatte.

Lösung: Joomla-Dateien vor dem Restore bereinigen

Statt das ältere Backup noch einmal einfach über die vorhandene Installation zu schreiben, sollte zunächst der bestehende Joomla-Core entfernt werden.

Vorher sollte selbstverständlich ein Rückfallpunkt vorhanden sein. Bei einem VPS kann dafür beispielsweise ein Snapshot verwendet werden.

Ein Snapshot eignet sich gut, um den kompletten Serverzustand vor solchen Änderungen kurzfristig wiederherstellen zu können. Er ersetzt allerdings nicht grundsätzlich ein dauerhaftes und extern verfügbares Backup.

Joomla-Core-Verzeichnisse entfernen

Vor dem erneuten Restore können insbesondere die Joomla-Core-Verzeichnisse entfernt werden:

administrator
api
cli
components
includes
language
layouts
libraries
media
modules
plugins
templates

Außerdem gehören zentrale Joomla-Dateien dazu, beispielsweise:

configuration.php
index.php

Danach wird das Backup erneut in das nun bereinigte Webverzeichnis eingespielt.

Achtung bei eigenen Dateien

Die Liste darf nicht blind auf jede Installation angewendet werden.

Vor dem Löschen muss geprüft werden, ob sich in diesen Verzeichnissen eigene Dateien oder nicht anderweitig gesicherte Inhalte befinden.

Das gilt insbesondere für:

media
templates

Dort können je nach Installation beispielsweise eigene Medien, Template-Anpassungen oder zusätzliche Dateien liegen.

Der entscheidende Punkt ist daher nicht:

Lösche immer exakt diese Verzeichnisse.

Sondern:

Stelle sicher, dass vor dem Restore keine Dateien einer anderen Joomla-Version im Zielsystem zurückbleiben.

Datenbank beim Restore

Auch die Datenbank sollte zum Backup-Zustand passen.

Beim Restore sollte derselbe Tabellenpräfix verwendet werden wie in der gesicherten Joomla-Installation.

Wenn das verwendete Restore-Werkzeug die Möglichkeit bietet, vorhandene Tabellen mit demselben Präfix vor dem Import zu entfernen, verhindert das ebenfalls einen Mischstand aus alter und neuer Installation.

Dateisystem und Datenbank sollten nach dem Restore gemeinsam zum selben Sicherungszeitpunkt gehören.

Optional: Joomla-Autoload-Cache neu erzeugen

Falls anschließend weiterhin Fehler auftreten, bei denen Namespaces oder Joomla-Klassen offenbar nicht zum Dateibestand passen, kann zusätzlich der Joomla-Autoload-Cache relevant sein.

Die entsprechende Cache-Datei liegt unter:

administrator/cache/autoload_psr4.php

Sie kann gelöscht werden, damit Joomla sie neu erzeugt.

Das ist jedoch ein zusätzlicher Reparaturschritt und ersetzt nicht die Bereinigung eines tatsächlich inkonsistenten Dateibestands.

Warum einfaches „Backup drüberspielen“ nicht genügt

Der entscheidende Unterschied ist:

Restore:
Backup-Dateien auf das vorhandene Dateisystem schreiben

ist nicht zwingend dasselbe wie:

Rollback:
Das gesamte Dateisystem exakt auf einen früheren Zustand zurücksetzen

Ein VPS-Snapshot kommt dem zweiten Fall deutlich näher, weil dabei der komplette gespeicherte Systemzustand zurückgesetzt wird.

Ein Joomla-Backup-Restore arbeitet dagegen innerhalb des vorhandenen Dateisystems. Deshalb können Dateien überleben, die zum Zeitpunkt des Backups noch gar nicht existierten.

Ergebnis

Für fehlgeschlagene Joomla-Updates ergibt sich daraus ein wichtiger Grundsatz:

Wenn ein Backup einer älteren Joomla-Version nach einem Update wiederhergestellt werden soll, sollte man vermeiden, es einfach über den neueren Dateibestand zu entpacken.

Sicherer ist:

  1. Rückfallpunkt erstellen.
  2. Eigene Dateien und Anpassungen sichern beziehungsweise identifizieren.
  3. Vorhandenen Joomla-Core bereinigen.
  4. Backup wiederherstellen.
  5. Datenbank auf denselben Sicherungsstand bringen.
  6. Frontend und Backend testen.
  7. Bei Namespace-Problemen gegebenenfalls den Joomla-Autoload-Cache neu erzeugen.

Ein Fehler wie

Call to undefined method Joomla\Module\Menu\Site\Helper\MenuHelper::getItems()

muss damit nicht zwangsläufig bedeuten, dass das Menümodul selbst defekt ist.

Nach einem Restore über eine andere Joomla-Version hinweg sollte auch geprüft werden, ob schlicht Dateien unterschiedlicher Joomla-Versionen miteinander vermischt wurden.