2012-08-13 16 views
14

Ultimi giorni a seguito di alcuni reclami e discussioni con i nostri ragazzi del marketing, ho ricevuto una richiesta di modifica del comportamento predefinito delle opzioni dei prodotti configurabili. Mi hanno chiesto di rimuovere + $ xx.xx dal menu a discesa delle opzioni poiché confonde i clienti/visitatori e lascia le opzioni disponibili senza visualizzare la variazione di prezzo. Giusto abbastanza dal loro punto di vista, ma è un po 'complicato dal punto di vista degli sviluppatori, credo. Il sito utilizza Magento CE 1.6.2 e il file che dobbiamo sovrascrivere/modificare è /public_html/js/varien/configurable.js. Abbiamo bisogno di cambiare la funzione getOptionLabel in modo che non mostri la variazione di prezzo. Quindi la mia domanda è: qual è il modo giusto in Magento per cambiare questo file e non toccare il file javascript principale? Grazie in anticipo.Sovrascrittura/estensione dei file javascript di Magento core

+0

javascript non sovrascrivere suport. ma vedere che http://stackoverflow.com/questions/5409428/how-to-override-a-javascript-function – Guerra

+0

@Guerra sei sicuro prototipo è un modo per avvolgere() cose ben –

+0

IMO questo è un trucco per simulare l'override di OOP, ma funziona bene – Guerra

risposta

29

Vedere questo da manuale prototipo http://prototypejs.org/doc/latest/language/Function/prototype/wrap/ si può avvolgere qualsiasi metodo oggetto e anche chiamare "padre", se necessario, ed ecco un esempio di pseudo:

//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 
}); 
+0

Grazie mille Anton per il tuo suggerimento. Ci giocherò la mattina e vedrò come si comporta. –

+0

Per Magento 1.7 funziona: Product.Config.prototype.getOptionLabel = Product.Config.prototype.getOptionLabel.wrap –

+0

suppongo che dipenda dal modo in cui i metodi sono denominati –

26

solo per aggiungere a @ Anton-s risposta assolutamente corretto di, è può anche fare "pieno" di classe riscrive:

// 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'); 

Poiché tutti questo funziona solo su classi di prototipo, non su oggetti già istanziati, sarò anche gettare in questo hack, che è più o meno quello involucro() fa anche:

// 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'); 

Occorre tuttavia tenere presente che il metodo wrap() è più bello, e può anche essere utilizzato su sulle definizioni di classe o su casi concreti.

// 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); 
}); 
+2

Grazie mille Vinai e Anton S per i vostri preziosi suggerimenti. Abbiamo cambiato il nostro js ha temporaneo e ora è fatto nel modo giusto Magento. Sei rocce! –

+0

@MilenPetrov accetta la risposta che ti aiuta a migliorare l'esperienza SO per gli altri che cercano lo stesso –

+0

@Anton S - Davvero dispiaciuto che mi sono dimenticato di farlo –

Problemi correlati