Jaka jest różnica między JHtml: script () a $ doc-> addScript?

10

Niedawno opracowałem moduł, który wymagał wstrzykiwania niektórych plików JS i CSS do <head>każdej strony. Początkowo użyłem:

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

Zauważyłem jednak, że po włączeniu buforowania witryna załadowała zarówno wersję buforowaną, jak /cachei wersję niebuforowaną /modules/mod_x/js/, powodując błędy JS.

Kiedy zmieniłem to na:

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

Skrypt został załadowany tylko raz, z pamięci podręcznej, usuwając te błędy.

I czytać w docs że addScriptmetoda była bardziej „niski poziom” niż JHtml:scriptmetoda, ale poza mówiąc, że ...

Oczywiście będziesz musiał ręcznie zakodować niektóre kroki [które robi dla ciebie skrypt JHtml:], które zostałyby wykonane automatycznie przy użyciu powyższej [JHtml: metoda skryptowa] [jeśli używasz addScript].

... nie podano dalszych szczegółów.

Jaka jest różnica? Zakładam, że JHtml:scriptostatecznie wywołuje addScriptobiekt dokumentu w pewnym momencie, ale czy najpierw są podejmowane inne kroki pośrednie?

kodowania
źródło
4
Napisałem trochę dokumentów Joomla, aby spróbować je zaktualizować - czy ma to teraz sens?
George Wilson,
1
@GeorgeWilson Dokumenty Joomla bardzo się ostatnio poprawiły. Dzięki :)
TryHarder
Podobne pytanie dotyczące arkuszy stylów: joomla.stackexchange.com/q/10062/5239
Flimm

Odpowiedzi:

8

JHtml::scriptzawiera dodatkową logikę. Zobacz http://api.joomla.org/cms-3/classes/JHtml.html#method_script w celu uzyskania informacji o interfejsie API

Domyślnie wykrywa ustawienia debugowania i używanej przeglądarki oraz ładuje pasujący skrypt. Na przykład, kiedy debugowanie jest włączone, załaduje nieskompresowaną wersję pliku, jeśli jest obecny.

Istnieją opcjonalne ustawienia, które pozwalają przesłonić plik na poziomie szablonu i inne rzeczy.

Michael Babker napisał dobry przewodnik, w jaki sposób używać, JHtml::script()aby umożliwić zastąpienia: http://www.babdev.com/blog/139-use-the-media-folder-allow-overridable-media

Funkcja w repozytorium w celach informacyjnych: https://github.com/joomla/joomla-cms/blob/staging/libraries/cms/html/html.php#L659

Oficjalna strona z dokumentami, która jest teraz aktualizowana przez George'a: http://docs.joomla.org/J3.3:Adding_JavaScript_and_CSS_to_the_page

Bakual
źródło
2
Dziękuję za odpowiedź. Odwołanie do interfejsu API jest dość zwięzłe - czy istnieje bardziej wyczerpujące wyjaśnienie skutków wykrycia_browsera i wykrycia_debug, a kiedy powiesz, że „ustawienia opcjonalne” i „inne rzeczy” są gdziekolwiek udokumentowane?
codinghands
Dodałem link do artykułu Michaela, który wyjaśnia część zastępowania. Jeśli chodzi o część debugowania i przeglądarki, nie sądzę, aby istniała dokumentacja. Musisz przeczytać kod do tego.
Bakual,
1
Więc jeśli na przykład istnieje nieskompresowany i skompresowany plik js, a debugowanie jest włączone, wówczas załaduje plik -dekompresowany.js i po prostu filename.js, gdy debugowanie jest wyłączone. Dla przeglądarki podczas debugowania off wygląda dla pliku-browser.js następnie filename-browser-browserversion.js itd
George Wilson
2
To zaskakująca odpowiedź - dzięki @Bakual i @GeorgeWilson!
codinghands
1
Nie zapominaj, że JHtml może również dołączyć sumę MD5 skryptu lub arkusza stylów do pomijania pamięci podręcznej.
Flimm
4

w dwóch słowach:

  • JHtml::script() - pozwalają na przesłonięcie określonego skryptu (oprócz tego już dołączonego do JDocument), zależą od niektórych czynników (patrz @Bakual odpowiedź);
  • $doc->addScript() - dołącz skrypt bezpośrednio do dokumentu, bez sprawdzania zastąpień;

Jeśli jesteś programistą rozszerzeń, wysoce zalecane jest użycie go JHtml::script()podczas dodawania skryptu. Pozwoli to użytkownikom zastąpić niektóre skrypty, w zależności od tego, czego chcą.
Istnieje również podobna metoda dla css.

Fedik
źródło