¿Cuál es la diferencia entre JHtml: script () y $ doc-> addScript?

10

Desarrollé un módulo recientemente que requería que se inyectaran ciertos archivos JS y CSS en <head>cada página. Inicialmente, usé:

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

Sin embargo, noté que cuando se habilitaba el almacenamiento en caché, el sitio cargaba tanto una versión en caché como una versión /cachesin caché /modules/mod_x/js/, lo que causaba errores de JS.

Cuando cambié esto a:

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

El script se cargó solo una vez, desde la memoria caché, resolviendo estos errores.

Yo leo en los documentos que el addScriptmétodo era más 'bajo nivel' que el JHtml:scriptmétodo, pero más allá de decir que ...

Por supuesto, también necesitará codificar manualmente algunos de los pasos [que JHtml: script hace por usted] que se realizarían automáticamente usando el [JHtml: método de script] anterior [si usa addScript].

... no se dan más detalles.

Entonces, ¿cuál es la diferencia? Supongo que JHtml:scriptfinalmente llama addScripta un objeto de documento en algún momento, pero ¿se toman primero otros pasos intermedios?

codinghands
fuente
44
He reescrito un poco los documentos de Joomla para intentar actualizarlo. ¿Ves si tiene más sentido ahora?
George Wilson
1
@GeorgeWilson Los documentos de Joomla realmente han mejorado recientemente. Gracias :)
TryHarder
Pregunta relacionada sobre las hojas de estilo: joomla.stackexchange.com/q/10062/5239
Flimm

Respuestas:

8

JHtml::scripttiene lógica adicional incluida. Ver http://api.joomla.org/cms-3/classes/JHtml.html#method_script para la referencia de la API

De forma predeterminada, detectará la configuración de depuración y el navegador utilizado y cargará el script correspondiente. Por ejemplo, cuando la depuración está habilitada, cargará una versión sin comprimir del archivo si está presente.

Hay configuraciones opcionales que permiten anular el archivo a nivel de plantilla y otras cosas.

Michael Babker escribió una buena guía sobre cómo usar JHtml::script()para permitir anulaciones: http://www.babdev.com/blog/139-use-the-media-folder-allow-overridable-media

Función en el repositorio para referencia: https://github.com/joomla/joomla-cms/blob/staging/libraries/cms/html/html.php#L659

Página oficial del documento que ahora George actualiza: http://docs.joomla.org/J3.3:Adding_JavaScript_and_CSS_to_the_page

Bakual
fuente
2
gracias por la respuesta. La referencia de la API es bastante breve: ¿hay una explicación más completa de los efectos de detect_browser y detect_debug, y cuando dices "configuración opcional" y "otras cosas", ¿están documentadas en alguna parte?
codinghands
Agregué un enlace a un artículo de Michael que explica la parte de anulación. En cuanto a la parte de depuración y navegador, no creo que haya una documentación. Tendría que leer el código para eso.
Bakual
1
Entonces, si hay un archivo js sin comprimir y comprimido, por ejemplo, y la depuración está activada, cargará filename-uncompressed.js y solo filename.js cuando la depuración esté desactivada. Para el navegador cuando se depura, busca filename-browser.js y luego filename-browser-browserversion.js, etc.
George Wilson
2
Esta es una respuesta sorprendente: ¡gracias @Bakual y @GeorgeWilson!
codinghands
1
No olvide que JHtml también puede agregar la suma MD5 de una secuencia de comandos u hoja de estilo al busto de caché.
Flimm
4

en dos palabras:

  • JHtml::script() - le permite anular el script específico (excepto el que ya está adjunto a JDocument), depende de algunos factores (consulte la respuesta @Bakual);
  • $doc->addScript() - adjuntar script directamente al documento, sin marcar una anulación;

Si usted es el desarrollador de la extensión, se recomienda su uso JHtml::script()cuando agregue el script. Esto permitirá que sus usuarios anulen algunos scripts específicos, dependiendo de lo que quieran.
También hay un método similar para css.

Fedik
fuente