Es gibt mehrere Ansätze, aber ich beginne damit, dass einige häufige Missverständnisse nicht geklärt werden:
- Es ist nicht möglich , Controller-Klassen durch Kopieren zu überschreiben
app/code/local
. Dies liegt daran, dass Controller-Klassen nicht von geladen werden Varien_Autoload
, sondern die Dateien explizit enthalten sind.
- 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_$ACTION
auscontroller_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_$ACTION
wenn Sie zusätzliche Aktionen oder Änderungen der Antwort ausführen möchten, nachdem die ursprüngliche Aktion ausgeführt wurde.