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?
module
magento-1
overrides
controllers
Raphael beim digitalen Pianismus
quelle
quelle
Antworten:
Es gibt mehrere Ansätze, aber ich beginne damit, dass einige häufige Missverständnisse nicht geklärt werden:
app/code/local
. Dies liegt daran, dass Controller-Klassen nicht von geladen werdenVarien_Autoload
, sondern die Dateien explizit enthalten sind.<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:
Erstellen Sie dann einen Controller in Ihrem Modul wie z
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):
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_$ACTION
auscontroller_action_predispatch_checkout_onepage_index
Im Observer haben Sie Zugriff auf die Controller-Klasse selbst mit
Wenn Sie nicht möchten, dass die ursprüngliche Methode ausgelöst wird, weisen Sie Magento an, die Aktion nicht weiter auszulösen:
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 ):
Apropos, Sie können auch einen Beobachter hinzufügen,
controller_action_postdispatch_$FRONTNAME_$CONTROLLER_$ACTION
wenn Sie zusätzliche Aktionen oder Änderungen der Antwort ausführen möchten, nachdem die ursprüngliche Aktion ausgeführt wurde.quelle
Umschreiben:
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
In Ihrer Controller-Datei
Bei Adminhtml
in yourconfig.xml sollte sein
und Ihre Controller-Klasse sollte sein
Vielen Dank für das Inchoo-Team Für diesen schönen Artikel
http://inchoo.net/magento/overriding-magento-blocks-models-helpers-and-controllers/
quelle