Frage

Ich muss die Prädispatch -Methode eines Core Controllers überschreiben. Der Kerncontroller erbt von Mage_Checkout_Controller_Action, was selbst eine Prädispatch -Methode hat, die aufgerufen werden muss. Da ich mich vom Kerncontroller ausziehe, den ich überschreiben möchte, kann ich nicht einfach anrufen parent::preDispatch(), da dies die Funktionalität, die ich vermeiden versuche, zu einer Funktionalität bringen würde.

Meine Frage ist: Wie kann ich eine überschriebene Methode nennen, die in der Erbschaftskette um zwei Stufen höher ist, oder mache ich das nur falsch?

Aktualisieren

Anscheinend funktioniert das:

Mage_Checkout_Controller_Action::preDispatch(); (Obwohl diese Methode nicht statisch ist, lernen Sie jeden Tag etwas Neues.)

Jetzt ist meine Frage: Gibt es eine bessere Möglichkeit, dies zu tun, ohne einkopieren zu müssen? alle Funktionalität aus der Klasse, die ich überschreibe?

Der Grund, warum ich dies versuche, ist, dass ich untergegangen bin dieser Pfad, Versuch, Magento zu zwingen, sich an Adressaufträge zu erinnern, wenn Kunden eine mehrstufige Kasse durchlaufen und anschließend abreisen. (FWIW, ich fand den verknüpften Artikel hervorragend, um mich in die richtige Richtung zu bringen, aber es scheint viel zu fehlen, wenn Schritte unternommen werden müssen, um dies zum Laufen zu bringen).

Der Controller, den ich überschreibe, ist der Kern -MultishipingController, der eine Umleitung zur Multishipping -Indexaktion hat, die vermieden werden muss. Auf einer etwas Seitenstart habe ich diese Funktionalität größtenteils abgeschlossen, abgesehen von einigen Problemen (in Bezug auf das Hinzufügen des ersten Elements zum Warenkorb und die mage_sales_model_quote_item-> getQuoteItem (), die Null in der adress.phtml-Vorlage zurückgibt, obwohl, obwohl Das ist eine völlig andere Diskussion).

War es hilfreich?

Lösung

Ich denke, es wäre interessant zu wissen, was Sie erreichen möchten, aber ich kann Ihnen ein paar Hinweise geben, ohne Details zu kennen:

In den meisten Fällen, in denen die Methode, die Sie zu referenzieren möchten, nicht verwendet $this, Sie können es sicher statisch nennen:

Mage_Checkout_Controller_Action::preDispatch()

Aber Sie sollten dies wahrscheinlich über einen Controller Predispatch Observer tun. Magento bietet Ihnen die Fähigkeit, dies zu tun Mage_Core_Controller_Varien_Action:

abstract class Mage_Core_Controller_Varien_Action
{
    // [...]
    public function preDispatch()
    {
        // [...]
        if ($this->_rewrite()) {
            return; // [What is the purpose if this?]
        }
        // [...]

        // [This is where my event needs to be firing, but this code never gets 
        // executed because the controller is rewritten]
        Mage::dispatchEvent(
            'controller_action_predispatch_'.$this->getFullActionName(),
            array('controller_action'=>$this)
        );

    }
    // [...]
}

Alles, was Sie tun müssen, ist den vollständigen Aktionsnamen zum Ende von hinzuzufügen controller_action_predispatch. Ein Beispiel für Schuhfunktionen in Onepage SaveBilling:

    <events>
        <controller_action_predispatch_checkout_onepage_saveBilling>
            <observers>
                <some_unique_name_for_this_event>
                    <class>yourmodel/observer</class>
                    <method>myPredispatchObserver</method>
                </some_unique_name_for_this_event>
            </observers>
        </controller_action_predispatch_checkout_onepage_saveBilling>
    </events>

Darüber hinaus müssen Sie in Ihrer Beobachtermethode den Beobachter akzeptieren und den Controller erhalten selbst aus getEvent:

<?php

class MyCompany_MyModule_Model_Observer
{

    public function myPredispatchObserver($observer)
    {
        $controller = $observer->getEvent()->getControllerAction();
    }
}

Andere Tipps

Ich bin auf meinem Telefon, aber ich würde denken, dass Sie eines von mehreren Ereignissen verwenden können, um die Umleitung aus dem Antwortobjekt zu entfernen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit magento.stackexchange
scroll top