Problembeschreibung

Nach wie vor steht auch in Joomla 2.5 die Problematik, dass Joomla und auch Komponenten/Plugins/Templates/Module sich jeweils selbst um das Laden von evtl. benötigten JS-Bibliotheken/Frameworks kümmern und dies je nach Laune der Entwickler in unterschiedlichen Versionen und von unterschiedlichen Plätzen. Da ist VirtueMart schon fast vorbildlich, in dem man in der Konfiguration schon festlegen darf, ob die jQuery durch VM geladen werden soll oder nicht - jedoch wenn dann zwangsläufig von der googleapi. Das Phoca-Gallery-Slideshow-Plugin steigt da gleich etwas härter ein und lädt aus dem lokalen Komponentenverzeichnis /components/com_phocagallery/assets/jquery/jquery-1.6.4.min.js.

Diese Verfahrensweise unter Joomla hat gravierende Nachteile.

  1. Man hat keinen Einflus darauf wann eine Bibliotkek geladen wird. Das kann zu Konflikten führen wenn z.B. ein query-Funktionsscript geladen werden soll aber die Bibliothek selbst vorher noch nicht geladen wurde.
  2. Man muss mitunter machtlos zusehen wie Bibliotheken doppelt in gleicher Version von unterschiedlichen Quellen geladen werden
  3. Mitunter werden die Bibliotheken in unterschiedlichen Versionen geladen.



Es gibt im Joomla-Framework immerhin die Möglichkeit Scripte so einzubinden, dass diese über das Framework in den Header geladen werden. Kann z.B. so aussehen: $this->addScript('//ajax.e10f949fcaacdb195442bfb5062d59de-gdprlock/ajax/libs/jquery/1.6.4/jquery.min.js'); .Aber auf die Reihenfolge selbst hat man dort schon wieder kein Einfluss.

 

Einfluss nehmen auf das Laden der Script-Bibliotheken im Template-Script

Eine Einfache Möglichkeit auf die Reihenfolge Einfluss zu nehmen, ist Scripte oder Script-Bibliotheken im Template mit addScript() einfach noch einmal in das Header-Scripte-Array zu laden. Das funktioniert ja wie ein Stack. Was zuletzt drauf gelegt wurde, wird zu letzt in den Header ausgegeben. Wird z.B. für ein jQuery-Script vorausgesetzt, dass die jQuery-Bibliothek vorher geladen wurde, kann man dieses Script im Template einfach noch mal drauf schieben. Damit kommt es in der Reihenfolge nach hinten und wird so auch ausgegeben.

Eine weitere Möglichkeit besteht darin vor oder nach der Ausgabe der Header-Scripte im Template-Scripte die gewünschten Scripte hart in den Header zu schreiben z.B. so:

 

<head>
<script src="//ajax.e10f949fcaacdb195442bfb5062d59de-gdprlock/ajax/libs/jquery/1.6.4/jquery.min.js" type="text/javascript"></script>
<script src="//ajax.e10f949fcaacdb195442bfb5062d59de-gdprlock/ajax/libs/jqueryui/1.8.16/jquery-ui.min.js" type="text/javascript"></script>
<jdoc:include type="head" />
<script src="/script/jquery.bxSlider.min.js" type="text/javascript"></script>
</head>


 

 

Verbleibende Scripte müssen hart geändert werden

Alle anderen Konflikte diesbezüglich müssen i.d.R. durch hart Eingriffe in den Erweiterungsscripten erfolgen. Das ist um so schlimmer, weil diese harten Eingriffen meistens Core-Scripte der jeweiligen Erweiterungen betreffen.



 

Beispiel Phoca-Gallery-Slideshow

In diesem Plugin wird in der Version 3.1.3, auf die ich mich hier mal konkret beziehen möchte, im Script plugins/content/phocagalleryslideshow/phocagalleryslideshow.php in ca. Zeile 216 folgende JS-Sequenz eingebunden

	if ($view == 'article' || $view == 'featured' || ($view == 'category' && $layout == 'blog')) {
		/* $document->addScript(JURI::base(true).'/components/com_phocagallery/assets/jquery/jquery-1.6.4.min.js'); */
		$document->addScript(JURI::base(true).'/components/com_phocagallery/assets/fadeslideshow/fadeslideshow.js');
		$document->addScriptDeclaration($script);
	}

Will man also verhindern, dass die jquery-Bibliothek durch das Plugin ggf. noch einmal geladen wird, dann sollte man an dieser Stelle diese Zeile wie oben zu sehen auskommentieren und nur die fadeslideshow.js laden.

Aber beachten, mit jedem Update dieses Plugins ist davon auszugehen, dass dieses Scriptmodifikation wieder verloren geht.

Üblicherweise ist nach dem gleichen Prinzip zu verfahren, beim Laden der MooTools, oder beim Laden von Style-Sheet-Dateien.

 

Wenn Ihnen dieser Beitrag geholfen und viel Zeit gespart hat, zeigen Sie sich erkenntlich: Über eine Klick auf Google+1 oder Rückmeldungen freue ich mich, zeigt es mir doch, dass sich die Mühe für die Beitragerstellung gelohnt hat. Schenken Sie auch den Produktwerbungen Ihre Beachtung.