В чем разница между JHtml: script () и $ doc-> addScript?

10

Недавно я разработал модуль, который требовал внедрения определенных файлов JS и CSS в <head>каждую страницу. Изначально я использовал:

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

Однако я заметил, что при включенном кэшировании сайт загружал как кешированную версию, так /cacheи не кешированную версию /modules/mod_x/js/, вызывая ошибки JS.

Когда я изменил это на:

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

Скрипт загружался только один раз, из кеша, исправляя эти ошибки.

Я прочитал в документах, что addScriptметод был более «низкоуровневым», чем JHtml:scriptметод, но не говоря о том, что ...

Конечно, вам также нужно будет вручную написать некоторые шаги [которые JHtml: script выполняет для вас], которые будут выполнены автоматически с использованием [JHtml: script method] выше [если вы используете addScript].

... дальнейших подробностей не приводится.

Так в чем же разница? Я предполагаю , что в JHtml:scriptконечном итоге вызывает addScriptна объект документа , в какой - то момент, но и другие промежуточные шаги в первую очередь?

codinghands
источник
4
Я немного переписал Joomla Docs, чтобы попытаться обновить его - посмотрите, имеет ли это смысл сейчас?
Джордж Уилсон
1
@ GeorgeWilson Документы Joomla действительно улучшились в последнее время. Спасибо :)
TryHarder
Связанный вопрос о таблицах
Flimm

Ответы:

8

JHtml::scriptимеет дополнительную логику в комплекте. См. Http://api.joomla.org/cms-3/classes/JHtml.html#method_script для справки по API.

По умолчанию он определяет параметры отладки и используемый браузер и загружает соответствующий скрипт. Например, если включена отладка, будет загружена несжатая версия файла, если она есть.

Есть дополнительные настройки, которые позволяют переопределить файл на уровне шаблона и другие вещи.

Майкл Бабкер написал хорошее руководство по использованию JHtml::script()переопределений: http://www.babdev.com/blog/139-use-the-media-folder-allow-overridable-media

Функция в репо для справки: https://github.com/joomla/joomla-cms/blob/staging/libraries/cms/html/html.php#L659

Официальная страница документа, которая теперь обновляется Джорджем: http://docs.joomla.org/J3.3:Adding_JavaScript_and_CSS_to_the_page

Bakual
источник
2
Спасибо за ответ. Справочник по API довольно лаконичен - есть ли более подробное объяснение эффектов dete_browser и detect_debug, и когда вы говорите «необязательные настройки» и «другие вещи», они где-нибудь документированы?
codinghands
Я добавил ссылку на статью Майкла, которая объясняет переопределение части. Что касается отладки и части браузера, я не думаю, что есть документация. Вы должны прочитать код для этого.
Bakual
1
Так, если есть несжатый и сжатый js-файл, например, и включена отладка, тогда он будет загружать filename-uncompressed.js и просто filename.js, когда отладка выключена. Для браузера при отладке он ищет имя-файла-браузера.js, а затем имя-файла-браузера-браузера.js и т. Д.
Джордж Уилсон,
2
Это потрясающий ответ - спасибо @Bakual и @GeorgeWilson!
codinghands
1
Не забывайте, что этот JHtml также может добавлять сумму MD5 скрипта или таблицы стилей в кеш-бюст.
Флим
4

в двух словах:

  • JHtml::script() - позволяют переопределить конкретный скрипт (кроме того, который уже присоединен к JDocument), зависит от некоторых факторов (см. ответ @Bakual);
  • $doc->addScript() - прикрепить скрипт непосредственно к документу, не проверяя переопределения;

Если вы разработчик расширения, то настоятельно рекомендуем использовать его JHtml::script()при добавлении скрипта. Это позволит вашим пользователям переопределить некоторые конкретные сценарии, в зависимости от того, что они хотят.
Также существует аналогичный метод для CSS.

Федик
источник