it-swarm.com.de

Kontrollieren Sie die Reihenfolge der geladenen Skripte

Leider kann ich mich nicht im Joomla-Forum registrieren, deshalb werde ich hier mein Bestes geben.
Bitte helfen Sie, gibt es eine Möglichkeit, die Reihenfolge der geladenen Skripte zu steuern.

Beispiel: in der index.php meiner Vorlage mache ich:

$doc->addScript('my/script_a.js');

als allererstes addScript (); Deshalb lade ich dieses Skript global für alle Seiten.

Dann mache ich in der default.php meiner benutzerdefinierten Komponente:

$doc->addScript('my/script_b.js');

um speziell für diese Komponentenansicht zusätzliches Verhalten hinzuzufügen.

Logischerweise würde ich annehmen, dass die addScripts in der index.php zuerst zum $ doc-Objekt hinzugefügt werden und danach die addScripts in der Komponentenansicht an das $ doc-Objekt angehängt werden.
Aber was ich im Kopf habe, ist:

<script src="my/script_b.js"></script>
<script src="my/script_a.js"></script>

Dies nervt mich ziemlich, da meine/script_a.js Berechnungen durchführt, von denen meine/script_b.js abhängt, daher ist die Reihenfolge entscheidend.

Bitte, es muss eine Möglichkeit geben, die Reihenfolge des Ladens von Skripten zu kontrollieren, sonst ist diese Funktion ziemlich sinnlos, nicht wahr?

6
antimatter
  1. Die addScript-Methode von JDocument hat keine Bestelloptionen (z. B. nach Priorität oder so ähnlich wie WP).
  2. Es gibt zahlreiche Möglichkeiten, um Ihr Problem zu lösen.

Um zu verstehen, warum das, was Sie tun, das Problem verursacht, müssen Sie zunächst den Joomla-Lebenszyklus kennen.

  1. Bootstrap Framework & Anwendung
  2. Route
  3. Komponente
  4. Module
  5. Vorlage
  6. Rendern und antworten

Wenn Sie also addScript in Ihrer Vorlage aufrufen, wird es dem Dokument nach dem von Ihrer Komponente hinzugefügten Skript hinzugefügt.

Zweitens zu den Lösungen ...

  1. Wenn das von Ihrer Vorlage geladene Skript keine Abhängigkeiten aufweist, schreiben Sie es einfach in die Zeile über Ihre

    <jdoc:include type="head" />
    
  2. Benutzerdefinierte Head-Tags werden nach den Skripten geladen, sodass in Ihrer Komponente kein addScript verwendet wird. Verwenden Sie stattdessen addCustomTag. z.B.

    $doc->addCustomTag('<script src="my/script_b.js"></script>');
    
  3. Schreiben Sie ein System-Plugin und laden Sie in der onAfterRoute-Methode zuerst Ihr globales Skript und prüfen Sie dann, ob die Option in JInput Ihre Komponente ist und laden Sie dann Ihr Komponentenskript, falls dies der Fall ist (oder laden Sie es einfach in Ihre Komponente tmpl, wie Sie es bereits tun) ).

  4. Holen Sie sich in der Vorlage die Kopfdaten aus dem JDocument und rauschen Sie sie, wie immer Sie möchten.

Weitere Lektüre:

https://github.com/joomla/joomla-cms/blob/staging/libraries/src/Document/HtmlDocument.php

6
jamesgarrett

Hatte das gleiche Problem und bin auf deinen Beitrag gestoßen. Ich habe es in meiner Vorlage behoben, funktioniert für alle Joomla-Versionen bis 3.9.

$doc = JFactory::getDocument();
foreach ($doc->_scripts AS $script => $options) {
    if (strpos($script, 'com_your_component') === false) break;
    $doc->_scripts[$script] = array_shift($doc->_scripts);
}
0
Thalueng