Jhtml :: script order - Wie verschiebe ich, bis jQuery geladen wurde?

11

Ich verwende JHtml::scriptdas Hinzufügen von Skripten zu meinen Seiten in einem benutzerdefinierten Modul. Diese Skripte werden jedoch in den Kopf eingefügt, bevor J3 jQuery hinzufügt - zum Beispiel:

<!-- my module js -->
<script src="/modules/mod_tiles/js/jquery.isotope.min.js" type="text/javascript"></script>
<script src="/modules/mod_tiles/js/jquery.hoverintent.min.js" type="text/javascript"></script>
<script src="/modules/mod_tiles/js/mod_tiles.js" type="text/javascript"></script>
<!-- then joomla loads jQuery --->
<script src="/media/jui/js/jquery-noconflict.js" type="text/javascript"></script>
<script src="/media/jui/js/jquery.min.js" type="text/javascript"></script>

Wie kann ich Joomla zwingen, jQuery vor anderen Skripten zu laden?

Codierungshände
quelle

Antworten:

15

Sie sollten anrufen

JHtml::_('jquery.framework');

vor Ihrem anderen JHtml :: -Skript. AFAIK stellt sicher, dass jQuery zuerst geladen wird.

Fruppel
quelle
Dies war die einzige Lösung, die für mich funktioniert hat - platziert in mod_tiles.phpdieser gezwungenen jQuery, zuerst zu laden. Vielen Dank!
Codinghands
1
@ Codinghands docs.joomla.org/…
Ville Niemi
2

Wenn ich Ihre Frage richtig gelesen habe, entwickeln Sie Ihr eigenes Modul.

Versuchen Sie dies in default.php - der Ansicht des Moduls (in "tmpl"):

JHtml::stylesheet('modules/'.$module->module.'/assets/css/yourfile.css');

JHtml::script('modules/'.$module->module.'/assets/js/yourscript.js');

Oder dieses :

JHtml::_('stylesheet', 'modules/'.$module->module.'/assets/css/anotherfile.css');

JHtml::_('script', 'modules/'.$module->module.'/assets/js/othercript.js');

In beiden Fällen sollten Ihre JS-Datei (en) nach jQuery eingefügt werden, vorausgesetzt, Sie haben einen "Asset" -Ordner sowie einen "CSS" - und einen "js" -Ordner darin erstellt.

Die zweite Lösung entspricht eher der joomla 3.XX API.

Ich hoffe es hilft.

Ghazal
quelle
Die einzige Änderung, die ich hier vorgenommen habe, war das Hinzufügen des assetsOrdners - dies machte keinen Unterschied, und die Skripte werden immer noch geladen, bevor jQuery dies tut. Ich wundere mich auch über die Weisheit, diese Art von Code in eine Vorlagendatei einzufügen (insbesondere wenn es mehrere Vorlagen gibt, die dieselben Skripte, DRY usw. usw. verwenden)
Codierungshände
Hem, dein Kommentar ist komisch -> "diese Art von Code in eine Vorlagendatei einfügen". Ich habe, und vielleicht war es nicht klar genug, über ein von Ihnen entwickeltes Modul gesprochen, das auf isotope.js und anderen JS-Skripten basiert. Es tut mir sehr leid, wenn ich mich geirrt habe und Sie tatsächlich ein Drittanbieter-Modul namens mod_tiles verwenden. Übrigens gibt es andere Möglichkeiten, JS-Skripte in eine Vorlage einzufügen.
Ghazal
Entschuldigung, ich wollte nicht so hart klingen, haha! Muss zu früh aufgestanden sein ... Sie haben genau Recht, das ist was ich tue - es ist mein Modul. Was ich mit Vorlagendatei gemeint habe, war default.phpim tmpl(Vorlagen-) Ordner des Moduls. Ich würde mir vorstellen, dass Skripte eher in mod_tiles.php(den 'Controller') als in default.phpdie Ansicht geladen werden sollten .
Codinghands
Das Platzieren in einer tmpl / default.php ermöglicht Überschreibungen. In mod_tiles.php kann es nicht überschrieben werden.
Sovainfo
2

Ich bin letzte Woche auf dieses Problem gestoßen und es hing damit zusammen, wo ich JHtml :: script aufrief. Tun Sie dies in Ihrer Ansicht oder in der Vorlage der Ansicht? Wenn Sie versuchen, die Skripte in der Ansicht selbst hinzuzufügen (views / yourview / view.html.php), werden sie vor Joomla! 'S eigenen Skripten eingefügt. Wenn Sie jedoch die Skripte in die Vorlage einfügen (views / yourview / tmpl / default.php) Sie werden nach den Skripten von Joomla! eingefügt.

