Letzte Tage als Ergebnis einiger Kundenbeschwerden und Diskussion mit unseren Marketing-Jungs Ich habe eine Anfrage, das Standardverhalten der konfigurierbaren Produkte Optionen zu ändern. Sie haben mich gebeten, das + $ xx.xx aus dem Drop-down-Menü Optionen zu entfernen, da es die Kunden/Besucher verwirrt und die verfügbaren Optionen einfach belässt, ohne die Preisänderung anzuzeigen. Fair genug aus ihrer Sicht, aber es ist ein bisschen schwierig aus Sicht der Entwickler denke ich. Auf der Site wird Magento CE 1.6.2 ausgeführt, und die Datei, die wir überschreiben/ändern müssen, ist /public_html/js/varien/configurable.js. Wir müssen die Funktion getOptionLabel darin ändern, damit die Preisänderung nicht angezeigt wird. Also meine Frage ist: Was ist der richtige Magento Weg, um diese Datei zu ändern und nicht die Kern-Javascript-Datei zu berühren? Vielen Dank im Voraus.Überschreiben/Erweitern der Magento-Kern Javascript-Dateien
Antwort
das Sehen von Prototyp Handbuch http://prototypejs.org/doc/latest/language/Function/prototype/wrap/ Sie unabhängig von Objektmethode wickeln können und rufen sogar „Eltern“ benötigt, wenn und hier ist ein Pseudo-Beispiel:
//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
});
Vielen Dank Anton für Ihren Hinweis. Ich werde morgens damit spielen und sehen, wie es funktioniert. –
Für Magento 1.7 funktioniert das: Product.Config.prototype.getOptionLabel = Product.Config.prototype.getOptionLabel.wrap –
rate es hängt davon ab, wie Methoden benannt werden –
Gerade @ anton-s ist absolut richtige Antwort an, Sie kann auch „voll“ Klasse tun umschreibt: auf alle funktioniert dies nur auf Prototyp-Klassen, nicht bereits instanziiert Objekte
// 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');
Da werde ich auch in diesem Hack werfen, was ziemlich viel ist, was Wrap() gibt auch:
// 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');
Beachten Sie aber, dass die wrap()
Methode ist schöner, und kann auch auf Klassendefinitionen oder auf konkrete Instanzen verwendet werden.
// 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);
});
Vielen Dank Vinai und Anton S für Ihre wertvollen Hinweise. Wir haben unseren temporären js-Hack geändert und jetzt ist es in der richtigen Magento-Art gemacht. Du bist Felsen! –
@MilenPetrov akzeptieren Sie die Antwort, die Ihnen hilft, die SO-Erfahrung für andere zu verbessern, die ähnliche suchen –
@Anton S - Tut mir leid, dass ich vergessen habe, das zu tun –
javascript nicht unterstützen overrides. aber sehen, dass http://stackoverflow.com/questions/5409428/how-to-override-a-javascript-function – Guerra
@Guerra sind Sie sicher, Prototyp hat eine Art, die Dinge zu umwickeln() –
schön IMO dieser ist ein Hack, um OOP Overrides zu simulieren, aber die Arbeit ist gut – Guerra