Quelle est la différence entre JHtml: script () et $ doc-> addScript?

10

J'ai récemment développé un module qui exigeait que certains fichiers JS et CSS soient injectés dans la <head>page de chaque page. Au départ, j'ai utilisé:

$doc =& JFactory::getDocument();
$doc->addScript(JURI::base(true).'/modules/mod_x/js/mod_x.js');

Cependant, j'ai remarqué que lorsque la mise en cache était activée, le site chargeait à la fois une version mise en cache et une version /cachenon mise en cache /modules/mod_x/js/, provoquant des erreurs JS.

Quand j'ai changé cela en:

JHtml::script(Juri::base().'modules/mod_x/js/mod_x.js');

Le script n'a été chargé qu'une seule fois, à partir du cache, résolvant ces erreurs.

J'ai lu dans la documentation que la addScriptméthode était plus «bas niveau» que la JHtml:scriptméthode, mais au-delà de dire que ...

Bien sûr, vous devrez également coder manuellement certaines des étapes [que JHtml: script fait pour vous] qui seraient effectuées automatiquement en utilisant la [méthode JHtml: script] ci-dessus [si vous utilisez addScript].

... aucun autre détail n'est donné.

Alors quelle est la différence? Je suppose que JHtml:scriptfinalement, addScriptà un moment donné, un objet document est appelé , mais d'autres étapes intermédiaires sont-elles prises en premier?

codinghands
la source
4
J'ai un peu réécrit la documentation de Joomla pour essayer de la mettre à jour - voyez si cela a plus de sens maintenant?
George Wilson
1
@GeorgeWilson Les documents Joomla se sont vraiment améliorés récemment. Merci :)
TryHarder
Question connexe sur les feuilles de style: joomla.stackexchange.com/q/10062/5239
Flimm

Réponses:

8

JHtml::scriptcomprend une logique supplémentaire. Voir http://api.joomla.org/cms-3/classes/JHtml.html#method_script pour la référence API

Par défaut, il détectera le paramètre de débogage et le navigateur utilisé et chargera le script correspondant. Par exemple, lorsque le débogage est activé, il chargera une version non compressée du fichier s'il est présent.

Il existe des paramètres facultatifs qui permettent de remplacer le fichier au niveau du modèle et d'autres choses.

Michael Babker a écrit un bon guide sur la façon d'utiliser JHtml::script()pour autoriser les remplacements: http://www.babdev.com/blog/139-use-the-media-folder-allow-overridable-media

Fonction dans le référentiel pour référence: https://github.com/joomla/joomla-cms/blob/staging/libraries/cms/html/html.php#L659

Page de documentation officielle qui est maintenant mise à jour par George: http://docs.joomla.org/J3.3:Adding_JavaScript_and_CSS_to_the_page

Bakual
la source
2
Merci d'avoir répondu. La référence de l'API est assez concise - y a-t-il une explication plus complète des effets de detect_browser et detect_debug, et quand vous dites «paramètres facultatifs» et «autres choses» sont-ils documentés quelque part?
codinghands
J'ai ajouté un lien vers un article de Michael qui explique la partie prioritaire. Quant à la partie débogage et navigateur, je ne pense pas qu'il y ait de documentation. Il faudrait lire le code pour ça.
Bakual
1
Donc, s'il y a un fichier js non compressé et compressé par exemple et que le débogage est activé, il chargera filename-uncompressed.js et juste filename.js lorsque le débogage est désactivé. Pour le navigateur lors du débogage, il recherche filename-browser.js puis filename-browser-browsererversion.js etc.
George Wilson
2
C'est une réponse éclatante - merci @Bakual et @GeorgeWilson!
codinghands
1
N'oubliez pas que JHtml peut également ajouter la somme MD5 d'un script ou d'une feuille de style au cache-bust.
Flimm
4

en deux mots:

  • JHtml::script() - vous permet de remplacer le script spécifique (sauf celui déjà attaché à JDocument), dépend de certains facteurs (voir la réponse @Bakual);
  • $doc->addScript() - attachez le script directement au document, sans vérifier les remplacements;

Si vous êtes le développeur de l'extension, alors une utilisation fortement recommandée JHtml::script()lorsque vous ajoutez le script. Cela permettra à vos utilisateurs de remplacer certains scripts spécifiques, en fonction de ce qu'ils veulent.
Il existe également une méthode similaire pour CSS.

Fedik
la source