Desenvolvi recentemente um módulo que exigia a injeção de certos arquivos JS e CSS no <head>
de cada página. Inicialmente, usei:
$doc =& JFactory::getDocument();
$doc->addScript(JURI::base(true).'/modules/mod_x/js/mod_x.js');
No entanto, notei que, quando o cache estava ativado, o site carregava uma versão em cache de /cache
e versão não armazenada em cache de /modules/mod_x/js/
, causando erros de JS.
Quando mudei isso para:
JHtml::script(Juri::base().'modules/mod_x/js/mod_x.js');
O script foi carregado apenas uma vez, do cache, resolvendo esses erros.
I leia os documentos que o método addScript
era mais 'baixo nível' do que o JHtml:script
método, mas além de dizer que ...
Obviamente, você também precisará codificar manualmente algumas das etapas [que o JHtml: script faz por você] que seriam executadas automaticamente usando o [método JHtml: script] acima [se você usar o addScript].
... nenhum detalhe adicional é fornecido.
Então qual a diferença? Eu assumo JHtml:script
eventualmente chama addScript
em um objeto de documento em algum momento, mas outras etapas intermediárias são executadas primeiro?
JHtml::script
Possui lógica adicional incluída. Consulte http://api.joomla.org/cms-3/classes/JHtml.html#method_script para obter a referência da API
Por padrão, ele detectará a configuração de depuração e o navegador usado e carregará o script correspondente. Por exemplo, quando a depuração estiver ativada, será carregada uma versão não compactada do arquivo, se presente.
Existem configurações opcionais que permitem substituir o arquivo no nível do modelo e outras coisas.
Michael Babker escreveu um bom guia sobre como usar JHtml::script()
para permitir substituições: http://www.babdev.com/blog/139-use-the-media-folder-allow-overridable- mídia
Função no repositório para referência: https://github.com/joomla/joomla-cms/blob/staging/libraries/cms/html/html.php#L659
Página oficial do documento, que agora é atualizada por George: http://docs.joomla.org/J3.3:Adding_JavaScript_and_CSS_to_the_page
em duas palavras:
JHtml::script()
- permite substituir o script específico (exceto o que já está anexado ao JDocument), depende de alguns fatores (consulte a resposta do @Bakual);$doc->addScript()
- anexa script diretamente ao documento, sem verificar uma substituição;Se você é o desenvolvedor da extensão, é altamente recomendável usar JHtml::script()
ao adicionar o script. Isso permitirá que seus usuários substituam alguns scripts específicos, dependendo do que eles desejam.
Também existe um método semelhante para css.