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();)
Kontakt
E-Mail: office@neoshops.de
Tel.: +49 [0]151 7000 7107
Carmen Bremen
Magento Certified Developer
Magento Certified Solution Specialist
Magento Certified Frontend Developer
Magento Freelancer


Magento Certified Developer Magento Certified Solution Specialist Magento Certified Frontend Developer



Magento Stammtisch Köln
Magento Stammtisch KölnDer nächste Kölner Magento Stammtisch findet statt am 18. Juli 2017. (Xing Event) Wer Interesse hat, kann sich in die Stammtisch-Gruppe auf Xing eintragen, ich sende eine Rund-E-Mail mit Details kurz vor dem Event!

Kontakt

Carmen Bremen.

In: Xing
In: Skype
In: Twitter
In: Google+
Per: Formular
Innermail: Office (t) neoshops.de
In Köln: In der Lößbörde 1, 50859 Köln
Per Handy: +49 [0]151- 7000 7107

Letzte Beiträge