Remplacer / étendre les fichiers javascript de base de Magento

Les derniers jours à la suite de certaines plaintes et discussions avec nos clients sur le marché ont eu une demande pour modifier le comportement par défaut des options de produits configurables. Ils m'ont demandé de supprimer le + $ xx.xx de la liste déroulante des options, car il confond les clients / visiteurs et laisse les options disponibles sans afficher le changement de prix. Assez juste de leur point de vue, mais je pense que c'est un point de vue difficile pour les développeurs. Le site exécute Magento CE 1.6.2, et le fichier dont nous avons besoin pour remplacer / modifier est /public_html/js/varien/configurable.js. Nous devons modifier la fonction getOptionLabel afin qu'elle n'indique pas le changement de prix. Donc, ma question est: quel est le bon moyen de magento pour changer ce fichier et ne pas toucher le fichier javascript principal? Merci d'avance.

Consultez ceci à partir du manuel prototype http://prototypejs.org/doc/latest/language/Function/prototype/wrap/ vous pouvez envelopper n'importe quelle méthode d'objet et même appeler "parent" si nécessaire et voici un pseudo exemple:

//where Product.Config is the object/class you need to "override" Product.Config.prototype.getOptionLabel = Product.Config.prototype.getOptionLabel.wrap(function(parentMethod){ //replace the original method here with your own stuff //or call parentMethod(); if conditions don't match }); 

Juste pour ajouter à la réponse absolument correcte de @ anton-s, vous pouvez également faire des réécritures de classe "complètes":

 // Create the original class var ClassA = Class.create(); ClassA.prototype = { initialize: function(config) { this.config = config; }, test: function(msg) { console.log('Hi from class A with message ' + msg); } }; // Create new class extending the original class var ClassB = Class.create(ClassA, { // $super is a reference to the original method test: function($super, msg) { console.log('Hi from class B'); console.log('this.config is accessible in class B: ' + this.config); $super(msg + ' ...') } }); // To make the extend an override, you can do this: ClassA = ClassB; // ClassA now is ClassB overriding the original ClassA var a = new ClassA('some config data'); a.test('Call A 1'); 

Étant donné que tout cela ne fonctionne que sur des classes de prototypes, et non sur des objets déjà créés, je lancerai aussi ce hack, ce qui est à peu près ce que wrap () fait aussi:

 // Overriding a method of an already instantiated object // There are many ways to do this more elegantly thanks to the amazing JS scoping magic a.origTest = a.test; a.test = function(msg) { console.log('Hi from the patched method'); this.origTest(msg); } a.test('Call A 2'); 

Gardez à l'esprit cependant que la méthode wrap() est plus agréable et peut également être utilisée sur les définitions de classe ou sur des instances concrètes.

 // Wrap method of concrete instance spConfig.getOptionLabel = spConfig.getOptionLabel.wrap(function(parentMethod, option, price) { return parentMethod(option, price); }); // Wrap method of class declaration Product.Config.prototype.getOptionLabel = Product.Config.prototype.getOptionLabel.wrap(function(parentMethod, option, price) { return parentMethod(option, price); });