web-dev-qa-db-fra.com

Ordre de contrôle des scripts chargés

Malheureusement, je ne peux pas m'inscrire sur le forum joomla, je vais donc faire de mon mieux ici.
S'il vous plaît aider, est-il possible de contrôler l'ordre des scripts chargés.

Exemple: dans le fichier index.php de mon modèle, je fais:

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

en tant que tout premier addScript (); Je charge donc ce script globalement pour toutes les pages.

Ensuite, dans le default.php de mon composant personnalisé, je fais:

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

d'ajouter un comportement supplémentaire pour cette vue de composant même spécifiquement.

Logiquement, je supposerais que les addScripts du fichier index.php sont d'abord ajoutés à l'objet $ doc, puis que les addScripts de la vue des composants sont ajoutés à l'objet $ doc.
Mais ce que je trouve dans la tête, c'est:

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

Cela me rend assez difficile car mon/script_a.js effectue les calculs dont dépend mon/script_b.js, l’ordre est donc crucial.

S'il vous plaît, il doit y avoir un moyen de contrôler l'ordre de chargement des scripts, sinon cette fonctionnalité est plutôt inutile, n'est-ce pas?

6
antimatter
  1. La méthode addScript de JDocument ne contient aucune option de classement (par exemple, par priorité ou quelque chose comme WP).
  2. Il existe de nombreuses façons de résoudre votre problème.

Tout d'abord , pour comprendre pourquoi ce que vous faites est à l'origine du problème, vous devez connaître le cycle de vie de Joomla.

  1. Cadre et application Bootstrap
  2. Route
  3. Composant
  4. Modules
  5. Modèle
  6. Rendre et répondre

Ainsi, lorsque vous appelez addScript dans votre modèle, il est ajouté au document après le script ajouté par votre composant.

Deuxième , aux solutions ...

  1. Si le script chargé par votre modèle n'a pas de dépendances, écrivez-le simplement au-dessus de votre

    <jdoc:include type="head" />
    
  2. Les balises head personnalisées sont chargées après les scripts. Par conséquent, dans votre composant, n'utilisez pas addScript, utilisez plutôt addCustomTag. par exemple.

    $doc->addCustomTag('<script src="my/script_b.js"></script>');
    
  3. Écrivez un plug-in système et dans la méthode onAfterRoute, commencez par charger votre script global, puis vérifiez si l'option de JInput est votre composant, puis chargez votre script de composant s'il l'est (ou simplement dans le composant tmpl, comme vous le faites déjà). ).

  4. Dans le modèle, récupérez les données de tête du JDocument et faites-le brouiller comme vous le souhaitez.

Lectures complémentaires:

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

6
jamesgarrett

Avait le même problème et est tombé sur votre post. Je l'ai corrigé dans mon modèle, fonctionne pour toutes les versions de Joomla jusqu'à 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