Was ist der Unterschied zwischen JHtml: script () und $ doc-> addScript?

10

Ich habe kürzlich ein Modul entwickelt, bei dem bestimmte JS- und CSS-Dateien in <head>jede Seite eingefügt werden müssen. Anfangs habe ich verwendet:

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

Ich habe jedoch festgestellt, dass die Site beim Aktivieren des Caching sowohl eine zwischengespeicherte /cacheals auch eine nicht zwischengespeicherte Version von geladen hat /modules/mod_x/js/, was zu JS-Fehlern führte.

Als ich das geändert habe in:

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

Das Skript wurde nur einmal aus dem Cache geladen, um diese Fehler zu beheben.

Ich habe in den Dokumenten gelesen, dass die addScriptMethode "niedriger" als die JHtml:scriptMethode war, aber darüber hinaus ...

Natürlich müssen Sie auch einige der Schritte [die JHtml: script für Sie ausführt] manuell codieren, die automatisch mit der obigen [JHtml: script-Methode] ausgeführt werden [wenn Sie addScript verwenden].

... es werden keine weiteren Details angegeben.

Was ist der Unterschied? Ich gehe davon aus, dass JHtml:scriptirgendwann addScriptein Dokumentobjekt aufgerufen wird, aber werden zuerst andere Zwischenschritte unternommen?

Codierungshände
quelle
4
Ich habe die Joomla-Dokumente ein wenig umgeschrieben, um sie zu aktualisieren. Sehen Sie, ob sie jetzt sinnvoller sind?
George Wilson
1
@ GeorgeWilson Die Joomla-Dokumente haben sich in letzter Zeit wirklich verbessert. Danke :)
TryHarder
Verwandte Frage zu Stylesheets: joomla.stackexchange.com/q/10062/5239
Flimm

Antworten:

8

JHtml::scripthat zusätzliche Logik enthalten. Die API-Referenz finden Sie unter http://api.joomla.org/cms-3/classes/JHtml.html#method_script

Standardmäßig erkennt es die Debug-Einstellung und den verwendeten Browser und lädt das passende Skript. Wenn beispielsweise das Debuggen aktiviert ist, wird eine nicht komprimierte Version der Datei geladen, falls vorhanden.

Es gibt optionale Einstellungen, mit denen die Datei auf Vorlagenebene überschrieben werden kann.

Michael Babker hat eine gute Anleitung JHtml::script()zum Zulassen von Überschreibungen geschrieben: http://www.babdev.com/blog/139-use-the-media-folder-allow-overridable-media

Funktion im Repo als Referenz: https://github.com/joomla/joomla-cms/blob/staging/libraries/cms/html/html.php#L659

Offizielle Dokumentseite, die jetzt von George aktualisiert wird: http://docs.joomla.org/J3.3:Adding_JavaScript_and_CSS_to_the_page

Bakual
quelle
2
Danke für die Antwort. Die API-Referenz ist ziemlich knapp - gibt es eine umfassendere Erklärung der Auswirkungen von Detect_Browser und Detect_Debug, und wenn Sie "optionale Einstellungen" und "andere Dinge" sagen, werden diese irgendwo dokumentiert?
Codinghands
Ich habe einen Link zu einem Artikel von Michael hinzugefügt, der den Override-Teil erklärt. Was den Debug- und Browserteil betrifft, glaube ich nicht, dass es eine Dokumentation gibt. Sie müssten den Code dafür lesen.
Bakual
1
Wenn also beispielsweise eine unkomprimierte und komprimierte js-Datei vorhanden ist und das Debugging aktiviert ist, werden die Dateinamen-unkomprimiert.js und nur die Dateinamen.js geladen, wenn das Debugging deaktiviert ist. Für den Browser sucht er beim Debuggen nach Dateiname-browser.js, dann nach Dateiname-browser-browserversion.js usw.
George Wilson
2
Dies ist eine knackige Antwort - danke @Bakual und @GeorgeWilson!
Codinghands
1
Vergessen Sie nicht, dass JHtml auch die MD5-Summe eines Skripts oder Stylesheets an den Cache-Bust anhängen kann.
Flimm
4

in zwei Worten:

  • JHtml::script() - Sie können das spezifische Skript überschreiben (mit Ausnahme des bereits an JDocument angehängten Skripts), das von einigen Faktoren abhängt (siehe @ Bakual-Antwort).
  • $doc->addScript() - Skript direkt an das Dokument anhängen, ohne eine Überschreibung zu überprüfen;

Wenn Sie der Erweiterungsentwickler sind, wird die Verwendung JHtml::script()beim Hinzufügen des Skripts dringend empfohlen . Auf diese Weise können Ihre Benutzer einige bestimmte Skripts überschreiben, je nachdem, was sie möchten.
Auch gibt es ähnliche Methode für CSS.

Fedik
quelle