コアコントローラーのpreDispatchメソッドのオーバーライド


7

コアコントローラーのpreDispatchメソッドをオーバーライドする必要があります。コアコントローラーはから継承しますMage_Checkout_Controller_Action。これには、呼び出す必要のあるpreDispatchメソッドがあります。オーバーライドしたいコアコントローラーから拡張しているため、を呼び出すだけではできませんparent::preDispatch()。これは、回避しようとしている機能を取り込むためです。

私の質問は-継承チェーンで2レベル高いオーバーライドされたメソッドを呼び出すにはどうすればよいですか、またはこれを間違った方法で行っているのですか?

更新

どうやらこれは動作します:

Mage_Checkout_Controller_Action::preDispatch(); (その方法は静的ではありませんが、毎日新しいことを学んでいると思います。)

今私の質問は:私がオーバーライドしているクラスからすべての機能をコピーする必要なしにこれを行うより良い方法はありますか?

私がこれを試みた理由は、顧客がマルチシッピングチェックアウトを行った後にMagentoにアドレス割り当てを記憶させ、その後に去ろうとしたため、この道を進んでいたためです。(FWIW、私は正しい方向に進むためにリンクされた記事が素晴らしいことを発見しましたが、これを機能させるために実行する必要がある手順に関しては多くの欠けているようです)。

私がオーバーライドしているコントローラーは、回避する必要があるMultishipping IndexActionへのリダイレクトを持つコアMultiShippingControllerです。少し補足すると、私はこの機能をほぼ完全に取得しましたが、いくつかの問題を除いて(カートへの最初のアイテムの追加とMage_Sales_Model_Quote_Item-> getQuoteItem()がaddresses.phtmlテンプレートでnullを返すことに関して)、それは完全に異なる議論です)。


1
他の誰かが後でこれにぶらついて、(どうやら)静的構文がどのように/なぜ動作しているのか疑問に思っている場合に備えて。それを非常によく説明するこのStackOverflowの回答を紹介します。つまり、parent::someMethod()静的ではないように「静的」ではなく$this、現在のクラスのインスタンスの適切なコンテキストでメソッドを呼び出す前に、トラバースする継承ツリーの一部を指定します。
ブライアン

回答:


8

あなたが何を成し遂げようとしているのかを正確に知ることは興味深いと思いますが、詳細を知らなくてもいくつかのヒントを与えることができます。

ほとんどの場合、参照しようとしているメソッドがを使用しない場合は$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。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();
    }
}

1
洞察をありがとう。なぜこれをしているのかという質問を更新しました。
ジェフランバート

1

私は電話をかけていますが、いくつかのイベントのいずれかを使用して、応答オブジェクトからリダイレクトを削除できると思います。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.