Wenn Sie ab Joomla! 3.9.0 in Frontend die Meldung "0 - Call to undefined method JModuleHelper::getModuleById()" erhalten, kann es daran liegen, dass eine Erweiterung Schuld daran ist.
Die Einstellungen im Backend
Diese Meldung erscheint erst dann, wenn man beim Erstellen von Beiträgen ein Modul einfügen möchte.
Ab der Joomla!- Version 3.9.0 kann man im Editor einen Button finden, der es ermöglicht, ein Modul auszuwählen und innerhalb dieses Beitrags darzustelle.
Dabei wird die ID des Moduls ausgegeben. (siehe Bild rechts)
Die Fehlermeldung im Frontend
Schaltet man nun auch noch die Debug-Funktion von Joomla! ein, wird die Fehlerausgabe in folgender Datei angezeigt:
Call to undefined method JModuleHelper::getModuleById()
/plugins/content/loadmodule/loadmodule.php:225
Ruft man diese Datei auf, kann man folgendes in dieser Zeile finden:
$modules = JModuleHelper::getModuleById($id);
Dies deutet darauf hin, dass die Funktion getModuleById($id)
in der Class nicht vorhanden ist.
ModuleHelper.php unter Joomla! prüfen
Dafür rufen wir folgende Datei unter Joomla! auf und prüfen, ob es tatsächlich diese Funktion im Core nicht gibt.
/libraries/src/Helper/ModuleHelper.php
Und tatsächlich finden wir ab Zeile 647 den Hinweis und anschließend die Funktion getModuleById($id).
Was also verursacht nun diesen Fehler im Frontend von Joomla!?
Die Vermutung: eine Erweiterung eines Drittanbieters (nicht im Grundsystem enthalten) überschreibt die Funktion JModuleHelper.
Die Suche geht weiter.
...
647 /**
648 * Get module by id
649 *
650 * @param string $id The id of the module
651 *
652 * @return \stdClass The Module object
653 *
654 * @since 3.9.0
655 */
656 public static function &getModuleById($id)
657 {
658 $modules =& static::load();
659
660 $total = count($modules);
661
662 for ($i = 0; $i < $total; $i++)
663 {
664 // Match the id of the module
665 if ($modules[$i]->id === $id)
...
Die Suche nach dem Fehler einschränken
Die Suche nach der Dritterweiterung kann man so einschränken, dass als Erstes die Plugins geprüft werden können.
Warum? Weil Plugins unter Joomla! Funktionen vor dem Bereitstellen beeinflussen können.
Da es verschiedene Arten von Plugins gibt, beschränken wir unsere Suche auf die system-Plugins, die auf der gesamten Seite greifen.
Und es gibt noch eine Möglichkeit, die Plugins einzugrenzen.
Man prüft die Plugins, die für die Ausgabe oder Darstellung von Modulen verantwortlich sind.
Das Plugin wurde gefunden
Da wir nun in unserem Fall die Suche nach einen Plugin einschränken konnten, können wir dieses anschließend analysieren.
Dafür durchsuchen wir die Dateien des Plugins auf JModuleHelper.
Die Suche führt uns zur Datei /plugins/system/helix/classes/helper.php die, wie vermutet, die JModuleHelper Class überschreibt.
Leider wurde die Funktion getModuleById($id) nicht in dieser Datei gefunden.
Da das Helix Framework laut Entwickler das letzte mal 2017 aktualisiert wurde, kann diese Funktion gar nicht vorhanden sein.
(Bitte beachten: das Helix Framework ist als HELIX, HELIX II, HELIX3 und HELIX ULTIMATE verfügbar. Die Fehler treten aber nur bei HELIX und HELIX II auf!
Von diesem Fehler sind auch alle Templates betroffen, die das HELX und HELIX II Framework nutzen.)
Link zum Entwickler: Übersicht HELIX Frameworks
628/**
629 * Method to determine if filtering by language is enabled in back-end for modules.
630 *
631 * @return boolean True if enabled; false otherwise.
632 *
633 * @since 3.8.0
634 */
635 public static function isAdminMultilang()
636 {
637 static $enabled = false;
638
639 if (count(LanguageHelper::getInstalledLanguages(1)) > 1)
640 {
641 $enabled = (bool) ComponentHelper::getParams('com_modules')->get('adminlangfilter', 0);
642 }
643
644 return $enabled;
645 }
646
647 /**
648 * Get module by id
649 *
650 * @param string $id The id of the module 651 *
652 * @return \stdClass The Module object
653 *
654 * @since 3.9.0
655 */
656 public static function &getModuleById($id)
657 {
658 $modules =& static::load();
659
660 $total = count($modules);
661
662 for ($i = 0; $i < $total; $i++)
663 {
664 // Match the id of the module
665 if ($modules[$i]->id === $id)
666 {
667 // Found it
668 return $modules[$i];
669 }
670 }
671
672 // If we didn't find it, create a dummy object
673 $result = new \stdClass;
674 $result->id = 0;
675 $result->title = '';
676 $result->module = '';
677 $result->position = '';
678 $result->content = '';
679 $result->showtitle = 0;
680 $result->control = '';
681 $result->params = '';
682
683 return $result;
684 }
Den Fehler beheben
Da wir nun wissen, welche Datei den Fehler verursacht, so können wir nun die Fehlfunktion beheben.
Dafür nutzen wir den Code aus der ModuleHelper.php, der seit 2017 ergänzt wurde und fügen diesen in die /plugins/system/helix/classes/helper.php ein.
Die beste Stelle zum Einfügen des Codes ist fast an Ende der Datei, vor der letzten schließenden geschweiften Klammer }.
Achtung
Bevor Sie die Änderungen vornehmen, sollten die folgenden Punkte berücksichtigt werden:
- vor dem Eingriff ein Backup der Webseite und der Datenbank erstellen (Akeeba Backup)
- eine Kopie der helper.php erstellen und bei Bedarf oder Fehlfunktion bereit halten
- nicht auf der Liveseite arbeiten
Wenn Sie nicht sicher sind, ob Sie die Arbeiten selbst durchführen können oder wollen, stehen wir Ihnen gerne zur Verfügung.
Weitere Informationen
Dies ist nur ein Beispiel, welches zeigt, wie man Fehler unter Dritterweiterungen finden und beseitigen kann.
Die Fehlermeldung 0 - Call to undefined method JModuleHelper::getModuleById() kann auch von anderen Dritterweiterungen (Plugins, Komponenten, Module, Templates) ausgelöst werden und beschränkt sich nicht nur auf das HELIX Framework.
Auch die Fehlermeldung 0 Call to undefined method JModuleHelper::isAdminMultilang() wird bei der Anpassung der helper.php beseitigt.
Die Angaben in diesem Beitrag sind ohnen Gewär und können die Fehlermeldung nicht in allen Fällen unterbinden.
Wenn Sie unter Joomla! diese Fehlermeldung haben, können Sie gerne mit uns Kontakt aufnehmen und wir versuchen, den Fehler zu beseitigen.