Переопределение метода предрасположенности контроллера ядра
Мне нужно переопределить метод предрасположенности контроллера ядра. Контроллер ядра наследует от Mage_Checkout_Controller_Action
, который сам имеет метод предрасположенности, который необходимо вызвать. Поскольку я расширяюсь от основного контроллера, который я хочу переопределить, я не могу просто вызвать parent::preDispatch()
, так как это приведет к появлению функций, которых я пытаюсь избежать.
Мой вопрос в том, как я могу вызвать переопределенный метод, который на 2 уровня выше в цепочке наследования, или я просто собираюсь сделать это неправильный путь?
Обновление
По-видимому, это работает:
Mage_Checkout_Controller_Action::preDispatch();
( несмотря на то, что этот метод не статичен, я думаю, вы каждый день узнаете что-то новое..)
Теперь мой вопрос: Есть ли лучший способ сделать это без необходимости копировать в все функции из класса, который я переопределяю?
Причина, по которой я пытаюсь это сделать, заключается в том, что я шел по этому пути, пытаясь заставить Magento запоминать назначения адресов, когда клиенты проходят проверку с несколькими отправками, а затем впоследствии уходят. (FWIW, я обнаружил, что ссылка на статью отлично подходит для того, чтобы я двигался в правильном направлении, но, похоже, многого не хватает в том, что касается шагов, которые необходимо предпринять, чтобы заставить это работать).
Контроллер, который я переопределяю, является основным контроллером Multishipping, который имеет перенаправление обратно на индексацию Multishipping, которой следует избегать. С некоторой стороны, я получил эту функциональность в основном полной, за исключением нескольких проблем (связанных с добавлением первого товара в корзину и Mage_Sales_Model_Quote_Item->getquoteitem(), возвращающих значение null в шаблоне addresses.phtml, хотя это совершенно другое обсуждение).
2 answers
Я думаю, было бы интересно точно знать, чего вы пытаетесь достичь, но я могу дать вам несколько советов, не зная подробностей:
В большинстве случаев, если метод, на который вы пытаетесь сослаться, не использует $this
, вы можете смело называть его статически:
Mage_Checkout_Controller_Action::preDispatch()
Но вам, вероятно, следует делать это через наблюдателя предрасположенности контроллера. Magento предоставляет вам возможность сделать это в 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)
);
}
// [...]
}
Все, что вам нужно сделать, это добавить полное название действия в конец из controller_action_predispatch
. Пример включения функциональности в заполнение сохранений на одной странице:
<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>
Более того, в вашем методе наблюдателя вам нужно принять наблюдателя, и вы можете получить сам контроллер из getEvent
:
<?php
class MyCompany_MyModule_Model_Observer
{
public function myPredispatchObserver($observer)
{
$controller = $observer->getEvent()->getControllerAction();
}
}
Я на своем телефоне, но я бы подумал, что вы можете использовать любое из нескольких событий, чтобы удалить перенаправление из объекта ответа.