コアコントローラーのPredispatchメソッドをオーバーライドします
-
16-10-2019 - |
質問
コアコントローラーのPredispatchメソッドをオーバーライドする必要があります。コアコントローラーは継承します Mage_Checkout_Controller_Action
, 、それ自体が呼び出される必要があるPredispatchメソッドを持っています。私はコアコントローラーから拡張しているので、私はオーバーライドしたいので、私はただ電話することはできません parent::preDispatch()
, 、それは私が避けようとしている機能を引き出すからです。
私の質問は、継承チェーンで2つのレベルが高いオーバーライドされた方法をどのように呼び出すことができますか、それとも間違った方法でこれについて進んでいますか?
アップデート
どうやらこれはうまくいきます:
Mage_Checkout_Controller_Action::preDispatch();
(その方法は静的ではありませんが、毎日新しいことを学ぶと思います。)
さて、私の質問は次のとおりです。コピーすることなくこれを行うより良い方法はありますか すべて クラスからの機能私はオーバードリングしていますか?
私がこれを試みている理由は、私がダウンしていたからです この道, 、顧客がマルチシッピングチェックアウトを行ってからその後出発したときに、Magentoにアドレス割り当てを思い出させるように強制しようとします。 (FWIW、私は私を正しい方向に進めるために素晴らしい記事にリンクされていることがわかりましたが、これを機能させるために取る必要があるステップに関しては、多くの欠けているようです)。
私がオーバーライドしているコントローラーは、避ける必要があるマルチシッピングインデックスにリダイレクトされるコアマルチシッピングコントローラーです。ややサイドノートで、私はこの機能をほぼ完全に獲得し、いくつかの問題を除いて(カートに最初のアイテムを追加し、mage_sales_model_quote_item-> getQuoteItem()addresses.phtmlテンプレートでnullを返しますが、それはまったく異なる議論です)。
解決
あなたが達成しようとしていることを正確に知ることは面白いと思いますが、詳細を知らずにいくつかのポインターを与えることができます。
ほとんどの場合、参照しようとしている方法が使用しない場合 $this
, 、安全に安全に呼ぶことができます:
Mage_Checkout_Controller_Action::preDispatch()
ただし、おそらくコントローラー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
. 。 1ページのセーブビリングへの靴座の機能の例:
<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();
}
}
他のヒント
私は電話をしていますが、いくつかのイベントのいずれかを使用して、応答オブジェクトからリダイレクトを削除できると思います。