Jhtml :: kolejność skryptów - jak przełożyć do momentu załadowania jQuery?

11

Używam JHtml::scriptdo dodawania skryptów do moich stron w niestandardowym module. Jednak te skrypty są wstrzykiwane do głowy, zanim J3 doda w jQuery - na przykład:

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

Jak zmusić Joomla do ładowania jQuery przed innymi skryptami?

kodowania
źródło

Odpowiedzi:

15

Powinieneś zadzwonić

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

przed drugim skryptem JHtml ::. AFAIK zapewnia to, że jQuery jest ładowany jako pierwszy.

fruppel
źródło
To było jedyne rozwiązanie, które działało dla mnie - umieszczone w mod_tiles.phptym wymuszonym pierwszym ładowaniu jQuery. Dziękuję Ci!
codinghands
1
@codinghands docs.joomla.org/…
Ville Niemi
2

jeśli poprawnie odczytam twoje pytanie, rozwijasz swój własny moduł.

Spróbuj tego w default.php - widok modułu (w „tmpl”):

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

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

Albo to :

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

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

W obu przypadkach pliki JS powinny zostać wstrzyknięte po jQuery, pod warunkiem, że utworzono folder „zasób” oraz folder „css” i „js”.

Drugie rozwiązanie jest bardziej zgodne z API Joomla 3.XX.

Mam nadzieję, że to pomoże.

Ghazal
źródło
Jedyną zmianą, którą tutaj wprowadziłem, było dodanie assetsfolderu - nie inaczej, a skrypty nadal ładują się, zanim zrobi to jQuery. Zastanawiam się również nad mądrością umieszczania tego rodzaju kodu w pliku szablonu (szczególnie jeśli istnieje wiele szablonów korzystających z tych samych skryptów, DRY itp.)
codinghands
Hem, twój komentarz jest dziwny -> „umieszczenie tego rodzaju kodu w pliku szablonu”. Mówiłem o module opracowanym przez ciebie i opartym na isotope.js i innych skryptach JS. Bardzo mi przykro, jeśli się pomyliłem, a tak naprawdę używasz modułu innej firmy o nazwie mod_tiles. BTW, istnieją inne sposoby wstawiania skryptów JS w szablonie.
ghazal
Przepraszam, nie chciałem zabrzmieć tak ostro haha! Musiałem być zbyt wcześnie ... Masz rację, właśnie to robię - to mój moduł. Co mam na myśli przez szablonie był default.phpw tmpl(szablonu) folderu modułu. Myślałem, że skrypty powinny być ładowane w mod_tiles.php(„kontroler”) zamiast default.php(widok).
codinghands
Umieszczenie go w tmpl / default.php pozwala na przesłonięcia. W mod_tiles.php nie można go zastąpić.
sovainfo
2

Wpadłem na ten problem w zeszłym tygodniu i był on związany z tym, gdzie wywoływałem JHtml :: script. Czy robisz to w swoim widoku lub szablonie widoku? Jeśli spróbujesz dodać skrypty do samego widoku (views / yourview / view.html.php), zostaną one wstawione przed własnymi skryptami Joomla !, ale jeśli dodasz skrypty do szablonu (views / yourview / tmpl / default.php) zostaną wstawione po skryptach Joomla!

Powodzenia!

Zachary Draper
źródło
Ten moduł zawiera tylko mod_tiles.php, plik helper.php i pojedynczy szablon (default.php) tmpl. Próbowałem dodać skrypty zarówno w mod_tiles.php, jak i default.php - oba ładują się przed jQuery.
codinghands
0

Wynika to prawdopodobnie z metody, którą programista mod_tileszastosował do zaimportowania skryptów. Zakładam, że w tej sytuacji nie trzymali się standardów kodowania Joomla.

Masz 2 opcje (o których mogę myśleć):

  1. Jeśli skrypty są importowane z pliku w folderze tmpl w module, możesz wykonać zastąpienie szablonu i zmienić sposób importowania skryptu, używając JHtml.
  2. Możesz pobrać i zainstalować jQuery Easy, która jest wtyczką, która importuje jQuery i umieszcza ją ponad wszystkimi innymi skryptami.

Mam nadzieję że to pomoże

Lodder
źródło
Opracowałem moduł - jakiej metody powinienem użyć? Zadałem to pytanie ( joomla.stackexchange.com/questions/325/... ) i powiedziano mi, że JHtml :: skrypt jest drogą naprzód.
codinghands
0

Chciałem dodać moje dwa bity po fakcie. Mam kilka skryptów i arkuszy stylów, które należy załadować dla każdego widoku, który mamy w komponencie, i chciałem, żeby to miało miejsce, zapewniając, że zostaną załadowane we właściwej kolejności.

W pliku 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();
PKB
źródło
-1

Wiem, że to stary temat, ale czy kiedykolwiek doszedłeś do sedna? Właśnie spotkałem ten sam problem. Zidentyfikowałem przyczynę, ale nie problem / rozwiązanie; Mam podstępne podejrzenie, że to BŁĄD, ale mógłbym to zrobić z kimś innym, kto to wypróbuje.

Scenariusz: Utworzyłeś moduł zawierający skrypt zależny od jQuery, więc w widoku default.php używasz następujących elementów:

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

Następnie zainstaluj moduł i nadaj mu pozycję modułu, powiedzmy „w lewo”. Gdy spojrzysz na kod źródłowy interfejsu, wszystko wygląda dobrze, wszystkie skrypty ładują się po skryptach, które są w nim zawarte

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

JEDNAK jeśli nadasz modułowi „akordeon” i użyjesz funkcji loadposition joomla, aby dodać moduł do artykułu

{loadposition accordion}

następnie akordeon.js zostanie dodany PRZED plikami bootstrap.framework.

Jedynym sposobem, w jaki udało mi się go zatrzymać, jest dodanie skryptu jako skryptu wbudowanego, a nie włączenie go do głowy.

EDYCJA: to samo dotyczy css; jest dodawany na początku listy deklaracji css (przed szablonem i plikami css bootstrap). Zaletą tego jest dodanie! Ważne do deklaracji css.

Philip
źródło