Magento 1: Wie überschreibe / schreibe ich eine Core-Controller-Klasse neu?

7

Hinweis : Dies ist als kanonische Frage gedacht, die ausführlich erklärt, wie das Umschreiben von Controllern funktioniert, und als doppeltes Ziel für spezifischere Fragen zu "Wie überschreibe ich Controller X" oder "Warum funktioniert mein Umschreiben nicht?" Verwendet werden kann.

Siehe auch: Auf der Suche nach kanonischen Fragen zu Magento 1-Überschreibungen

Angenommen, ich muss Änderungen an einer Core-Controller-Klasse in einem benutzerdefinierten Modul vornehmen (Methoden ändern oder Methoden hinzufügen). Wie mache ich das Schritt für Schritt?

Raphael beim digitalen Pianismus
quelle
1
Glauben Sie nicht, dass es für Magento 1 bereits viele umfassende Antworten gibt? PS Können Sie in meine letzte Frage schauen :)
Vishwas Bhatnagar
2
Ich bin mir nicht sicher, wie ich mich dabei fühle. (Was weder Verurteilung noch Bewunderung ist.)
Benmarks
1
@VishwasBhatnagar Bitte überprüfen Sie den Link in der Frage, um vollständig zu verstehen, warum solche Frage gestellt wird;)
Raphael bei Digital Pianism
@benmarks zögern Sie nicht, mich zu kontaktieren, wenn Sie eine Diskussion darüber haben möchten. Vielleicht sollte auch Fabian dabei sein
Raphael bei Digital Pianism

Antworten:

11

Es gibt mehrere Ansätze, aber ich beginne damit, dass einige häufige Missverständnisse nicht geklärt werden:

  1. Es ist nicht möglich , Controller-Klassen durch Kopieren zu überschreibenapp/code/local . Dies liegt daran, dass Controller-Klassen nicht von geladen werden Varien_Autoload, sondern die Dateien explizit enthalten sind.
  2. Es wird nicht mehr empfohlen , die <rewrite><controller><to>Syntax zu verwenden. Dies ist eine alte Technik, die seit Magento 1.3 veraltet ist (siehe: Overwriting-Controller vs. Overwriting-Action-Controller-Anforderung )

Controller-Aktionen hinzufügen / überschreiben

Verwenden Sie in Ihrer config.xml Folgendes, um einem vorhandenen Controller Controller-Aktionen hinzuzufügen:

<frontend>             <--- area (adminhtml or frontend)
    <routers>
        <checkout>     <--- front name (in admin always "adminhtml")
            <args>
                <modules>
                    <stack_checkout before="Mage_Checkout">Stack_Checkout</stack_checkout>
                                                  ^                ^
                                                  |                |
                                           module to override      |
                </modules>                 (in admin always        |
            </args>                        "Mage_Adminhtml")   your module
        </checkout>
    </routers>
</frontend>

Erstellen Sie dann einen Controller in Ihrem Modul wie z

class Stack_Checkout_OnepageController extends Mage_Core_Controller_Front_Action
{
    public function indexAction()
    {
        // here you override checkout/onepage/index
    }
    public function helloAction()
    {
        // here you create a new action checkout/onepage/hello
    }
}

Sie müssen die ursprüngliche Controller-Klasse nicht erweitern, da Magento in beiden Klassen in der durch definierten Reihenfolge angezeigt wird before="..."

Wenn Sie die ursprüngliche Klasse erweitern müssen, weil Sie andere Methoden daraus wiederverwenden möchten, müssen Sie sie einschließen (denken Sie daran, dass Controller nicht automatisch geladen werden):

require_once(Mage::getModuleDir('controllers','Mage_Checkout') . DS . 'OnepageController.php');

Verwenden Sie Beobachter, um Controller-Aktionen zu ändern

Wenn Sie keine neuen Aktionen hinzufügen , können Sie alternativ Beobachter verwenden, um das Verhalten vorhandener Aktionen zu ändern. Jede Controller-Aktion löst beispielsweise ein dynamisches "Predispatch" -Ereignis im Formular controller_action_predispatch_$FRONTNAME_$CONTROLLER_$ACTIONauscontroller_action_predispatch_checkout_onepage_index

Im Observer haben Sie Zugriff auf die Controller-Klasse selbst mit

$controller = $observer->getControllerAction();

Wenn Sie nicht möchten, dass die ursprüngliche Methode ausgelöst wird, weisen Sie Magento an, die Aktion nicht weiter auszulösen:

$controller->setFlag('', Mage_Core_Controller_Front_Action::FLAG_NO_DISPATCH, true);

Der Vollständigkeit halber: Sie können "Postdispatch" -Ereignisse auch auf ähnliche Weise verhindern, dies ist jedoch normalerweise nicht erforderlich (hier ein Beispiel, in dem es nützlich ist: XML enthält zusätzlichen Inhalt ):

$controller->setFlag('', Mage_Core_Controller_Front_Action::FLAG_NO_POST_DISPATCH);

Apropos, Sie können auch einen Beobachter hinzufügen, controller_action_postdispatch_$FRONTNAME_$CONTROLLER_$ACTIONwenn Sie zusätzliche Aktionen oder Änderungen der Antwort ausführen möchten, nachdem die ursprüngliche Aktion ausgeführt wurde.

Fabian Schmengler
quelle
3

Umschreiben:

Wenn wir Magento Core-Klassen in unserer Klasse umschreiben, schreiben wir neu.

1) Beispiel für das Umschreiben: Beim Umschreiben müssen Sie Ihre eigene Klasse erstellen und die Kernklasse erweitern. Dort können Sie Magento-Kernfunktionen oder Ihre eigene Funktion und Logik umschreiben

In Ihrer config.xml-Datei

<config>
<frontend>
    <routers>
        <tag>
            <args>
                <modules>
                    <inchoo_tag before="Mage_Tag">Inchoo_Tag</inchoo_tag>
                </modules>
            </args>
        </tag>
    </routers>
</frontend>

In Ihrer Controller-Datei

require_once(Mage::getModuleDir('controllers','Mage_Tag').DS.'TagController.php');


class Inchoo_Tag_TagController extends Mage_Tag_TagController
{
// some code
}

Bei Adminhtml

in yourconfig.xml sollte sein

<config>
<admin>
    <routers>
        <adminhtml>
            <args>
                <modules>
                    <inchoo_tag before="Mage_Adminhtml">Inchoo_Tag_Adminhtml</inchoo_tag>
                </modules>
            </args>
        </adminhtml>
    </routers>
</admin>

und Ihre Controller-Klasse sollte sein

require_once(Mage::getModuleDir('controllers','Mage_Adminhtml').DS.'TagController.php');


class Inchoo_Tag_Adminhtml_TagController extends Mage_Adminhtml_TagController
{
// some code
}

Vielen Dank für das Inchoo-Team Für diesen schönen Artikel

http://inchoo.net/magento/overriding-magento-blocks-models-helpers-and-controllers/

Murtuza Zabuawala
quelle
1
Es ist schon eine Weile her, aber ich denke, Sie können Controller-Klassendefinitionen nicht über den Codepool überschreiben.
Benmarks
Ok, ich werde meine Antwort
aktualisieren