Переопределение метода предрасположенности контроллера ядра


Мне нужно переопределить метод предрасположенности контроллера ядра. Контроллер ядра наследует от 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, хотя это совершенно другое обсуждение).

Author: Jeff Lambert, 2013-07-10

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();
    }
}
 8
Author: philwinkle, 2013-07-10 21:46:09

Я на своем телефоне, но я бы подумал, что вы можете использовать любое из нескольких событий, чтобы удалить перенаправление из объекта ответа.

 1
Author: benmarks, 2013-07-12 00:51:51