Jhtml :: script order - comment reporter jusqu'à ce que jQuery ait été chargé?

11

J'utilise JHtml::scriptpour ajouter des scripts à mes pages dans un module développé sur mesure. Cependant, ces scripts sont injectés dans la tête avant que J3 ajoute dans jQuery - par exemple:

<!-- 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>

Comment puis-je forcer Joomla à charger jQuery avant tout autre script?

codinghands
la source

Réponses:

15

Vous devez appeler

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

avant votre autre script JHtml ::. AFAIK, cela garantit que jQuery est chargé en premier.

fruppel
la source
C'était la seule solution qui fonctionnait pour moi - placée dans mod_tiles.phpcette jQuery forcée à charger en premier. Je vous remercie!
codinghands
1
@codinghands docs.joomla.org/…
Ville Niemi
2

si j'ai bien lu votre question, vous développez votre propre module.

Essayez ceci, dans default.php - la vue du module (dans "tmpl"):

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

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

Ou ca :

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

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

Dans les deux cas, vos fichiers JS doivent être injectés après jQuery, à condition que vous ayez créé un dossier "asset" et un dossier "css" et "js" à l'intérieur.

La deuxième solution est plus conforme à l'API joomla 3.XX.

J'espère que cela aide.

ghazal
la source
La seule modification que j'ai apportée ici a été d'ajouter le assetsdossier - cela n'a pas changé, et les scripts se chargent toujours avant jQuery. Je me demande également s'il est
judicieux de
Hem, ton commentaire est bizarre -> "mettre ce genre de code dans un fichier modèle". J'étais, et ce n'était peut-être pas assez clair, en train de parler d'un module développé par vous et basé sur isotope.js et d'autres scripts JS. Je suis vraiment désolé si je me suis trompé et que vous utilisez en fait un module tiers appelé mod_tiles. BTW, il existe d'autres façons d'insérer des scripts JS dans un modèle.
ghazal
Désolé, je ne voulais pas sonner si dur haha! Ça devait être levé trop tôt ... Tu as tout à fait raison, c'est ce que je fais - c'est mon module. Ce que je voulais dire par fichier de modèle se trouvait default.phpdans le tmpldossier (modèle) du module. J'aurais pensé que les scripts devraient être chargés dans mod_tiles.php(le 'contrôleur') plutôt que default.php(la vue).
codinghands
Le placer dans un tmpl / default.php permet des remplacements. Dans mod_tiles.php, il ne peut pas être remplacé.
sovainfo
2

J'ai rencontré ce problème la semaine dernière et il était lié à l'endroit où j'appelais JHtml :: script. Faites-vous cela dans votre vue ou dans le modèle de la vue? Si vous essayez d'ajouter les scripts dans la vue elle-même (views / yourview / view.html.php), ils seront insérés avant les propres scripts de Joomla!, Mais si vous ajoutez les scripts dans le modèle (views / yourview / tmpl / default.php) ils seront insérés après les scripts de Joomla !.

Bonne chance!

Draper Zachary
la source
Il s'agit d'un module contenant uniquement mod_tiles.php, un fichier helper.php et un seul modèle (default.php) dans tmpl. J'ai essayé d'ajouter les scripts dans mod_tiles.php et default.php - les deux se chargent avant jQuery.
codinghands
0

Cela est probablement dû à la méthode utilisée par le développeur de mod_tilespour importer les scripts. Je suppose qu'ils n'ont pas respecté les normes de codage Joomla dans cette situation.

Vous avez 2 options (auxquelles je peux penser) hwre:

  1. Si les scripts sont importés à partir d'un fichier dans le dossier tmpl du module, vous pouvez effectuer une substitution de modèle et modifier la façon dont le script est importé à l'aide de JHtml.
  2. Vous pouvez télécharger et installer jQuery Easy qui est un plugin qui importe jQuery et le place au-dessus de tous les autres scripts.

J'espère que cela t'aides

Lodder
la source
J'ai développé le module - quelle méthode dois-je utiliser? J'ai posé cette question dans une question ( joomla.stackexchange.com/questions/325/… ) et on m'a dit que JHtml :: script était la voie à suivre.
codinghands
0

Je voulais ajouter mes deux bits après coup. J'ai quelques scripts et feuilles de style qui doivent être chargés pour chaque vue que nous avons dans le composant, et je voulais un point unique pour que cela se produise en veillant également à ce qu'ils soient chargés dans la séquence correcte.

Dans le dossier 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();
PIB
la source
-1

Je sais que c'est un vieux sujet, mais êtes-vous déjà allé au fond des choses? Je viens de rencontrer le même problème. J'ai identifié la CAUSE mais pas le problème / la solution; J'ai une suspicion sournoise que c'est un BUG mais pourrait faire avec quelqu'un d'autre l'essayer.

Scénario: vous avez créé un module qui inclut un script dépendant de jQuery, vous utilisez donc les éléments suivants dans votre vue default.php:

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

Vous installez ensuite le module et lui donnez une position de module, disons «gauche». Lorsque vous regardez le code source frontal, tout semble bon, tous les scripts se chargent après les scripts inclus dans

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

CEPENDANT, si vous donnez au module une position «accordéon» et utilisez la fonction joomla loadposition pour ajouter le module à un article

{loadposition accordion}

puis accordéion.js est ajouté AVANT les fichiers bootstrap.framework.

La seule façon dont j'ai pu le faire fonctionner est d'ajouter le script en tant que script en ligne plutôt que d'être inclus dans la tête.

EDIT: il en va de même pour l'inclusion du CSS; il est ajouté en haut de la liste des déclarations css (avant les fichiers css de modèle et d'amorçage). Le bodge pour cela est d'ajouter! Important aux déclarations CSS.

Philippe
la source