我需要覆盖核心控制器的偏见方法。核心控制器从 Mage_Checkout_Controller_Action, ,它本身具有需要调用的偏见方法。由于我要从我想覆盖的核心控制器延伸,所以我不能只致电 parent::preDispatch(), ,因为那将提取我要避免的功能。

我的问题是 - 如何将继承链中2个级别高2个级别称为覆盖方法,还是我只是以错误的方式进行操作?

更新

显然这有效:

Mage_Checkout_Controller_Action::preDispatch(); (即使该方法不是静态的,我想您每天都学到新的东西。)

现在我的问题是:有没有更好的方法来执行此操作,而无需复制 全部 我的班级功能?

我之所以尝试这是因为我要倒下 这条路, ,试图强迫Magento记住客户进行多层次结帐时,然后随后离开时。 (FWIW,我发现与文章的链接非常适合使我朝着正确的方向发展,但是就需要采取的步骤而言,似乎缺少很多步骤)。

我覆盖的控制器是核心的MultishippingController,其重定向回到需要避免的多式索引。在有点旁注的情况下,我已经完成了此功能大多完成,除了一些问题(与将第一项添加到购物车中,MAGE_SALES_MODEL_QUOTE_ITEM_ITEM-> getQuoteEm-> getQuoteItem()返回addresses.phtml模板中的null这是一个完全不同的讨论)。

有帮助吗?

解决方案

我认为确切知道您要完成的工作会很有趣,但是我可以在不知道细节的情况下给您一些指示:

在大多数情况下,如果您要引用的方法不使用 $this, ,您可以安全地静态地称其为:

Mage_Checkout_Controller_Action::preDispatch()

但是您可能应该通过控制器previspatch观察者来执行此操作。 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. 。脚踏板功能到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>

更重要的是,在观察者方法中,您需要接受观察者,并且可以得到控制器 本身getEvent:

<?php

class MyCompany_MyModule_Model_Observer
{

    public function myPredispatchObserver($observer)
    {
        $controller = $observer->getEvent()->getControllerAction();
    }
}

其他提示

我在手机上,但我认为您可以使用几个事件中的任何一个从响应对象中删除重定向。

许可以下: CC-BY-SA归因
scroll top