Problembeschreibung

Wer selbst Joomla-Erweiterungen programmiert, wird immer mal wieder auch Scripte (css, oder JavaScript) in den Header laden wollen. Das erfolgt üblich über folgende Scriptzeilen:

$document = JFactory::getDocument();
$document->addScript($this->baseurl . "/components/com_meineerweiterung/assets/js/meinscript.js");

Da hierbei auch häufig ein Overriding von aufeinander aufbauenen Scripten stattfindet ist die Reihenfolge in der die Scripte geladen werden entscheidend. Werden Scripte in der Reihenfolge falsch geladen, stellt sich nicht das erwartete Ergebnis ein, oder es kommt zu Konflikten. Ein typisches Beispiel für derartige Konflikte resultieren immer mal wieder aus der Reihenfolge in der Mootools und jQuery-Bibliotheken geladen werden.

Nun hat man manchmal den Eindruck gar nicht nachvollziehen zu können, in welcher Reihenfolge die Script überhaupt von Joomla geladen werden. Ich hatte schon Situationen erlebt, wo nach einem Update einer Komponente im Vergleich zur Vorversion plötzlich Scripte in andere Reihenfolge geladen wurden. Durch Joomla wird die Reihenfolge des Aufrufs im Header in der Weise festgelegt, wie die Erweiterungen, die diese Scripte laden abgearbeitet werden. Auch das kann in jedem Projekt anders sein. Hier sollte man also zur Sicherheit nichts dem Selbstlauf überlassen.



 

Problemlösung

Eigentlich ist die Lösung recht einfach, wenn man obige Information als Grundlage versteht, dass die Scripte in der Reihenfolge ausgegeben werden, wie dies in Joomla angewiesen wird. Zum Verständnis: mit dem Aufruf der Methode addScript befüllt Joomla intern ein Array. Jeder Eintrag erhält einen Index. gibt es einen Eintrag schon, wird er nicht noch einmal vorgenommen. Das machen wir uns zu Nutze.

Bei Betrachtung unseres Headers stellen wir fest, dass z.B. jQuery.js nach unserem Script jQuery.meinScript.js geladen wird. D.h. unser Erweiterungsscript in dem wir jQuery.meinScript.js in das Header-ScriptArray schieben, wird vor dem Joomla-Script ausgeführt, welches jQuery lädt. Nun machen wir in unserem Erweiterungsscript einfach folgendes. Wir laden hier vor unserem Script zusätzlich das jQuery:

$document = JFactory::getDocument();
$document->addScript("//ajax.e10f949fcaacdb195442bfb5062d59de-gdprlock/ajax/libs/jquery/1.6.4/jquery.min.js");
$document->addScript($this->baseurl . "/components/com_meineerweiterung/assets/js/meinscript.js");

Mehr ist schon gar nicht zu tun. Wir brauchen nicht Angst zu haben, dass jQuery nun zweimal geladen würde - s.o. Allerdings muss natürlich aufgepasst werden, besonders wie hier im Beispiel der jQuery, dass wir exakt den gleichen URL verwenden. jQuery würde zweimal geladen werden, wenn sich die URLs bei den Einbingungen unterscheiden würden!