web-dev-qa-db-fra.com

Remplacer les scripts.js d'un modèle Joomla

Je travaille dans Joomla! 3.4.8.

... oui, comment puis-je remplacer les templates/my_template/scripts.js?

...

PDATE. Je parle d'un modèle frontal, un modèle de site.

J'ai acheté un modèle dans Themeforest. Le modèle a un fichier dans templates/my_template/js/scripts.js.

Le problème est évident. Si à l'avenir je mets à jour le modèle, toutes mes modifications seront perdues. :(

1
George Berkeley

édité

La manière dont vous allez y parvenir dépendra de la portée de l'objet de script.

Recherchez dans le fichier de scripts la fonction exécutée lorsque la fenêtre est chargée. Il devrait commencer par:

window.onload = function...

ou

window.addEventListener("load"...

Le contenu de cette fonction dépendra entièrement de la manière dont les développeurs de modèles ont codé le script. Par conséquent, je ne peux que vous donner des indications approximatives à partir d’ici.

Vous devez connaître le nom de l'objet conteneur principal du script. Cela s'appelle probablement quelque chose comme 'themeForest'. Vous cherchez quelque chose comme:

var themeForest = new ThemeForest

ou (comme cela a probablement été construit avec un gestionnaire de paquets JS), par exemple:

var themeForest = __webpack_require__(391);

L'implémentation exacte sera différente.

Maintenant, vous voulez que cet objet soit disponible dans la portée globale . Ainsi, en utilisant les exemples ci-dessus, ils ressembleraient à ceci:

var themeForest = window.themeForest = new ThemeForest

ou

var themeForest = window.themeForest = __webpack_require__(391);   

Le bit important est de s’assurer que le script est transformé en une propriété de l’objet window . Si window.themeForest Existe déjà, alors excellent, il est déjà disponible dans le champ d'application global. Sinon, ajoutez-le comme je l'ai fait ci-dessus.

Vous devriez maintenant pouvoir remplacer toutes les méthodes, fonctions et variables individuelles en les réaffectant dans votre script de substitution. Supposons qu'il existe une méthode appelée init() que vous souhaitez remplacer. Dans votre script, ajoutez:

window.themeForest.init = function() {
    // Function contents
}

Assurez-vous que votre script est chargé dans votre modèle après le fichier scripts.js du modèle.

Toutes les autres propriétés themeForest resteront telles quelles, mais la propriété init sera désormais votre fonction.

Vous pouvez également ajouter ceci en haut de votre script pour accélérer la redéclarage des choses:

window.themeForest = themeForest

Maintenant, l'exemple de substitution que j'ai donné ci-dessus ressemblerait à ceci:

themeForest.init = function() {
    // Function contents
}

J'espère que cela ne m'aidera pas. Je ne peux vraiment pas donner de réponse plus précise sans savoir exactement comment fonctionne le script du modèle.

2
chrBrd

Cela dépend de la façon dont ce js est inclus dans la tête. Et sur la base du chemin, je pense que c'est simple JDocument->addScript Qui n'implémente pas la logique de priorité.

Sur cette base, dans la situation donnée, je vous suggèrerais de créer un plug-in système qui capture onBeforeCompileHead() et supprime ce scripts.js Du tableau scripts, et en ajoute simplement un qui vous avez besoin de [votre dérogation].

1
Alexandr

L'idée de @Alexandr de créer un plug-in pour supprimer les scripts est une bonne idée - cela dépend bien sûr de la façon dont les développeurs de modèles effectuent l'appel.

Un autre moyen simple que je fais parfois consiste à modifier légèrement le fichier index.php du modèle, puis à charger tous les fichiers js ou css de mon choix, comme je le souhaite.

Il suffit de trouver les appels aux fichiers js et de les commenter - puis incluez les vôtres.

Il ne s’agit généralement que de quelques lignes de modification qui peuvent être facilement conservées lors d’une mise à jour ultérieure.

0
FFrewin