Bei jedem Controller wird vor dem Aufruf der Action ein PreDispatch und ein PostDispatch aufgerufen. Zwischen den beiden findet die eigentliche Aktion, also die Implementierung statt. Will man nun die weiteren Schritte im Checkout nur erlauben falls eine bestimmte Mindestmenge oder ein Mindestumsatz erfüllt ist reicht es nicht aus nur den "zur Kasse"-Button zu entfernen. Wichtig ist ebenfalls das der Checkout nicht über den Direktlink aufgerufen werden kann.
Wir hängen uns also als den PreDispatch Event des Controllers. Dazu ergänzen wir die config.xml wie folgt:
<global>
[..]
<events>
<controller_action_predispatch_checkout>
<observers>
<mindestumsatz_controller_action_predispatch_checkout>
<class>mindestumsatz/observer</class>
<method>controller_action_predispatch_checkout</method>
</mindestumsatz_controller_action_predispatch_checkout>
</observers>
</controller_action_predispatch_checkout>
</events>
[..]
</global>
Bevor nun die Action des Controllers aufgerufen wird unsere Methode controller_action_predispatch_checkout im Observer-Model aufgerufen:
<?php
class Codex_Mindestumsatz_Model_Observer {
public function controller_action_predispatch_checkout( $event ) {
$controller = $event->getControllerAction();
/* @var $controller Mage_Checkout_CartController */
if( $controller->getRequest()->getControllerName() == 'onepage' && !Mage::helper('mindestumsatz')->getIsMindestumsatz() ) {
/*
* Wenn der Mindestumsatz nicht erfüllt wurde aber der Checkout onepage aufgerufen wird
* auf den Cart-Index umleiten
*/
$controller->getResponse()->setRedirect( Mage::getUrl('*/cart') );
$controller->getResponse()->sendResponse();
$controller->getRequest()->setDispatched( true );
}
}
}
Da wir uns komplett am Modul checkout angedockt haben müssen wir nun noch abfragen ob der Controller den Namen "onepage" hat. Falls zutreffend wollen wir direkt auf den Warenkorb umleiten. Dazu holen wir uns vom Controller den Response, starten einen Redirect und sorgen, mittels setDispatched dafür das alles andere nicht weiterverarbeitet wird. Fertig, und alles ohne einen Controller Rewrite!
Update: Eine weitere (ähnliche) Möglichkeit stellt Karl Spies in seinem Blog-Beitrag vor.