Overriding a core controller's preDispatch method
-
16-10-2019 - |
سؤال
I need to override a core controller's preDispatch method. The core controller inherits from Mage_Checkout_Controller_Action
, which itself has a preDispatch method that needs to be called. Since I'm extending from the core controller I want to override, I cannot just call parent::preDispatch()
, since that would pull in functionality that I'm trying to avoid.
My question is - How can I call an overridden method that is 2 levels higher in the inheritance chain, or am I just going about this the wrong way?
Update
Apparently this works:
Mage_Checkout_Controller_Action::preDispatch();
(even though that method is not static, I guess you learn something new every day..)
Now my question is: Is there a better way of doing this without having to copy in all functionality from the class I am overridding?
The reason I am attempting this is because I was going down this path, attempting to force Magento to remember address assignments when customers go through multishipping checkout and then subsequently leave. (FWIW, I found the linked to article great for getting me going in the right direction, but there seems to be a lot missing as far as steps that need to be taken to get this to work).
The controller I'm overriding is the core MultiShippingController which has a redirect back to the Multishipping IndexAction that needs to be avoided. On a somewhat side-note, I have gotten this functionality mostly complete, save for a few issues (relating to the adding of the first item to the cart and the Mage_Sales_Model_Quote_Item->getQuoteItem() returning null in the addresses.phtml template, though that is an entirely different discussion).
المحلول
I think it'd be interesting to know exactly what you're trying to accomplish, but I can give you a few pointers without knowing details:
In most cases if the method you're trying to reference does not use $this
, you can safely call it statically:
Mage_Checkout_Controller_Action::preDispatch()
But you should probably be doing this via a controller predispatch observer. Magento affords you the ability to do this in 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)
);
}
// [...]
}
All you have to do is add the full action name onto the end of controller_action_predispatch
. An example of shoehorning functionality into 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>
What's more, in your observer method, you need to accept the observer and you can get the controller itself from getEvent
:
<?php
class MyCompany_MyModule_Model_Observer
{
public function myPredispatchObserver($observer)
{
$controller = $observer->getEvent()->getControllerAction();
}
}
نصائح أخرى
I'm on my phone, but I'd think that you could use any one of several events to remove the redirect from the response object.