Problembeschreibung
Manche Komponenten in Joomla nutzen MooTools, andere und mittlerweile das Joomla selbst verwenden jQuery. Es kann passieren, dass beide JavaScript-Frameworks geladen werden. Das führt jedoch häufig zu Konflikten, weil beide Frameworks den Kurzbezeichner $ verwenden um angesprochen zu werden. Grundsätzlich ist das in Joomla längst kein Problem mehr, selbst dann wenn man beide Frameworks gleichzeitig nutzen will. Zum einen ist gebräuchlich eine jQuery-Methode namen noConflict() einzubinden und zu nutzen. Zum anderene ist es notwendig diese dazu in der korrekten Reihenfolge zu laden. Dies verhindert Konflikte im gleichen Namensraum.
Aber darum muss sich nicht jede Komponente oder der Webmaster der Seite mehr selbst kümmern. Dafür hat Joomla schon diverse Methoden zur Verfügung gestellt, die das korrekte Handling sicherstellen. Wichtig ist nur, dass die Komponte, die z.B. jQuery verwenden will, zur Sicherheit diese Joomla-Methoden verwendet - zum einen das Einbinden der Frameworks über die Klasse JHtml::_(...) und zum anderen die evtl. notw. Reihenfolge und Konfliktvermeidung JHtml::_('behavior.framework', true);.
Jedoch scheint es noch einen kleinen Nachteil zu geben, der sich bei mir konkret z.B. bei der Verwendung von BreezingForms-Formularen aber auch bei Attachements zeigte: BF verwendet jQuery jedoch nicht MooTools, will aber verhindern, dass es bei der gleichzeitigen Nutzung von Mootools durch andere Komponenten mit dem notw. jQuery zu Konflikten kommt, und ruft deshalb in allen Scripten die BFQuickMode*.php heißen auch die Methode behavior.framework() auf. Dadurch wird jedoch MooTools geladen, auch dann wenn es eigentlich durch gar keine Komponente oder BF genutzt wird. Zum einen ist das schlecht für die Performance, wenn ungenutzte Scripte sinnlos geladen werden, zum anderen kann das Laden von Mootools überhaupt erst wieder eine Störquelle schaffen.
Lösung
Um also zu verhindern, dass eine Komponente so auch BreezingForms MooTools unnütz lädt, muss in den Scripten nach o.g. Zeile JHtml::_('behavior.framework', true); gesucht werden und diese auskommentiert werden. Leider betrifft das - wie in BreezingForms die genannten BFQuickMode*.php-Scripte - durchweg Core-Scripte. Diese Modifikationen sind also in dem Wissen vorzunehmen, dass diese Scripte mit dem nächsten Komponenten-Update wieder überschrieben werden könnten.
Eine Alternative wäre, ein eigenes Plugin zu programmieren, welches aus dem Array der durch Joomla einzubindenden Frameworks und Scripte die wieder herauslöscht, die unerwünscht sind. Das wäre eine Lösung die sicher vor Updates ist. Ein solches "unloadScripts"-Joomla-Plugin habe ich mal programmiert, um das lästige mootools in BreezingForms los zuwerden.
Als Anhang zu diesem Beitrag habe ich das Script zum Download beigefügt. Bitte beachten! Die Nutzung erfolgt auf eigene Gefahr!
Ist sicher auch für andere Problemfälle geeignet, zumal es nicht nur MooTools entfernen kann, sondern auch beliebig andere störende Scripte.
{attachments}
Ähnliches Problem in der Komponente Attachments (Anhänge) mit modal.js und SqueezeBox
Ein ähnliches Problem tritt auf beim Einsatz der Erweiterung Attachments oder DropPics, die ebenfalls mit der SqueezeBox als modales Popup arbeiten. Sobald bei Verwendung der Attachments-Erweiterung ein Joomla-Beitrag oder Blog im Frontend aufgerufen wird, wird durch die Attachments-Plugins auch die für den Frontend-Editor notwendige Funktion zum Anhängen von Dokumenten aktiviert. Hierfür will Attachments dann ein modales Fenster öffnen, indem man die Dokumenten-Anhänge für den Beitrag konfigurieren könnte. Dabei wird von Attachments unter bestimmten Umständen das Script modal.js eingebunden, um die SqueezeBox inititalisieren zu können. Typisch sind dann folgende Fehler:
ReferenceError: Hash is not definedmodal.js:7:7444 <anonymous> http://domain.de/media/system/js/modal.js TypeError: SqueezeBox is undefined
Weitere Scripte können wg. dieser Fehler dann nicht ausgeführt werden und es kommt zu Funktionsstörungen auf der Website.
Grundsätzlich macht Attachments hier schon ein Joomla-konformes Handling der Einbindung der modal-Box-Funktion, aber irgenwie funktioniert es doch nicht so richtig. Dieses Handling erfolgt im Script components/com_attachments/javascript.php unter Verwendung von Joomlas JHtml::_('behavior.modal', 'a.modal');. James Cameron nimmt dazu Bezug in seinem Github-Post https://github.com/jmcameron/attachments/issues/4 und erklärt den Fehler als behoben, was er in meinen Projekten jedoch nicht ist. Sobald man aber in diesem Script für Joomla 3.9.x die relevante Zeile 31 auskommentiert, verschwinden die Fehler und Störungen. Leider wäre das eine Core-Script-Modifikation und somit keine dauerhafte Lösung.
Das Laden des modal.js-Scriptes lässt sich durch mein oben gelinktes Plugin verhindern. Verhindern lässt sich aber nicht die immernoch stattfindende Initialisierung der SqueezeBox, da diese als Inline-Script in den HTML geschrieben wird.
Link-Hinweis: Sehr gute Informationen zu Anwendung und Funktion der Joomla-Modal-Box speziell in Verbindung mit 3rd-Party-Erweiterungen liefert dieser Artikel. Weiter Links zum Thema:
- https://joomla-tips.org/template-trickery/a-hidden-gem-the-modal-script-shipped-with-joomla.html
- https://www.quora.com/What-is-SqueezeBox-in-Joomla