2012-08-13 7 views
14

Últimos días como resultado de algunas quejas de clientes y discusiones con nuestros compañeros de marketing, recibí una solicitud para cambiar el comportamiento predeterminado de las opciones de productos configurables. Me pidieron que eliminara el + $ xx.xx del menú desplegable de opciones, ya que está confundiendo a los clientes/visitantes y simplemente dejo las opciones disponibles sin mostrar el cambio de precio. Lo suficientemente justo desde su punto de vista, pero es un poco complicado desde el punto de vista de los desarrolladores, creo. El sitio ejecuta Magento CE 1.6.2, y el archivo que necesitamos sobrescribir/cambiar es /public_html/js/varien/configurable.js. Necesitamos cambiar la función getOptionLabel para que no muestre el cambio de precio. Así que mi pregunta es: ¿cuál es la forma correcta de Magento para cambiar este archivo y no tocar el archivo javascript central? Gracias de antemano.Reemplazando/ampliando los archivos javascript de Magento

+0

javascript dont suport invalida. pero ver que http://stackoverflow.com/questions/5409428/how-to-override-a-javascript-function – Guerra

+0

@Guerra ¿estás seguro prototipo tiene una forma de envolver() cosas muy bien –

+0

OMI esto es un truco para simular anulaciones OOP, pero el trabajo está bien – Guerra

Respuesta

29

ver esto desde el manual prototipo http://prototypejs.org/doc/latest/language/Function/prototype/wrap/ se puede envolver cualquier método objeto e incluso llamar "padre" si es necesario y aquí está una muestra de 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

Muchas gracias Anton por su pista. Jugaré con él por la mañana y veré cómo funciona. –

+0

Para Magento 1.7 esto funciona: Product.Config.prototype.getOptionLabel = Product.Config.prototype.getOptionLabel.wrap –

+0

Supongo que depende de cómo se llaman los métodos –

26

sólo para añadir a @ Anton-s respuesta absolutamente correcta de, usted también puede hacer la clase "completa" reescribe:

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

Dado que todos esto sólo funciona en las clases de prototipo, y no en objetos ya instanciados, yo también voy a tirar en esta corte, que es más o menos lo wrap() no , también:

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

Tenga en cuenta sin embargo que el método de wrap() es más agradable, y también se puede utilizar en en las definiciones de clase o en casos concretos.

// 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

Muchas gracias Vinai y Anton S por sus valiosos consejos. Hemos cambiado nuestro hack de js temporal y ahora está hecho de la manera correcta de Magento. Eres rocas! –

+0

@MilenPetrov acepta la respuesta que te ayuda a mejorar la experiencia SO para los demás que buscan el –

+0

similar @Anton S - Realmente lo siento, me olvidé de hacer eso –

Cuestiones relacionadas