Порядок Jhtml :: script - как отложить до загрузки JQuery?

11

Я использую, JHtml::scriptчтобы добавить сценарии на мои страницы в специально разработанном модуле. Однако эти сценарии вводятся в голову до того, как J3 добавляет в jQuery - например:

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

Как я могу заставить Joomla загружать jQuery перед любыми другими скриптами?

codinghands
источник

Ответы:

15

Вам следует позвонить

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

перед вашим другим JHtml :: script. AFAIK это гарантирует, что jQuery загружается первым.

fruppel
источник
Это было единственное решение, которое сработало для меня - помещенное в mod_tiles.phpэту принудительную загрузку jQuery первым. Спасибо!
codinghands
1
@codinghands docs.joomla.org/…
Вилле Ниеми,
2

если я правильно прочитал ваш вопрос, вы разрабатываете свой собственный модуль.

Попробуйте это, в default.php - представление модуля (в «tmpl»):

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

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

Или это :

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

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

В обоих случаях ваши файлы JS должны быть внедрены после jQuery, при условии, что вы создали папку «asset», а также папку «css» и «js» внутри.

Второе решение более соответствует API Joomla 3.XX.

Надеюсь, поможет.

газель
источник
Единственное изменение, которое я сделал здесь, это добавление assetsпапки - это не изменилось , и скрипты по-прежнему загружаются раньше, чем jQuery. Я также задаюсь вопросом о мудрости сдачи такого рода кода в файле шаблона (особенно , если есть несколько шаблонов , используя одни и те же сценарии, DRY и т.д. и т.п.)
codinghands
Хем, ваш комментарий странный -> «помещать этот вид кода в файл шаблона». Я был, и, возможно, это было недостаточно ясно, говоря о модуле, разработанном вами и основанном на isotope.js и других скриптах JS. Мне очень жаль, если я ошибся, и вы на самом деле используете сторонний модуль с именем mod_tiles. Кстати, есть другие способы вставить JS-скрипты в шаблон.
Газель
Извините, я не хотел звучать так резко, ха-ха! Должно быть, слишком рано ... Вы совершенно правы, это то, что я делаю - это мой модуль. То, что я имел в виду под файлом шаблона, находилось default.phpв tmplпапке (template) модуля. Я бы подумал, что скрипты должны быть загружены в mod_tiles.php(«контроллер»), а не в default.php(представление).
codinghands
Помещение в tmpl / default.php позволяет переопределять. В mod_tiles.php его нельзя переопределить.
Соваинфо
2

Я столкнулся с этой проблемой на прошлой неделе, и это было связано с тем, где я звонил JHtml :: script. Вы делаете это в своем представлении или шаблоне представления? Если вы попытаетесь добавить сценарии в само представление (views / yourview / view.html.php), они будут вставлены перед собственными сценариями Joomla !, но если вы добавите сценарии в шаблон (views / yourview / tmpl /) default.php) они будут вставлены после скриптов Joomla !.

Удачи!

Захари Дрейпер
источник
Это модуль только с mod_tiles.php, файлом helper.php и одним шаблоном (default.php) в tmpl. Я попытался добавить сценарии как в mod_tiles.php, так и в default.php - оба загружаются до jQuery.
codinghands
0

Вероятно, это связано с методом, который разработчик mod_tilesиспользовал для импорта сценариев. Я предполагаю, что они не придерживались стандартов кодирования Joomla в этой ситуации.

У вас есть 2 варианта (которые я могу придумать) hwre:

  1. Если сценарии импортируются из файла в папке tmpl внутри модуля, вы можете выполнить переопределение шаблона и изменить способ импорта сценария, используя JHtml.
  2. Вы можете скачать и установить jQuery Easy - плагин, который импортирует jQuery и размещает его над всеми остальными скриптами.

Надеюсь это поможет

Лоддер
источник
Я разработал модуль - какой метод я должен использовать? Я задал это в вопросе ( joomla.stackexchange.com/questions/325/… ), и мне сказали, что JHtml :: script - это путь вперед.
codinghands
0

Я хотел добавить свои два бита после факта. У меня есть пара скриптов и таблиц стилей, которые нужно загружать для каждого представления, которое есть в компоненте, и я хотел, чтобы это происходило с одной точкой, гарантируя, что они загружены в правильной последовательности.

В файле 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();
ВВП
источник
-1

Я знаю, что это старая тема, но вы когда-нибудь доходили до сути? Я только что испытал ту же проблему. Я идентифицировал ПРИЧИНУ, но не проблему / решение; У меня есть подлое подозрение, что это БАГ, но он может сделать это с кем-то еще, попробовавшим это.

Сценарий: вы создали модуль, который включает в себя сценарий, зависящий от jQuery, поэтому вы используете в представлении default.php следующее:

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

Затем вы устанавливаете модуль и назначаете ему положение модуля, скажем, «влево». Когда вы смотрите на исходный код интерфейса, все выглядит хорошо, все сценарии загружаются после сценариев, включенных в

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

ОДНАКО, если вы дадите модулю положение «гармошка» и используете функцию loadposition для joomla, чтобы добавить модуль в статью

{loadposition accordion}

тогда аккордеон.js добавляется ПЕРЕД файлами bootstrap.framework.

Единственный способ заставить его работать - добавить скрипт как встроенный скрипт, а не включать его в заголовок.

РЕДАКТИРОВАТЬ: то же самое касается включения CSS; он добавляется в верхнюю часть списка декларации css (до файла css шаблона и начальной загрузки). Основание для этого - добавить! Важно к декларациям CSS.

Филипп
источник