Viel Glück!

Zachary Draper
quelle
Dies ist ein Modul mit nur mod_tiles.php, einer helper.php-Datei und einer einzelnen Vorlage (default.php) in tmpl. Ich habe versucht, die Skripte sowohl in mod_tiles.php als auch in default.php hinzuzufügen - beide werden vor jQuery geladen.
Codinghands
0

Dies liegt wahrscheinlich an der Methode, mit der der Entwickler mod_tilesdie Skripte importiert hat. Ich gehe davon aus, dass sie sich in dieser Situation nicht an die Joomla-Codierungsstandards gehalten haben.

Sie haben zwei Möglichkeiten (die mir einfallen):

  1. Wenn die Skripte aus einer Datei im Ordner tmpl innerhalb des Moduls importiert werden, können Sie eine Vorlagenüberschreibung durchführen und die Art und Weise ändern, in der das Skript importiert wird JHtml.
  2. Sie können jQuery Easy herunterladen und installieren, ein Plugin, das jQuery importiert und über alle anderen Skripte stellt.

Hoffe das hilft

Lodder
quelle
Ich habe das Modul entwickelt - welche Methode soll ich verwenden? Ich habe dies in einer Frage gestellt ( joomla.stackexchange.com/questions/325/… ) und mir wurde gesagt, JHtml :: script sei der Weg nach vorne.
Codinghands
0

Ich wollte meine zwei Bits nachträglich hinzufügen. Ich habe ein paar Skripte und Stylesheets, die für jede Ansicht in der Komponente geladen werden müssen, und wollte, dass ein einzelner Punkt auftritt, um sicherzustellen, dass sie in der richtigen Reihenfolge geladen werden.

In der Datei components\myComponent\mycomponent.php:

defined('_JEXEC') or die;

// Include dependancies
jimport('joomla.application.component.controller');

JHtml::stylesheet('http://maxcdn.bootstrapcdn.com/font-awesome/4.2.0/css/font-awesome.min.css', array(), true);
JHtml::stylesheet('components/com_mycomponent/assets/css/mycomponent.css');

JHtml::_('jquery.framework');   // Make sure jQuery is loaded before component JS
JHtml::script( 'components/mycomponent/assets/js/jquery.cookie.js');

// Execute the task.
$controller = JControllerLegacy::getInstance('Mycomponent');
$controller->execute(JFactory::getApplication()->input->get('task'));
$controller->redirect();
BIP
quelle
-1

Ich weiß, dass dies ein altes Thema ist, aber sind Sie dem jemals auf den Grund gegangen? Ich habe gerade das gleiche Problem erlebt. Ich habe die URSACHE identifiziert, aber nicht das Problem / die Lösung. Ich habe eine hinterhältige Vermutung, dass es sich um einen BUG handelt, aber ich könnte es mit jemand anderem tun, der es ausprobiert.

Szenario: Sie haben ein Modul erstellt, das ein jQuery-abhängiges Skript enthält, sodass Sie in Ihrer default.php-Ansicht Folgendes verwenden:

$doc = JFactory::getDocument();
$doc->addScript("media/mod_accordion/js/accordion.js");

Sie installieren dann das Modul und geben ihm eine Modulposition, sagen wir 'links'. Wenn Sie sich den Front-End-Quellcode ansehen, sieht alles gut aus. Alle Skripte werden nach den Skripten geladen, die in enthalten sind

JHtml::_('bootstrap.framework');

JEDOCH, wenn Sie dem Modul eine Position 'Akkordeon' geben und die Joomla-Ladeposition verwenden, um das Modul einem Artikel hinzuzufügen

{loadposition accordion}

dann wird accionion.js VOR den bootstrap.framework-Dateien hinzugefügt.

Die einzige Möglichkeit, die Arbeit zu umgehen, besteht darin, das Skript als Inline-Skript hinzuzufügen, anstatt es in den Kopf aufzunehmen.

EDIT: Gleiches gilt für das Einschließen des CSS; Es wird am Anfang der Liste der CSS-Deklaration hinzugefügt (vor den Vorlagen- und Bootstrap-CSS-Dateien). Der Grund dafür ist, die CSS-Erklärungen zu ergänzen!

philip
quelle