Blog
Magento – Warum man bestimmte Klassen nicht überschreiben kann
In diesem Beitrag soll es nicht um abstrakte Klassen gehen. Wer aber hier gegooglegelandet ist, weil er versucht, eine abstrakte Klasse in Magento zu überschreiben, für den gibt es denn doch einen Satz dazu:
Es gibt keine Möglichkeit eine abstrakte Klasse (hier nennen wir sie Foo) in Magento zu überschreiben. Wenn andere Klassen (nennen wir sie Bar und Pub) von Foo abgeleitet sind, und man möchte nun eigentlich Foo erweitern, damit sowohl Bar, als auch Pub über neue oder geänderte Methoden verfügen, so geht das nur, indem man Bar und Pub überschreibt.
In diesem Beitrag soll es aber nicht um eine abstrakte Klasse gehen, sondern um ein anderes Phänomen am Beispiel der Klasse:
Mage_Payment_Block_Form_Container
Diese Klasse ist nicht abstrakt, sondern eigentlich eine nette, normale Blockklasse, der man zum Beispiel begegnet, wenn man die Payment-Methods im Checkout bearbeiten möchte.
Diese Klasse kann man nicht überschreiben. Das glaubt man nun zunächst nicht… und starrt hinlänglich auf xml, das einfach nur korrekt aussieht.
<blocks> <paymentmethods> <class>NameSpace_ModulName_Block</class> </paymentmethods > <payment> <rewrite> <form_container> NameSpace_ModulName_Block_Form_Container </form_container> </rewrite> </payment> </blocks>
Mir ging es im Speziellen um das Überschreiben der Methode getMethods(), weil ich bestimmte Payment-Methoden aufgrund bestimmter Produkte im Warenkorb ausschließen wollte.
public function getMethods() { $methods = $this->getData('methods'); if (is_null($methods)) { $quote = $this->getQuote(); $store = $quote ? $quote->getStoreId() : null; $methods = $this->helper('payment')->getStoreMethods($store, $quote); $total = $quote->getBaseSubtotal(); foreach ($methods as $key => $method) { if ($this->_canUseMethod($method) && ($total != 0 || $method->getCode() == 'free' || ($quote->hasRecurringItems() && $method->canManageRecurringProfiles()))) { $this->_assignMethod($method); } else { unset($methods[$key]); } } $this->setData('methods', $methods); } return $methods; }
Der Grund:
Der Block Mage_Payment_Block_Form_Container wird bereits von der Klasse Mage_Checkout_Block_Onepage_Payment_Methods beerbt.
class Mage_Checkout_Block_Onepage_Payment_Methods extends Mage_Payment_Block_Form_Container
Magento berücksichtigt beim Aufbau des Checkouts daher nicht direkt den Block Mage_Payment_Block_Form_Container auf, sondern Mage_Checkout_Block_Onepage_Payment_Methods, daher nützt das Überschreiben des From_Containers auch nichts.
Die Lösung daher:
Überschreiben des Blocks Mage_Checkout_Block_Onepage_Payment_Methods und dort die Methode getMethods() einfügen und nach seinen individuellen Bedürnissen anpassen.
Und der Vollständigkeit halber: der Aufruf der Methode erfolgt im Template-Block:
/app/design/frontend/default/meintheme/template/checkout/onepage/payment/methods.phtml ($methods = $this->getMethods();)
Neueste Kommentare